vxworks---多任务(1)

简介: vxworks---多任务(1)

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;
}
目录
相关文章
|
20天前
|
缓存 算法 Linux
Linux内核的心脏:深入理解进程调度器
本文探讨了Linux操作系统中至关重要的组成部分——进程调度器。通过分析其工作原理、调度算法以及在不同场景下的表现,揭示它是如何高效管理CPU资源,确保系统响应性和公平性的。本文旨在为读者提供一个清晰的视图,了解在多任务环境下,Linux是如何智能地分配处理器时间给各个进程的。
|
存储 缓存 Linux
线程概念与控制【Linux】
线程概念与控制【Linux】
80 0
|
7月前
|
算法 API 调度
【FreeRTOS】多任务创建
【FreeRTOS】多任务创建
|
7月前
|
存储 监控 Linux
Linux 使用getrusage系统调用获取cpu信息:一个C++实例分析
Linux 使用getrusage系统调用获取cpu信息:一个C++实例分析
143 0
|
存储 算法 调度
FreeRTOS多任务系统
FreeRTOS多任务系统
140 0
|
存储 算法 搜索推荐
操作系统实验四:进程调度
操作系统实验四:进程调度
160 0
|
存储 Shell Linux
实验 Linux Shell实现模拟多进程并发执行【操作系统】
实验 Linux Shell实现模拟多进程并发执行【操作系统】
260 0
|
Linux 索引
Keil自带的操作系统RTX内核---内存管理分析
Keil自带的操作系统RTX内核---内存管理分析
|
算法 调度 索引
【操作系统】第七章:进程管理(Part1:进程的概念)
【操作系统】第七章:进程管理(Part1:进程的概念)
155 0
vxworks 多核系统中指定任务在某个核上运行
vxworks 多核系统中指定任务在某个核上运行
281 0

相关课程

更多