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; }