版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、【第6章】VxWorks嵌入式操作系统,邹昕光 哈尔滨工业大学自动化测试与控制研究所 2011,课程内容,5.1 任务的管理 5.2 任务间通信 5.3 其他系统服务,5.1 任务的管理,每个任务都有自己的上下文(context),包括CPU的执行环境和系统执行时需要的资源。 VxWorks的任务context保存在任务的TCB (Task Control Block)中。 TCB是一个内核对象,由操作系统内核管理。,任务的context,program counter the CPU registers and (optionally) floating-point registers I/
2、O assignments for standard input, output, and error a delay timer a time-slice timer kernel control structures signal handlers debugging and performance monitoring values,5.1 任务的管理,Wind内核的缺省任务调度算法是基于优先级的抢占式调度。 时间片轮转调度(Round Robin)为可选调度算法。 Wind内核有256级优先级,编号分别为0到255。 其中优先级0是最高优先级,优先级255是最低优先级。,任务管理的系统
3、调用,Task Creation Routines Task Scheduling Routines Task Name and ID Routines Task Information Routines Task Deleting Routines Task Control Routines,Task Creation Routines,Task Spawn,Task Spawn,执行TaskSpawnDemo; 在VxSim窗口中观察结果。,Task Scheduling Routines,Task Scheduling Routines,执行 taskSpawn(“PriorityDem
4、o”, 128, 0, 1024, TaskPriorityDemo) 观察VxSim窗口的输出。,任务锁,当一个任务A调用taskLock(),基于优先级的抢占式调度失去作用。 当该任务A被阻塞或挂起,调度算法恢复执行。调度器会选择就绪态中优先级最高的任务执行。 当任务A回到就绪态,抢占式调度再次被禁止。 函数taskLock()可以阻止任务切换,但是不能阻止中断服务程序的处理。,Task Scheduling Routines,执行taskLockDemo 观察shell执行命令时的停顿,Task Scheduling Routines,运行结果,Task Name and ID Rout
5、ines,Task Name and ID Routines,运行taskNameIDDemo; 观察VxSim窗口。,Task Information Routines,Task Information Routines,Task Information Routines,执行GetAllTasksInfo; 观察shell窗口。,Task Deleting Routines,taskSafe()与taskUnsafe(),Task Deleting Routines,Task Deleting Routines,执行taskSafeDemo; 观察VxSim窗口。,Task Control
6、 Routines,5.2 任务间通信,5.2.1 信号量 Semaphore 5.2.2 消息队列 Message Queue 5.2.3 管道 Pipe 5.2.4 事件 Event,5.2.1 信号量,VxWorks提供的最快速的任务间通信机制。 存在3类信号量: - Binary - Mutual exclusion - Counting,Semaphore Control Routines,Binary 信号量,Binary 信号量,semBCreate(),SEM_ID semBCreate ( int options, SEM_B_STATE initialState ) 创建并
7、初始化一个二进制信号量 【参数】 options:被阻塞的任务排队方式;SEM_Q_PRIORITY (0 x1) and SEM_Q_FIFO (0 x0) initialState:SEM_FULL (1) or SEM_EMPTY (0) 【返回值】 成功返回信号量ID, 如果不能分配内存导致失败则返回NULL 。,semTake(),STATUS semTake ( SEM_ID semId, int timeout) 获取一个信号量 【参数】 semId:信号量ID timeout:WAIT_FOREVER (-1) and NO_WAIT (0) 或一个正值 【返回值】 成功时返回
8、OK, 如果信号量ID不正确或任务超时则返回ERROR。,semGive(),STATUS semGive ( SEM_ID semId) 释放一个信号量 【参数】 semId:信号量ID 【返回值】 成功返回OK,失败返回ERROR。,Binary信号量- Mutual Exclusion,Binary信号量- Mutual Exclusion,Binary信号量- Synchronization,关键工作,剩余工作,Binary信号量- Synchronization,Binary信号量- Synchronization,Binary信号量- Synchronization,Binary信
9、号量演示,Binary信号量演示,【说明】 当信号量创建时设置了等待任务排队方式为SEM_Q_PRIORITY时,将按照任务优先级大小排序。 运行semaphoreDemo; 观察VxSim窗口输出。,Counting信号量,Counting信号量演示,5.2.2 消息队列,Message queues可容纳可变数量的消息,每个消息的长度可变。任务和ISRs可向message queue中发送消息,任务可以从消息队列中读取消息。 多个任务可以同时向一个message queue 发送和接收消息。可以使用两个不同方向的message queue构成任务之间的全双工通信 (Full-duplex
10、communication)。,消息队列,Message Queue Control,msgQCreate()函数,MSG_Q_ID msgQCreate ( int maxMsgs, int maxMsgLength, int options) 创建一个消息队列对象 【参数】 maxMsgs:消息队列能容纳的最大消息数 maxMsgLength:每条消息最大的字节数 options:任务排队选项MSG_Q_FIFO (0 x00);MSG_Q_PRIORITY (0 x01) 【返回值】 成功返回MSG_Q_ID ,失败返回ERROR,msgQSend()函数,STATUS msgQSend
11、 ( MSG_Q_ID msgQId, char * buffer, UINT nBytes, int timeout, int priority) 发送一个消息到消息队列 【参数】 msgQId :接收消息的队列ID buffer:待发送消息存放的缓存 nBytes:消息长度(字节) timeout:任务期望等待的tick数,msgQSend()函数,priority :消息的优先级 MSG_PRI_NORMAL正常消息,将消息加到排队消息的队尾 MSG_PRI_URGENT紧急消息,将消息加到排队消息的队首 【返回值】 成功返回OK,失败返回ERROR,msgQReceive()函数,in
12、t msgQReceive ( MSG_Q_ID msgQId, char * buffer, UINT maxNBytes, int timeout) 从消息队列中读取一条消息 【参数】 msgQId:读取消息的消息队列ID buffer:存储读取的消息的缓存 maxNBytes:缓存大小(字节) timeout:任务期望等待的tick数 【返回值】 成功则返回拷贝到buffer中的字节数,失败返回ERROR。,消息队列举例,消息队列举例,消息队列举例,消息队列举例,消息队列,消息队列演示,消息队列演示,【说明】在创建消息队列时,可以选择等待任务排队的方式。当选择为MSG_Q_PRIORIT
13、Y时,等待的任务按照优先级大小排序; 执行msgQDemo1; 观察VxSim窗口的输出。,消息队列演示,【说明】当调用msgQSend函数发送消息时,可以指定发送消息的优先级,当优先级设置为MSG_PRI_URGENT时,消息排在队首。 执行msgQDemo2; 观察Shell窗口输出; 观察VxSim窗口的输出; 比较Shell窗口和VxSim窗口输出。,5.2.3 管道,pipe提供了使用VxWorks I/O系统的任务间通信机制; 使用pipe也可以创建类似于Message Queue的Client-Server编程结构; 创建管道之前,需要调用pipeDrv; 调用pipeCreat
14、e创建管道; 采用标准的I/O操作open, close, read, write访问管道。,5.2.3 管道,pipe是message oriented; 调用write写入的数据被看做一则message; 调用read时,如果设置期待读取的数据长度小于一则message的长度,那么该则message剩余的字节会被丢弃。 【包含文件】 ioLib.h pipeDrv.h,pipeDrv,STATUS pipeDrv (void) 初始化管道驱动; 【参数】 无; 【返回值】 成功返回OK;否则返回ERROR。,pipeCreate,STATUS pipeDevCreate(char * na
15、me, int nMessages, int nByte) 创建管道设备; 【参数】 name:待创建的管道名; nMessage:管道中最大消息数; nByte:每则消息的大小,以字节为单位; 【返回值】 成功返回OK;否则返回ERROR。,open,int open(const char* name, int flags, int mode) 打开一个文件进行操作; 【参数】 name:待打开的文件名; flags:文操作标志; O_RDONLY(0)只读操作 O_WRONLY(1)只写操作 O_RDWR(2)读写操作 O_CREATE(0 x0200)创建操作 mode:UNIX文件属性
16、标志;,open,【返回值】 调用成功返回文件描述符的值; 否则返回ERROR。,close,STATUS close(int fd) 关闭指定文件; 【参数】 fd:待关闭的文件描述符; 【返回值】 失败返回ERROR。,read,int read(int fd, char* buffer, size_t maxbytes) 从指定的文件或设备中读取数据; 【参数】 fd:待读取的文件或设备描述符; buffer:接收数据的缓存; maxbytes:期待读取的最大字符数。 【返回值】 实际读取的字符数;如果已经到文件尾,则为0;否则为1 maxbytes之间的一个数;如果文件描述符不存在,则
17、返回ERROR。,write,int write(int fd, char* buffer, size_t nbytes) 向指定的文件或设备写入数据; 【参数】 fd:待写入的文件或设备描述符; buffer:待写入的缓存; nbytes:待写入的缓存大小; 【返回值】 实际写入的字节数;如果文件描述符不存在则返回ERROR。,管道演示,运行pipeDemo; 观察VxSim窗口输出。,5.2.4 事件 Event,一种Task和ISR,Task和Task或者Task和其他VxWorks内核对象之间的通信机制; 其他内核对象包括semaphore和message queue,这些对象称为资源
18、; 一个任务直接向另个任务发送events可以实现任务同步机制。,eventSend,STATUS eventSend(int taskId, UINT32 events) 将指定的events发送给指定的任务; 【参数】 taskId:接收events的任务ID; events:发送给任务的events,可以有多达32个; 【返回值】 成功返回OK;否则返回ERROR。,eventReceive,STATUS eventReceive(UINT32 events, UINT8 options, int timeout, UINT32 *pEventReceived) 等待指定的events
19、【参数】 events:等待的events options:等待方式,EVENT_WAIT_ANY(1),等待events中任何一个;EVENT_WAIT_ALL(0),等待events中所有指定的事件; timeout:等待超时值; pEventReceived:出现的events;,eventReceive,【返回值】 成功返回OK;否则返回ERROR。,Event演示,执行eventsDemo(0)。 仔细观察Shell窗口和VxSim窗口输出的先后次序。 执行eventsDemo(1)。 仔细观察Shell窗口和VxSim窗口输出的先后次序。,5.3 其他系统服务,系统时间 看门狗计时
20、器 其他计时方法,系统时间,嵌入式系统硬件 时间芯片会在一个确定时间内给系统产生一个中断; VxWorks系统 多个时间中断累计成一个时间片(tick); VxWorks系统的时间以tick为单位计时; 与现实世界的沟通 现实世界以秒,毫秒,微秒等单位为计时标准; 因此需要进行tick和现实世界的时间单位换算;,时间换算函数,int sysClkRateGet(void) 【说明】 获取每秒钟包含的tick数量 例子:5秒钟的tick数量就是 5 * sysClkRateGet() 让任务睡眠5秒 taskDelay(5 * sysClkRateGet();,定时执行任务,应用中的一个经常性的
21、需求是“在一段时间后执行某个任务。” 例如每隔5秒钟执行任务A; 解决方法: 让任务在循环中每执行一次睡眠5秒钟; 优点:实现简单; 确定:不精确。,定时执行任务,例子 任务A每隔0.1秒执行一次操作,输出一个信息A#,#代表执行的次数; 任务B连续执行某个操作,每次执行输出一个信息B#。 当任务A单独执行时,输出结果如下,定时执行任务,例子(续) 当任务A和B同时执行时,A先与B执行,输出结果如下,定时执行任务,结论 任务A受到任务B的干扰,不能准确按照预定的时间间隔执行。 原因: 任务A和任务B的优先级相同; 当任务A执行第一轮后调用taskDelay,放弃了CPU; 任务B执行;任务A需
22、要等待任务B执行完后才能执行。,定时执行任务,解决方法,调整任务A的优先级,使任务A的优先级高于任务B的优先级。,定时执行任务,其他解决方法,让任务定时在时间中断级别上执行。 采用看门狗定时器可以实现这个要求。,Watchdog Timer,Watchdog timer允许将一个C语言函数和一个时间延迟关联起来; 当时间延迟超时后,系统调用该C语言函数; 该C语言函数作为ISR来运行,运行于系统时钟中断级别上; 如果系统内核由于某种原因不能执行该函数,则将其放入tExcTask工作队列中; 在tExcTask工作队列中的任务优先级为0,Watchdog Timer,由于注册的函数在中断级别执行
23、,所以有所限制; 不能申请semaphore; 不能调用其他可能阻塞的函数; 不能调用I/O系统函数,例如printf。,wdCreate,WDOG_ID wdCreate(void) 创建一个watchdog timer 【参数】 无 【返回值】 成功返回新创建的watchdog timer的ID值;否则返回NULL。,wdStart,STATUS wdStart(WDOG_ID wdId, int delay, DUNCPTR pRoutine, int parameter) 启动指定的watchdog timer; 【参数】 wdId:待启动的watchdog timer; delay:
24、延迟时间长度; pRoutine:超时后调用的函数; parameter:函数的参数; 【返回值】 成功返回OK,否则返回ERROR。,wdCancel,STATUS wdCancel(WDOG_ID wdId) 取消指定watchdog timer,将其delay值设置为0; 【参数】 wdId:待取消的watchdog timer; 【返回值】 成功返回OK,否则返回ERROR。,wdDelete,STATUS wdDelete(WDOG_ID wdId) 删除指定的watchdog timer; 【参数】 wdId:待删除的watchdog timer; 【返回值】 成功返回OK,否则返
25、回ERROR。,wdShow,STATUS wdShow(WDOG_ID wdId) 显示指定watchdog timer的具体信息; 【参数】 wdId:待显示的watchdog timer; 【返回值】 成功返回OK,否则返回ERROR。,logMsg,int logMsg(char* fmt, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6) 将数据发送给tLogTask任务显示; 【参数】 fmt:显示格式,类似于printf; arg1arg6:待显示数据; 【返回值】 成功返回写入log队列的字符数;如果不能写入
26、则返回EOF。,logMsg,【说明】 logMsg()并不直接执行输出操作(这种操作可能会阻塞),而是将数据以消息的形式发送给tLogTask任务,所以logMsg()可以在ISRs中调用。 包含文件logLib.h,Watchdog Timer演示,执行watchdogDemo; 观察Shell窗口的输出; 观察VxSim窗口的输出,查看起始字符串,它表示是谁发出的消息。,Interrupt Service Routine,Appendix: Tornado WinShell,VxWorks WindSh,Tornado shell, WindSh允许你 将应用程序模块下载到目标系统中;
27、手工调用应用程序的模块中的函数和VxWorks系统函数; 测试应用程序的功能。,VxWorks WindSh,VxWorks WindSh,Shell操作涉及Tornado的三个组件 Shell Target Server Target Agent,VxWorks WindSh,Shell:用户执行命令的地方; 接收用户命令,在宿主机上执行; 并将涉及到符号表,目标系统端应用程序和数据的操作分发给Target Server。,VxWorks WindSh,Target Server:管理符号表和远程目标系统的通信; 向目标系统分发调用请求,并返回调用结果。,VxWorks WindSh,Tar
28、get Agent:运行在目标系统上; 作为一个监视程序,管理目标系统内存和其他设备的访问。,Run a shell,Shell功能,C Language Interpreter Task Information Task Manipulation System Information System Modification,C Language Interpreter,C Language Interpreter,Task Information,i ti w tw checkStack,Shell commands : i,Shell Commands : ti,Task States,R
29、EADY 就绪态 PEND 阻塞态 DELAY 延迟态 SUSPEND 挂起态,Task States,DELAY+S 延迟挂起态 调用taskDelay()后被其他任务挂起 PEND+S 阻塞挂起态 等待信号量可用时被其他任务挂起 PEND+T 阻塞延迟态 以某个超时值等待信号量可用 PEND+S+T 阻塞挂起延迟态 以某个超时值等待信号量可用时被其他任务挂起,Task States,Task States,ready - pended semTake()/msgQReceive() ready - delayed taskDelay() ready -suspended taskSuspend() shell ts,Task States,pended -ready semGive()/msgQSend() pended -suspended taskSuspend() shell ts,Task States,delayed - ready expired delay delayed -suspended taskSuspend() shell ts,Task States,suspended - ready taskResume()/taskActive() shell tr suspended - pended taskResume()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年热轧产线智能排程AI自动排程使用率超70%实施方案
- 2026年长三角枢纽算力调度平台建设与“东数西算”工程落地
- 2026年行业特色数商培育引进实施方案
- 2026年人形机器人脑机接口人工智能在失能失智预防中应用
- 2026年棉花田激光除草机器人零农残作业操作实务
- 2026年汽车行业全供应链零碳协同管理体系建设
- 2026北京大学力学与工程科学学院招聘1名劳动合同制工作人员备考题库及答案详解(必刷)
- 2026重庆青年镇招聘公益性岗位人员4人备考题库及完整答案详解【易错题】
- 2026江西萍建工程建设有限公司招聘11人备考题库含答案详解(综合卷)
- 2026长鑫存储科技集团股份有限公司招聘16人备考题库附完整答案详解(名校卷)
- 船舶内部审核-审核要素
- 2024年常州信息职业技术学院单招职业适应性测试题库及答案一套
- 康复医学人体运动学
- 电梯维保服务投标方案
- 学生心理问题转介处置制度
- 贵州源鑫矿业有限公司煤矸石洗选综合利用项目环评报告
- 八年级下册音乐复习题及答案(湘艺版)
- 高中地理(湘教版2019版)必修二 全册知识点
- 1993年物理高考试卷与答案
- GB/T 19326-2012锻制承插焊、螺纹和对焊支管座
- 福彩3D历史开奖数据2002-2016(174)全部数据
评论
0/150
提交评论