嵌入式实时操作系统.ppt_第1页
嵌入式实时操作系统.ppt_第2页
嵌入式实时操作系统.ppt_第3页
嵌入式实时操作系统.ppt_第4页
嵌入式实时操作系统.ppt_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

第四讲实时操作系统 C OS 本节提要 1 3 2 5 4 6 C OS 简介 C OS 内核结构 C OS 任务通信与同步 C OS 任务管理 C OS 时间管理 C OS 移植 RTOS是32位的嵌入式CPU的软件基础 RTOS内核提供CPU的管理硬件初始化 MMU 定时器 中断RTOS内核提供任务 内存管理RTOS提供设备管理 文件和网络的支持RTOS提供C C JAVA 图形模块等编程接口 C OS简介 一 1 C OS MicroControllerOS 微控制器操作系统嵌入式实时多任务内核 核心代码8 3KB 最少可达2 7KB 基本功能任务调度 任务管理 时间管理 内存管理中断管理 任务间的同步与通信等 C OS简介 二 2 C OS简介美国人JeanLabrosse1992年完成应用面覆盖了诸多领域 如照相机 医疗器械 音响设备 发动机控制 高速公路电话系统 自动提款机等1998年 C OS II 目前的版本 C OS IIV2 612000年 得到美国航空管理局 FAA 的认证 可以用于飞行器中网站www ucos II com 公开源代码可移植性 Portable 绝大部分 C OS II的源码是用移植性很强的ANSIC写的 和微处理器硬件相关的那部分是用汇编语言写的 汇编语言写的部分已经压到最低限度 使得 C OS II便于移植到其他微处理器上 C OS II可以在绝大多数8位 16位 32位以至64位微处理器 微控制器 数字信号处理器 DSP 上运行 可固化 ROMable C OS II是为嵌入式应用而设计的 这就意味着 只要读者有固化手段 C编译 连接 下载和固化 C OS II可以嵌入到读者的产品中成为产品的一部分 C OS的性能特点 一 可裁剪 Scalable 可以只使用 C OS II中应用程序需要的那些系统服务 也就是说某产品可以只使用很少几个 C OS II调用 而另一个产品则使用了几乎所有 C OS II的功能 这样可以减少产品中的 C OS II所需的存储器空间 RAM和ROM 这种可剪裁性是靠条件编译实现的 占先式 Preemptive 多任务 C OS II可以管理64个任务 然而 目前这一版本保留8个给系统 应用程序最多可以有56个任务 可确定性几乎全部 C OS II的函数调用与服务的执行时间具有可确定性 C OS的性能特点 二 任务栈每个任务有自己单独的栈 C OS II允许每个任务有不同的栈空间 以便压低应用程序对RAM的需求 系统服务 C OS II提供很多系统服务 例如邮箱 消息队列 信号量 块大小固定的内存的申请与释放 时间相关函数等 中断管理中断可以使正在执行的任务暂时挂起 如果优先级更高的任务被该中断唤醒 则高优先级的任务在中断嵌套全部退出后立即执行 中断嵌套层数可达255层 稳定性与可靠性 C OS的性能特点 三 C OS II提供的系统服务 信号量带互斥机制的信号量减少优先级倒置的问题事件标志消息信箱消息队列内存管理时钟管理任务管理 C GUIand C FS C GUI嵌入式的用户界面用ANSIC书写支持任何8 16 32 bitsCPU彩色 灰度等级或黑白显示代码尺寸小 C FS嵌入式的文件系统用ANSIC书写支持任何8 16 32 bitsCPU支持SMC MMC SD CF IDE Flash RAM等介质 本节提要 1 3 2 5 4 6 C OS 简介 C OS 内核结构 C OS 任务通信与同步 C OS 任务管理 C OS 时间管理 C OS 移植 C OS II的文件结构 内核结构任务管理时间管理任务之间通信与同步 C OS的移植 C OS II的内核结构 任务task 典型的任务是一个无限循环 voidmytask void pdata for dosomething waiting dosomething C OS II2 5版本支持64个任务 每个任务有一个特定的优先级 优先级越高 数字越小 系统占用了8个任务 保留优先级为0 1 2 3 OS LOWEST PRIO 3 OS LOWEST PRIO 2 OS LOWEST PRIO 1 OS LOWEST PRIO 0 TaskStructure AlternateStructure 任务状态 任务控制块 TCB 任务控制块OS TCB是一个数据结构 保存该任务的相关参数 包括任务堆栈指针 状态 优先级 任务表位置 任务链表指针等 所有的任务控制块分为两条链表 空闲链表和使用链表 任务级的任务调度 OSSched C OS是占先式实时多任务内核 优先级最高的任务一旦准备就绪 则拥有CPU的所有权开始投入运行 C OS中不支持时间片轮转法 每个任务的优先级要求不一样且是唯一的 所以任务调度的工作就是 查找准备就绪的最高优先级的任务并进行上下文切换 C OS任务调度所花的时间为常数 与应用程序中建立的任务数无关 根据就绪表确定最高优先级 两个关键 优先级数分解为高三位和低三位分别确定 高优先级有着小的优先级号 根据优先级找到任务在就绪任务表中的位置 每个就绪的任务都放入就绪表中 readylist 中 就绪表有两个变量 OSRdyGrp OSRdyTbl 优先级最低任务 空闲任务 优先级最高任务 任务优先级号 根据优先级确定就绪表 1 假设优先级为12的任务进入就绪状态 12 1100b 则OSRdyTbl 1 的第4位置1 且OSRdyGrp的第1位置1 相应的数学表达式为 OSRdyGrp 0 x02 OSRdyTbl 1 0 x10 而优先级为21的任务就绪21 10101b 则OSRdyTbl 2 的第5位置1 且OSRdyGrp的第2位置1 相应的数学表达式为 OSRdyGrp 0 x04 OSRdyTbl 2 0 x20 根据优先级确定就绪表 2 从上面的计算我们可以得到 若OSRdyGrp及OSRdyTbl 的第n位置1 则应该把OSRdyGrp及OSRdyTbl 的值与2n相或 uC OS中 把2n的n 0 7的8个值先计算好存在数组OSMapTbl 7 中 也就是 OSMapTbl 0 20 0 x01 00000001 OSMapTbl 1 21 0 x02 00000010 OSMapTbl 7 27 0 x80 10000000 使任务进入就绪态 如果prio是任务的优先级 也是任务的识别号 则将任务放入就绪表 即使任务进入就绪态的方法是 OSRdyGrp OSMapTbl prio 3 OSRdyTbl prio 3 OSMapTbl prio 使任务脱离就绪态 将任务就绪表OSRdyTbl prio 3 相应元素的相应位清零 而且当OSRdyTbl prio 3 中的所有位都为零时 即全组任务中没有一个进入就绪态时 OSRdyGrp的相应位才为零 If OSRdyTbl prio 3 任务切换 将被挂起的任务寄存器入栈将较高优先级任务的寄存器出栈 任务级的任务切换OS TASK SW OS TASK SW 是宏调用 含有微处理器的软中断指令OS TASK SW 将处理器相关的软件中断机制封装起来 便于操作系统移植 调用OS TASK SW 前的数据结构 低优先级任务OS TCB OSTCBCur 1 存贮器低地址 存贮器高地址 堆栈方向 SP R1 R2 R3 R4 PC PSW 存贮器低地址 存贮器高地址 高优先级任务OS TCB OSTCBHighRdy 3 2 CPU 4 5 保存当前CPU寄存器的值 低优先级任务OS TCB OSTCBCur 存贮器低地址 存贮器高地址 堆栈方向 SP R1 R2 R3 R4 PC PSW 存贮器低地址 存贮器高地址 高优先级任务OS TCB OSTCBHighRdy 3 2 CPU 4 5 1 3 重新装入要运行的任务 低优先级任务OS TCB OSTCBCur 存贮器低地址 存贮器高地址 堆栈方向 SP R1 R2 R3 R4 PC PSW 存贮器低地址 存贮器高地址 高优先级任务OS TCB OSTCBHighRdyOSTCBCur 1 2 CPU 4 4 1 3 3 4 任务切换OS TASK SW 的代码 VoidOSCtxSw void 将R1 R2 R3及R4压入当前堆栈 OSTCBCur OSTCBStkPtr SP OSTCBCur OSTCBHighRdy SP OSTCBHighRdy OSTCBSTKPtr 将R4 R3 R2及R1从新堆栈中弹出 执行中断返回指令 C OS II中的中断 中断 由于某种事件的发生 而导致程序流程的改变 产生中断的事件称为中断源 CPU响应中断的条件 至少有一个中断源向CPU发出中断信号 系统允许中断 且对此中断信号未予屏蔽中断类型 硬件中断外部中断陷井中断现场控制量的中断 C OS II中的中断服务子程序 用户中断服务子程序 保存全部CPU寄存器 调用OSIntEnter 或OSIntNesting直接加1 if OSIntNesting 1 OSTCBCur OSTCBStkPtr SP 清中断源 重新开中断 执行用户代码的中断服务 调用OSIntExit 恢复所有CPU寄存器 执行中断返回指令 C OS II初始化 首先调用系统初始化函数OSInit OSInit 初始化 C OS 所有的变量和数据结构 见OS CORE C OSInit 建立空闲任务idletask 这个任务总是处于就绪态 空闲任务OSTaskIdle 的优先级总是设成最低 即OS LOWEST PRIO 如果统计任务允许OS TASK STAT EN和任务建立扩展允许都设为1 则OSInit 还得建立统计任务OSTaskStat 并且让其进入就绪态 OSTaskStat的优先级总是设为OS LOWEST PRIO 1空闲和统计任务的任务控制块 OS TCBs 是用双向链表链接在一起的 OSTCBList指向这个链表的起始处 当建立一个任务时 这个任务总是被放在这个链表的起始处 C OS 的启动 本节提要 1 3 2 5 4 6 C OS 简介 C OS 内核结构 C OS 任务通信与同步 C OS 任务管理 C OS 时间管理 C OS 移植 建立任务 Useoneoftwoservices 将任务的地址或其它参数传递给以下两个函数之一来建立任务 OSTaskCreate OSTaskCreateExt 建立任务 OSTaskCreate 建立任务 OSTaskCreate 堆栈检验 OSTaskStkChk 删除任务 OSTaskDel 请求删除任务 OSTaskDelReq 改变任务的优先级 OSTaskChangePrio 挂起任务 OSTaskSuspend 恢复任务 OSTaskResume 其它相关函数 本节提要 1 3 2 5 4 6 C OS 简介 C OS 内核结构 C OS 任务通信与同步 C OS 任务管理 C OS 时间管理 C OS 移植 时间管理 时钟节拍 C OS 提供的定时中断 用来实现延时与超时控制等功能 应该发生10 100次 秒 时钟节拍的实际频率是由应用程序根据需要指定的 时钟节拍的频率越高 系统的负荷就越重 时钟节拍源可以是专门的硬件定时器 也可以是来自50 60Hz交流电源的信号 C OS 的时钟节拍服务是通过调用OSTimeTick 实现的 必须在多任务系统启动 OSStart 以后再开启时钟节拍器 时间管理 C OS 提供5个时间管理函数 OSTimeDLY 一次任务调度 OSTimeDLYHMSM 一次任务调度 OSTimeDlyResmue 唤醒正在等待事件的任务 OStimeGet 获取系统时间 OSTimeSet 设置系统时间 OSTimeDly OSTimeDlyHMSM 本节提要 1 3 2 5 4 6 C OS 简介 C OS 内核结构 C OS 任务通信与同步 C OS 任务管理 C OS 时间管理 C OS 移植 任务间通信手段 C OS中 采用多种方法保护任务之间的共享数据和提供任务之间的通信 提供OS ENTER CRITICAL和OS EXIT CRITICAL来对临界资源进行保护OSSchedLock 禁止调度保护任务级的共享资源 提供了经典操作系统任务间通信方法 信号量 邮箱 消息队列 事件标志 事件控制块ECB 程序4 5ECB的结构如下 typedefstruct void OSEventPtr 指向消息或消息队列的指针 INT8UOSEventTbl OS EVENT TBL SIZE 等待任务列表 INT16UOSEventCnt 计数器 当事件是信号量时 INT8UOSEventType 事件类型 信号量 邮箱等 INT8UOSEventGrp 等待任务组 OS EVENT 与TCB类似的结构 使用两个链表 空闲链表与使用链表 所有的通信信号都被看成是事件 event 一个称为事件控制块 ECB EventControlBlock 的数据结构来表征每一个具体事件 ECB的结构如下 事件的等待任务列表 事件控制块TCB的操作 对事件控制块进行的操作包括 初始化一个事件控制块OS EventWaitListInit 使一个任务进入就绪态OS EventTaskRdy 使一个任务进入等待某事件的状态OS EventTaskWait 因为等待超时而使一个任务进入就绪态OS EventTO 信号量semaphore 信号量在多任务系统中用于 控制共享资源的使用权 标志事件的发生 使两个任务的行为同步 uC OS中信号量由两部分组成 信号量的计数值和等待该信号任务的等待任务表 信号量的计数值可以为二进制 也可以是其他整数 系统通过OSSemPend 和OSSemPost 来支持信号量的两种原子操作P 和V P 操作减少信号量的值 如果新的信号量的值不大于0 则操作阻塞 V 操作增加信号量的值 信号量操作 C OS II提供了6个对信号量进行操作的函数 它们是 OSSemCreate 建立一个信号量 OSSemDel 删除一个信号量 OSSemPend 等待一个信号量 OSSemPost 发送一个信号量 OSSemAccept 无等待地请求一个信号量 OSSemQuery 查询一个信号量的当前状态 邮箱管理 邮箱是 C OS II中另一种通讯机制 它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量 该指针指向一个包含了特定 消息 的数据结构 为了在 C OS II中使用邮箱 必须将OS CFG H中的OS MBOX EN常数置为1 使用邮箱之前 必须先建立该邮箱 该操作可以通过调用OSMboxCreate 函数来完成 并且要指定指针的初始值 C OS II提供了6种对邮箱的操作 OSMboxCreate OSMboxPend OSMboxPost OSMboxAccept 和OSMboxQuery OSMboxDel 函数 消息队列管理 消息队列是 C OS II中另一种通讯机制 它可以使一个任务或者中断服务子程序向另一个任务发送以指针方式定义的变量 因具体的应用有所不同 每个指针指向的数据结构变量也有所不同 为了使用 C OS II的消息队列功能 需要在OS CFG H文件中 将OS Q EN常数设置为1 并且通过常数OS MAX QS来决定 C OS II支持的最多消息队列数 在使用一个消息队列之前 必须先建立该消息队列 这可以通过调用OSQCreate 函数 并定义消息队列中的单元数 消息数 来完成 C OS II提供了7个对消息队列进行操作的函数 OSQCreate OSQPend OSQPost OSQPostFront OSQAccept OSQFlush 和OSQQuery 函数 操作系统的启动和运行过程 总结 不存在一个内核任务 实体 内核的管理是通过调用系统函数来实现的 每个任务有自己的堆栈空间 内核对任务的占先式调度不会干扰每个任务的总的运行结果 本节提要 1 3 2 5 4 6 C OS 简介 C OS 内核结构 C OS 任务通信与同步 C OS 任务管理 C OS 时间管理 C OS 移植 COS II在ARM7上的移植 所谓移植 是指使一个实时操作系统能够在某个微处理器平台上运行 COS II的主要代码都是由标准的C语言写成的 移植方便 移植 COS II满足的条件 处理器的C编译器能产生可重入代码 用C语言可以在程序中打开或者关闭中断 处理器支持中断 并且能产生定时中断 通常在10 1000Hz之间 处理器支持能够容纳一定量数据的硬件堆栈 处理器有将堆栈指针和其他CPU寄存器存储和读出到堆栈 或者内存 的指令 打开 关闭中断 在 COS II中 可以通过 OS ENTER CRITICAL OS EXIT CRITICAL 宏来控制系统关闭或者打开中断 这需要处理器的支持 在ARM7TDMI的处理器上 可以设置相应的寄存器 CPSR的I位 来关闭或者打开系统的所有中断 处理器支持中断并且能产生定时中断 COS II是通过处理器产生的定时器的中断来实现多任务之间的调度的 ARM7TDMI的处理器上可以产生定时器中断 处理器支持硬件堆栈 COS II进行任务调度的时候 会把当前任务的CPU寄存器存放到此任务的堆栈中 然后 再从另一个任务的堆栈中恢复原来的工作寄存器 继续运行另一个任务 所以 寄存器的入栈和出栈是 COS II多任务调度的基础 ARM7处理器中有专门的指令处理堆栈 可以灵活的使用堆栈 例 C OS II在S3C44B0X上的移植 设置OS CPU H中与处理器和编译器相关的代码用C语言编写六个操作系统相关的函数 OS CPU C C 用汇编语言编写四个与处理器相关的函数 OS CPU ASM 设置与处理器和编译器相关的代码 OS CPU H中定义了与编译器相关的数据类型 比如 INT8U INT8S等 与ARM处理器相关的代码 使用OS ENT

温馨提示

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

评论

0/150

提交评论