chap04ucOS-II嵌入式实时操作系统内核分析-简.ppt_第1页
chap04ucOS-II嵌入式实时操作系统内核分析-简.ppt_第2页
chap04ucOS-II嵌入式实时操作系统内核分析-简.ppt_第3页
chap04ucOS-II嵌入式实时操作系统内核分析-简.ppt_第4页
chap04ucOS-II嵌入式实时操作系统内核分析-简.ppt_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章 c OS II嵌入式实时操作系统内核分析 4 1 c OS II实时操作系统简介 4 2 c OS II的内核结构分析 4 3 c OS II的任务通信和同步 c OS II实时操作系统特点 1 公开源代码 2 可移植性 3 可固化 4 可裁减 5 可剥夺性 抢占式内核 6 多任务运行 7 可确定性 8 任务栈 9 系统服务 10 中断管理 11 稳定性和可靠性 4 1 c OS II实时操作系统简介 4 2 c OS II的内核结构分析 4 2 1 c OS II的内核结构 1 文件结构 4 2 1 c OS II的内核结构 在使用uC OS II提供的任何功能之前 必须先调用OSInit 函数进行初始化 在main主函数中调用OSStart 启动多任务之前 至少要先建立一个任务 否则应用程序会崩溃 OSInit 初始化uC OS II所有的变量和数据结构 并建立空闲任务OS TaskIdle 这个任务总是处于就绪态 例 一个典型的应用程序main主函数 voidmain void 硬件初始化 等用户代码初始化 init mcu init lcd init hdtimer OSInit 初始化uC OS II 通过调用OSTaskCreate 或OSTaskCreateExt 创建至少一个任务 OSTaskCreate sample Task void 0 开始多任务调度 OSStart 永远不会返回 4 2 1 c OS II的内核结构 4 2 1 c OS II的内核结构 4 2 1 c OS II的内核结构 图4 3uC OS II内核体系结构 2 uC OS II内核体系结构 4 2 2 c OS II的任务管理 1 多任务 把一个大型任务分解成多个小任务 然后在计算机中通过运行这些小任务 最终达到完成大任务的目的 在 C OS II中 与上述那些小任务对应的程序实体就叫做 任务 实质上是一个线程 C OS II就是一个能对这些小任务的运行进行管理和调度的多任务操作系统 在多任务系统中 任务是设计者实现应用系统的基本形式 也是 C OS II系统进行调度的基本单元 4 2 2 c OS II的任务管理 voidYourTask voidpdata for 用户代码 voidYourTask void pdata 用户代码 OSTaskDel OS PRIO SELF 4 2 2 c OS II的任务管理 2 任务状态及其转换 睡眠态 指任务驻留在程序空间还没有交给 C OS II来管理 通过创建任务将任务交给 C OS II 任务被删除后就进入睡眠态 就绪态 任务创建后就进入就绪态 运行态 占用CPU资源运行的任务 该任务为进入就绪态的优先级最高的任务 任何时刻只能有一个任务处于运行态 等待状态 由于某种原因处于等待状态的任务 中断服务态 任务运行时被中断打断 进入中断服务态 正在执行的任务被挂起 中断服务子程序控制了CPU的使用权 正在运行的任务 需要等待一段时间或需要等待一个事件发生再运行时 该任务就会把CPU的使用权让给别的任务而使任务进入等待状态 任务在没有被配备任务控制块或被剥夺了任务控制块时的状态叫做任务的睡眠状态 系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记 这时任务的状态叫做就绪状态 处于就绪状态的任务如果经调度器判断获得了CPU的使用权 则任务就进入运行状态 一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序 这时任务的状态叫做中断服务状态 3 任务管理 4 2 2 c OS II的任务管理 C OS II可以管理最多64个任务 任务管理包括创建任务 删除任务 改变任务的优先级及挂起和恢复任务等 1 建立任务 OSTaskCreate OSTaskCreateExt 2 任务堆栈 uC OS II支持的处理器的堆栈既可以是递减的 也可以是递增的 4 2 2 c OS II的任务管理 3 删除任务 OSTaskDel 4 请求删除任务 OSTaskDelReq 5 改变任务优先级 OSTaskChangePrio 6 挂起任务 OSTaskSuspend 7 恢复任务 OSTaskResume 4 2 3 c OS II的任务调度 C OS II总是运行进入就绪态的优先级最高的任务 任务调度器的功能是 在就绪表中查找最高优先级的任务 然后进行必要的任务切换 运行该任务 C OS II的任务调度有两种情况 任务级的任务调度是由于有更高优先级的任务进入就绪态 当前的任务的CPU使用权被剥夺 发生了任务到任务的切换 由OS Sched 完成 中断级的调度是指当前运行的任务被中断打断 由于ISR运行过程中有更高优先级的任务被激活进入就绪态 由OSIntExt 完成 1 任务切换 1 任务级的任务切换 OS TASK SW 保存当前运行的任务的CPU寄存器值到该任务的堆栈 将要运行的高优先级的任务的寄存器值从堆栈恢复到CPU寄存器 进行TCB的切换 并运行任务 2 中断级的任务切换 OSIntCtxSw 2 就绪表 每个就绪的任务都放在就绪表中 就绪表有两个变量 OSRdyGrp和OSRdyTbl OSRdyGrp中 将任务按优先级分组 八个为一组 OSRdyGrp的每一位代表每组任务是否有进入就绪态的任务 优先级判定表OSUnMapTbl OSUnMapTbl 是常量表 4 2 4中断与时间管理 1 中断管理 C OS II系统响应中断的过程 系统接收到中断请求后 这时如果CPU处于中断允许状态 即中断是开放的 系统就会中止正在运行的当前任务 而按照中断向量的指向转而去运行中断服务子程序 当中断服务子程序的运行结束后 系统将会根据情况返回到被中止的任务继续运行或者转向运行另一个具有更高优先级别的就绪任务 注意 中断服务子程序运行结束之后 系统将会根据情况进行一次任务调度去运行优先级别最高的就绪任务 而并不是一定要接续运行被中断的任务的 4 2 4中断与时间管理 2 时间管理 1 系统时钟 4 2 4中断与时间管理 C OS II与大多数计算机系统一样 用硬件定时器产生一个周期为ms级的周期性中断来实现系统时钟 最小的时钟单位就是两次中断之间相间隔的时间 这个最小时钟单位叫做时钟节拍 TimeTick 硬件定时器以时钟节拍为周期定时地产生中断 该中断的中断服务程序叫做OSTickISR 中断服务程序通过调用函数OSTimeTick 来完成系统在每个时钟节拍时需要做的工作 4 2 4中断与时间管理 voidOSTickISR void 保存CPU寄存器 调用OSIntEnter 记录中断嵌套层数if OSIntNesting 1 OSTCBCur OSTCBStkPtr SP 保存堆栈指针 调用OSTimeTick 节拍处理清除中断 开中断 调用OSIntExit 中断嵌套层数减一恢复CPU寄存器 中断返回 voidOSTimeTick void OSTimeTickHook OSTime 记录节拍数 if OSRunning TRUE ptcb OSTCBList while ptcb OSTCBPrio OS IDLE PRIO OS ENTER CRITICAL if ptcb OSTCBDly 0 if ptcb OSTCBDly 0 任务的延时时间减一 if ptcb OSTCBStat 2 任务的延时 4 2 4中断与时间管理 由于嵌入式系统的任务是一个无限循环 并且 C OS II还是一个抢占式内核 所以为了使高优先级别的任务不至于独占CPU 可以给其他任务优先级别较低的任务获得CPU使用权的机会 C OS II规定 除了空闲任务之外的所有任务必须在任务中合适的位置调用系统提供的函数OSTimeDly 使当前任务的运行延时 暂停 一段时间并进行一次任务调度 以让出CPU的使用权 voidOSTimeDly INT16Uticks ifOS CRITICAL METHOD 3OS CPU SRcpu sr endifif ticks 0 OS ENTER CRITICAL if OSRdyTbl OSTCBCur OSTCBY 调用调度函数 4 2 4中断与时间管理 4 3 c OS II的任务通信和同步 系统各任务之间通过 任务通信 的方式 实现任务的信息传递和同步控制 任务通信 的载体就是 事件 用于任务同步和通信的信号量 消息邮箱 消息队列和互斥信号量都叫做 事件 事件 信号量 Sem 消息邮箱 Mbox 消息队列 Q 互斥信号量 Mutex C OS II将信号量 互斥信号量 消息邮箱 消息队列等统称为 事件 然后通过一个称为 事件控制块 ECB 的数据结构来管理事件 信号量的计数器或互斥信号量和优先级继承的计数器 事件类型 指向邮箱或消息队列的指针 等待任务列表 4 3 1事件控制块 typedefstruct INT8UOSEventType 事件的类型INT16UOSEventCnt 信号量计数器void OSEventPtr 消息邮箱或消息队列的指针INT8UOSEventGrp 等待事件的任务组INT8UOSEventTbl OS EVENT TBL SIZE 任务等待表 OS EVENT 4 3 1事件控制块 空事件控制块链表 在 C OS II初始化时 系统会在初始化函数OSInit 中按应用程序使用事件的总数OS MAX EVENTS 创建OS MAX EVENTS个空事件控制块并借用成员OSEventPtr作为链接指针 把这些空事件控制块链接成一个单向链表 4 3 1事件控制块 酒店的桌子数是固定的 可以认为其最大桌子数就是计数器的初值 假设一人占用一张桌子 因此每进去一人 计数器就会自动减1 而只有出去一人时计数器才会自动加1 即就是说 如果计数器大于0 就可以进去吃饭 否则只好等待有人出来才能进去 这种计数信号就是信号量 3 2 1 0 禁止其它客人进入 没有空位 不能再容纳客人 有空位 能再容纳1位客人 4 3 2信号量和互斥信号量 信号量就像通行证 且通行证的数目是有限的 任务要运行下去就必须先拿到通行证 如果信号量已被别的任务占用 那么该任务只能被挂起 直到信号量被当前使用者释放为止 C OS II信号量由两部分组成 一部分是16位的无符号整型信号量的计数值 另一部分是由等待该信号量的任务组成的等待任务表 1 信号量 OSSemCreate函数 1 创建信号量在使用信号量之前 必须通过调用函数OSSemCreate 来创建一个信号量 函数OSSemCreate 只有唯一的参数cnt 用于初始化信号量的计数器初始值 创建信号量函数OSSemCreate 将返回一个指针 用于识别不同的信号量 1 信号量 建立信号量的流程图如下所示 1 信号量 2 等待信号量等待信号量是通过调用函数OSSemPend 来实现的 OSSemPend函数 1 信号量 等待信号量的流程图如下所示 1 信号量 OSSemPost函数 3 发送信号量任务获得信号量并在访问共享资源后必须释放信号量 释放信号量即发送信号量 通过调用函数OSSemPost 来实现 1 信号量 发送信号量的流程图如下所示 1 信号量 4 删除信号量删除信号量是通过调用函数OSSemDel 来实现的 OSSemDel函数 1 信号量 删除信号量的流程图如下所示 1 信号量 5 无等待地请求信号量OSSemAccept 用于查看资源是否可以使用或事件是否发生 如果事件没有发生 或资源不可使用 OSSemAccept 函数不挂起任务 OSSemAccept函数 1 信号量 1 信号量 6 查询信号量的当前状态OSSemQuery 用于获取某个信号量的信息 可以得知是否有 以及有多少任务位于信号量的任务等待队列中 OSSemQuery函数 2 互斥信号量 互斥信号量专用于资源同步 计数信号量与互斥信号量的比较 消息是任务之间的一种通信手段 当同步过程需要传输具体内容时就不能使用信号量 此时可以选择消息邮箱 即通过内核服务可以给任务发送带具体内容的消息 消息邮箱 PC PC 一个邮箱只能存放一个消息指针 4 3 3消息邮箱 满 空 1 向消息邮箱发送消息 有任务在等待消息 任务优先级足够高 PC 获得消息 注意 如果发送消息指针是以广播的形式发送 那么所有等待此消息的任务都获得消息 无任务在等待消息 PC PC 返回错误码说明消息邮箱已满 操作成功 PC 发送失败 1 消息邮箱收发信息 满 空 2 从消息邮箱接收消息 PC PC 操作成功 延时中获得消息 操作成功 设定延时到 无消息 返回超时错误 PC 空 满 另一个任务 或中断服务程序 向消息邮箱发出消息 PC 1 消息邮箱收发信息 2 消息邮箱状态和工作方式 满 消息指针PC 空 PC PC PC PC PC PC 一对一 多对一 3 消息邮箱操作函数 OSMboxCreate函数 3 消息邮箱操作函数 OSMboxPend函数 3 消息邮箱操作函数 OSMboxPost函数 3 消息邮箱操作函数 OSMboxPostOpt函数 3 消息邮箱操作函数 OSMboxAccept函数 3 消息邮箱操作函数 OSMboxDel函数 3 消息邮箱操作函数 OSMboxQuery函数 4 3 4消息队列 消息队列就象一个类似于缓冲区的对象 通过消息队列任务和ISR发送和接收消息 实现数据的通信和同步 消息队列具有一定的容量 可容纳多条消息 因此可以看成是多个邮箱的组合 PC PC PC PC PC PC FIFO PC PC PC PC PC PC LIFO 消息队列相当于共用一个等待任务列表的消息邮箱数组 结构核心增加了 队列控制块 OS Q 是一个数据结构 用于描述和控制消息指针数组 结构定义如下 typedefstructos q structos q OSQPtr 空OS Q表中的 链项 仅用于空OS Q链表管理 void OSQStart 消息指针数组的起始指针 void OSQEnd 消息指针数组的结束指针 void OSQIn 新消息指针插入队列的指针 void OSQOut 待读出消息指针的指针 INT16UOSQSize 队列长度 最多可缓冲的消息数 INT16UOSQEntries 队列中当前的消息数 OS Q 队列控制块 4 3 4消息队列 1 消息队列收发消息 1 向消息队列发送消息

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论