vxworks---多任务(1)

来源:互联网 发布:淘宝 自带 库存管理 编辑:程序博客网 时间:2024/05/29 21:18

1 多任务和上下文的概念

     系统经过启动过程,硬件和上层软件组件的初始化完成后,系统进入多任务运行环境。系统中最基本的执行线程单位为任务和中断。任务由操作系统内核调度执行。中断由硬件异步触发,进入中断服务程序。系统存在多个任务,包括vxworks基本的系统任务和用户自己定义的任务,所有任务统一地址空间,都运行在CPU

最高级别的系统模式(具有更好的系统性能)。

        在系统运行时,除了任务、中断这样的动态运行对象外,还存在一些静态的对象,如:调度机制、任务间通信机制、内存管理机制和输入输出系统机制。静态对象没有自主的执行线程,总处于被动的被调用状态。任务是一个动态的抽象的概念,可在运行时删除和创建,是多任务环境中最基本的执行单元。每个创建的任务都对应一个内核分配的数据结构,即任务控制块(TCB),用以保存关键的动态信息。每个任务都拥有自己的上下文,即拥有各自的CPU环境和系统资源,在上下文切换时,上下文保存在TCB中,TCB是vxworks中最重要的数据结构。任务上下文包括:

.任务的执行点,即任务的程序计数器(PC),程序计数器表示任务切换时正运行的代码位置

.动态变量和函数调用所需的堆栈;

.IO操作分配的标准输入、标准输出和标准错误输出操作;

.一个延时和时间片定时器;

.信号句柄,用于调试和性能监视的值。

上下文是系统运行的环境。当系统调度新的任务时,需要进行上下文切换,保存旧的上下文信息,恢复新的上下文。

2 消息队列 

为允许合作任务间的互相通信,需要一种更高级的机制来满足要求,在vxworks操作系统中,单个CPU任务间的通信方式主要是使用消息队列。

多个任务能够向一个消息队列发送和接受消息。两个任务间的全双工通信一般需要两个消息队列,每个方向一个消息队列。如下表所示是消息队列的建立 删除 发送和接受的函数列表。

                           表 wind消息队列控制函数

调用
描述msgQcreate( )创建并初始化一个消息队列msgQdelete( )终止并释放一个消息队列msgQsend( )向一个消息队列发送一个消息msgQreceive( )从一个消息队列接受一个消息msgQsend( ) 和 magQreceive( )可以设置超时时间参数,发送超时是指在没有可用空间进行消息排队时,从缓冲空间等到其可以使用时需要的tick长度。超时时间可以设置为特殊值 NO_WAUTE,不等待立即返回,WAITE_FOREVER 一直等待。msgQsend()可以指定所发送消息的紧急情况为优先级参数,MSG_PRI_NORMAL 为正常,MSG_PRI_URGENT紧急。

举个栗子程序:任务1创建消息队列并发送消息,任务2接受消息队列中的消息


#define   MAX_MSG_LEN  100  //每个消息的最大长度#define MAX_MSG_NUM 10 //可以排队的最大消息数目 int myMsgQid; //消息ID号task1(void){#define message "1234567"if( (myMsgQid = msgQcreate( MAX_MSG_NUM ,  MAX_MSG_LEN , WAIT_FOREVER) )== ERROR)return error;if(  msgQsend(myMsgQid, message ,  sizeof(message ), WAIT_FOREVER) == NULL)return error;}task2 (void){char msgBuff[  MAX_MSG_LEN];if( msgQreceive( myMsgQid, msgBuff,  MAX_MSG_LEN ,WAIT_FOREVER  )  == ERROR )return error;}




0 0
原创粉丝点击