【第6章】vxworks嵌入式操作系统.ppt
《【第6章】vxworks嵌入式操作系统.ppt》由会员分享,可在线阅读,更多相关《【第6章】vxworks嵌入式操作系统.ppt(154页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、【第6章】VxWorks嵌入式操作系统邹昕光哈尔滨工业大学自动化测试与控制研究所2011课程内容5.1 任务的管理5.2 任务间通信5.3 其他系统服务5.1 任务的管理每个任务都有自己的上下文(context),包括CPU的执行环境和系统执行时需要的资源。VxWorks的任务context保存在任务的TCB(Task Control Block)中。TCB是一个内核对象,由操作系统内核管理。任务的contextprogram counterthe CPU registers and(optionally)floating-point registersI/O assignments for
2、standard input,output,and errora delay timera time-slice timerkernel control structuressignal handlersdebugging and performance monitoring values5.1 任务的管理Wind内核的缺省任务调度算法是基于优先级的抢占式调度。时间片轮转调度(Round Robin)为可选调度算法。Wind内核有256级优先级,编号分别为0到255。其中优先级0是最高优先级,优先级255是最低优先级。任务管理的系统调用Task Creation RoutinesTask Sc
3、heduling RoutinesTask Name and ID RoutinesTask Information RoutinesTask Deleting RoutinesTask Control RoutinesTask Creation RoutinesTask SpawnTask Spawn执行TaskSpawnDemo;在VxSim窗口中观察结果。Task Scheduling RoutinesTask Scheduling Routines执行taskSpawn(“PriorityDemo”,128,0,1024,TaskPriorityDemo)观察VxSim窗口的输出。任务
4、锁当一个任务A调用taskLock(),基于优先级的抢占式调度失去作用。当该任务A被阻塞或挂起,调度算法恢复执行。调度器会选择就绪态中优先级最高的任务执行。当任务A回到就绪态,抢占式调度再次被禁止。函数taskLock()可以阻止任务切换,但是不能阻止中断服务程序的处理。Task Scheduling Routines 执行taskLockDemo观察shell执行命令时的停顿Task Scheduling Routines运行结果Task Name and ID RoutinesTask Name and ID Routines运行taskNameIDDemo;观察VxSim窗口。Task
5、Information RoutinesTask Information RoutinesTask Information Routines执行GetAllTasksInfo;观察shell窗口。Task Deleting RoutinestaskSafe()与taskUnsafe()Task Deleting RoutinesTask Deleting Routines执行taskSafeDemo;观察VxSim窗口。Task Control Routines5.2 任务间通信5.2.1 信号量 Semaphore5.2.2 消息队列 Message Queue5.2.3 管道 Pipe5.
6、2.4 事件 Event5.2.1 信号量VxWorks提供的最快速的任务间通信机制。存在3类信号量:-Binary-Mutual exclusion-CountingSemaphore Control RoutinesBinary 信号量Binary 信号量semBCreate()SEM_ID semBCreate(int options,SEM_B_STATE initialState)创建并初始化一个二进制信号量【参数】options:被阻塞的任务排队方式;SEM_Q_PRIORITY(0 x1)and SEM_Q_FIFO(0 x0)initialState:SEM_FULL(1)or
7、 SEM_EMPTY(0)【返回值】成功返回信号量ID,如果不能分配内存导致失败则返回NULL。semTake()STATUS semTake(SEM_ID semId,int timeout)获取一个信号量【参数】semId:信号量IDtimeout:WAIT_FOREVER(-1)and NO_WAIT(0)或一个正值【返回值】成功时返回OK,如果信号量ID不正确或任务超时则返回ERROR。semGive()STATUS semGive(SEM_ID semId)释放一个信号量【参数】semId:信号量ID【返回值】成功返回OK,失败返回ERROR。Binary信号量-Mutual Exc
8、lusionBinary信号量-Mutual ExclusionBinary信号量-Synchronization关键工作剩余工作Binary信号量-SynchronizationBinary信号量-SynchronizationBinary信号量-SynchronizationBinary信号量演示Binary信号量演示【说明】当信号量创建时设置了等待任务排队方式为SEM_Q_PRIORITY时,将按照任务优先级大小排序。运行semaphoreDemo;观察VxSim窗口输出。Counting信号量Counting信号量演示5.2.2 消息队列Message queues可容纳可变数量的消息
9、,每个消息的长度可变。任务和ISRs可向message queue中发送消息,任务可以从消息队列中读取消息。多个任务可以同时向一个message queue 发送和接收消息。可以使用两个不同方向的message queue构成任务之间的全双工通信(Full-duplex communication)。消息队列Message Queue ControlmsgQCreate()函数MSG_Q_ID msgQCreate(int maxMsgs,int maxMsgLength,int options)创建一个消息队列对象【参数】maxMsgs:消息队列能容纳的最大消息数 maxMsgLength:
10、每条消息最大的字节数options:任务排队选项MSG_Q_FIFO(0 x00);MSG_Q_PRIORITY(0 x01)【返回值】成功返回MSG_Q_ID,失败返回ERRORmsgQSend()函数STATUS msgQSend(MSG_Q_ID msgQId,char*buffer,UINT nBytes,int timeout,int priority)发送一个消息到消息队列【参数参数】msgQId:接收消息的队列IDbuffer:待发送消息存放的缓存nBytes:消息长度(字节)timeout:任务期望等待的tick数msgQSend()函数priority:消息的优先级 MSG_
11、PRI_NORMAL正常消息,将消息加到排队消息的队尾MSG_PRI_URGENT紧急消息,将消息加到排队消息的队首【返回值】成功返回OK,失败返回ERRORmsgQReceive()函数int msgQReceive(MSG_Q_ID msgQId,char*buffer,UINT maxNBytes,int timeout)从消息队列中读取一条消息【参数参数】msgQId:读取消息的消息队列IDbuffer:存储读取的消息的缓存maxNBytes:缓存大小(字节)timeout:任务期望等待的tick数【返回值】成功则返回拷贝到buffer中的字节数,失败返回ERROR。消息队列举例消息队
12、列举例消息队列举例消息队列举例消息队列消息队列演示消息队列演示【说明】在创建消息队列时,可以选择等待任务排队的方式。当选择为MSG_Q_PRIORITY时,等待的任务按照优先级大小排序;执行msgQDemo1;观察VxSim窗口的输出。消息队列演示【说明】当调用msgQSend函数发送消息时,可以指定发送消息的优先级,当优先级设置为MSG_PRI_URGENT时,消息排在队首。执行msgQDemo2;观察Shell窗口输出;观察VxSim窗口的输出;比较Shell窗口和VxSim窗口输出。5.2.3 管道pipe提供了使用VxWorks I/O系统的任务间通信机制;使用pipe也可以创建类似于
13、Message Queue的Client-Server编程结构;创建管道之前,需要调用pipeDrv;调用pipeCreate创建管道;采用标准的I/O操作open,close,read,write访问管道。5.2.3 管道pipe是message oriented;调用write写入的数据被看做一则message;调用read时,如果设置期待读取的数据长度小于一则message的长度,那么该则message剩余的字节会被丢弃。【包含文件】ioLib.hpipeDrv.hpipeDrvSTATUS pipeDrv(void)初始化管道驱动;【参数】无;【返回值】成功返回OK;否则返回ERROR
14、。pipeCreateSTATUS pipeDevCreate(char*name,int nMessages,int nByte)创建管道设备;【参数】name:待创建的管道名;nMessage:管道中最大消息数;nByte:每则消息的大小,以字节为单位;【返回值】成功返回OK;否则返回ERROR。openint open(const char*name,int flags,int mode)打开一个文件进行操作;【参数】name:待打开的文件名;flags:文操作标志;O_RDONLY(0)只读操作O_WRONLY(1)只写操作O_RDWR(2)读写操作O_CREATE(0 x0200)创
15、建操作mode:UNIX文件属性标志;open【返回值】调用成功返回文件描述符的值;否则返回ERROR。closeSTATUS close(int fd)关闭指定文件;【参数】fd:待关闭的文件描述符;【返回值】失败返回ERROR。readint read(int fd,char*buffer,size_t maxbytes)从指定的文件或设备中读取数据;【参数】fd:待读取的文件或设备描述符;buffer:接收数据的缓存;maxbytes:期待读取的最大字符数。【返回值】实际读取的字符数;如果已经到文件尾,则为0;否则为1 maxbytes之间的一个数;如果文件描述符不存在,则返回ERROR
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第6章 vxworks 嵌入式 操作系统
限制150内