收藏 分享(赏)

【第6章】vxworks嵌入式操作系统.ppt

上传人:yjrm16270 文档编号:7207742 上传时间:2019-05-10 格式:PPT 页数:146 大小:2.43MB
下载 相关 举报
【第6章】vxworks嵌入式操作系统.ppt_第1页
第1页 / 共146页
【第6章】vxworks嵌入式操作系统.ppt_第2页
第2页 / 共146页
【第6章】vxworks嵌入式操作系统.ppt_第3页
第3页 / 共146页
【第6章】vxworks嵌入式操作系统.ppt_第4页
第4页 / 共146页
【第6章】vxworks嵌入式操作系统.ppt_第5页
第5页 / 共146页
点击查看更多>>
资源描述

1、【第6章】VxWorks嵌入式操作系统,邹昕光 哈尔滨工业大学自动化测试与控制研究所 2010,课程内容,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/O

2、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(“PriorityDemo”

4、, 128, 0, 1024, TaskPriorityDemo) 观察VxSim窗口的输出。,任务锁,当一个任务A调用taskLock(),基于优先级的抢占式调度失去作用。当该任务A被阻塞或挂起,调度算法恢复执行。调度器会选择就绪态中优先级最高的任务执行。当任务A回到就绪态,抢占式调度再次被禁止。函数taskLock()可以阻止任务切换,但是不能阻止中断服务程序的处理。,Task Scheduling Routines,执行taskLockDemo 观察shell执行命令时的停顿,Task Scheduling Routines,运行结果,Task Name and ID Routines,

5、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 Rout

6、ines,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 (0x1) and SEM_Q_FIFO (0x0) 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) 或一个正值 【返回值】 成功时返回OK, 如果信号量I

8、D不正确或任务超时则返回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信号量演示,Binary

9、信号量演示,【说明】 当信号量创建时设置了等待任务排队方式为SEM_Q_PRIORITY时,将按照任务优先级大小排序。 运行semaphoreDemo; 观察VxSim窗口输出。,Counting信号量,Counting信号量演示,5.2.2 消息队列,Message queues可容纳可变数量的消息,每个消息的长度可变。任务和ISRs可向message queue中发送消息,任务可以从消息队列中读取消息。多个任务可以同时向一个message queue 发送和接收消息。可以使用两个不同方向的message queue构成任务之间的全双工通信 (Full-duplex communicatio

10、n)。,消息队列,Message Queue Control,msgQCreate()函数,MSG_Q_ID msgQCreate ( int maxMsgs, int maxMsgLength, int options) 创建一个消息队列对象 【参数】 maxMsgs:消息队列能容纳的最大消息数 maxMsgLength:每条消息最大的字节数 options:任务排队选项MSG_Q_FIFO (0x00);MSG_Q_PRIORITY (0x01) 【返回值】 成功返回MSG_Q_ID ,失败返回ERROR,msgQSend()函数,STATUS msgQSend ( MSG_Q_ID ms

11、gQId, 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()函数,int msgQReceive (

12、 MSG_Q_ID msgQId, char * buffer, UINT maxNBytes, int timeout) 从消息队列中读取一条消息 【参数】 msgQId:读取消息的消息队列ID buffer:存储读取的消息的缓存 maxNBytes:缓存大小(字节) timeout:任务期望等待的tick数 【返回值】 成功则返回拷贝到buffer中的字节数,失败返回ERROR。,消息队列举例,消息队列举例,消息队列举例,消息队列举例,消息队列,消息队列演示,消息队列演示,【说明】在创建消息队列时,可以选择等待任务排队的方式。当选择为MSG_Q_PRIORITY时,等待的任务按照优先级大小

13、排序; 执行msgQDemo1; 观察VxSim窗口的输出。,消息队列演示,【说明】当调用msgQSend函数发送消息时,可以指定发送消息的优先级,当优先级设置为MSG_PRI_URGENT时,消息排在队首。 执行msgQDemo2; 观察Shell窗口输出; 观察VxSim窗口的输出; 比较Shell窗口和VxSim窗口输出。,5.2.3 管道,pipe提供了使用VxWorks I/O系统的任务间通信机制; 使用pipe也可以创建类似于Message Queue的Client-Server编程结构; 创建管道之前,需要调用pipeDrv; 调用pipeCreate创建管道; 采用标准的I/O

14、操作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 * name, int nMessag

15、es, 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(0x0200) 创建操作 mode:UNIX文件属性标志;,open,【返回

16、值】 调用成功返回文件描述符的值; 否则返回ERROR。,close,STATUS close(int fd) 关闭指定文件; 【参数】 fd:待关闭的文件描述符; 【返回值】 失败返回ERROR。,read,int read(int fd, char* buffer, size_t maxbytes) 从指定的文件或设备中读取数据; 【参数】 fd:待读取的文件或设备描述符; buffer:接收数据的缓存; maxbytes:期待读取的最大字符数。 【返回值】 实际读取的字符数;如果已经到文件尾,则为0;否则为1 maxbytes之间的一个数;如果文件描述符不存在,则返回ERROR。,wri

17、te,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 【参数】 events:

19、等待的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 其他系统服务,5.3.1 Watchdog Timer 5.

20、3.2 Interrupt Service,Watchdog Timer,Watchdog timer允许将一个C语言函数和一个时间延迟关联起来; 当时间延迟超时后,系统调用该C语言函数; 该C语言函数作为ISR来运行,运行于系统时钟中断级别上; 如果系统内核由于某种原因不能执行该函数,则将其放入tExcTask工作队列中; 在tExcTask工作队列中的任务优先级为0,Watchdog Timer,由于注册的函数在中断级别执行,所以有所限制; 不能申请semaphore; 不能调用其他可能阻塞的函数; 不能调用I/O系统函数,例如printf。,wdCreate,WDOG_ID wdCrea

21、te(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:延迟时间长度; pRoutine:超时后调用的函数; parameter:函数的参数; 【返回值】 成功返回OK,否则返回ERROR。,wdCancel,STATUS

22、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,否则返回ERROR。,wdShow,STATUS wdShow(WDOG_ID wdId) 显示指定watchdog timer的具体信息; 【参数】 wdId:待显示的wa

23、tchdog 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队列的字符数;如果不能写入则返回EOF。,logMsg,【说明】 logMsg()并不直接执行输出操作(这种操作可能会阻塞),而是将数据以消息的形式发送给tLogTask任务,所以logMsg(

24、)可以在ISRs中调用。包含文件logLib.h,Watchdog Timer演示,执行watchdogDemo; 观察Shell窗口的输出; 观察VxSim窗口的输出,查看起始字符串,它表示是谁发出的消息。,Interrupt Service Routine,Appendix: Tornado WinShell,VxWorks WindSh,Tornado shell, WindSh允许你 将应用程序模块下载到目标系统中; 手工调用应用程序的模块中的函数和VxWorks系统函数; 测试应用程序的功能。,VxWorks WindSh,VxWorks WindSh,Shell操作涉及Tornad

25、o的三个组件 Shell Target Server Target Agent,VxWorks WindSh,Shell:用户执行命令的地方; 接收用户命令,在宿主机上执行; 并将涉及到符号表,目标系统端应用程序和数据的操作分发给Target Server。,VxWorks WindSh,Target Server:管理符号表和远程目标系统的通信; 向目标系统分发调用请求,并返回调用结果。,VxWorks WindSh,Target Agent:运行在目标系统上; 作为一个监视程序,管理目标系统内存和其他设备的访问。,Run a shell,Shell功能,C Language Interpr

26、eter 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,READY 就绪态 PEND 阻塞态 DELAY 延迟态 SUSPEND 挂起态,Task States,DELAY+S 延迟挂起态 调用taskDelay()后被其他任务

27、挂起 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 taskSuspe

28、nd() shell ts,Task States,delayed - ready expired delaydelayed -suspended taskSuspend() shell ts,Task States,suspended - ready taskResume()/taskActive() shell tr suspended - pended taskResume() shell tr suspended - delayed taskResume() shell tr,Shell Commands : w,Shell Commands : tw,Shell Commands :

29、checkStack,Task Manipulation,td ts tr,Shell Commands : td,Shell Commands : ts & tr,任务延时与挂起 1,任务延时与挂起 2,System Information,lkup d ls pwd cd h,Shell Commands :lkup,从符号表中查找匹配的符号; 区分大小写;,- lkup “Demo“ _DelayDemo 0x00d5530c text (Demo.o) value = 0 = 0x0,Shell Commands : d,Shell Commands : d,Shell Command

30、s : d,Shell Commands : d,Shell Commands : d,Shell Commands : d,Shell Commands : d,Shell Commands : ls,Shell Commands : pwd & cd,Shell Commands : h,System Modification,reboot quit/exit,Shell Commands : reboot,Shell Commands : quit/exit,退出当前shell,Binary Semaphore 1,Binary Semaphore 2,Binary Semaphore 3,Binary Semaphore 4,Binary Semaphore 5,Counting Semaphore 1,Counting Semaphore 2,Counting Semaphore 3,Counting Semaphore 4,Counting Semaphore 5,Counting Semaphore 6,Counting Semaphore 7,Message Queue 1,Message Queue 2,Message Queue 3,消息的存储位置,Message Queue 4,Message Queue 5,Message Queue 6,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报