vxworks---多任务(1)

    xiaoxiao2024-04-18  5

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

    转载请注明原文地址: https://ju.6miu.com/read-1288101.html
    最新回复(0)