已阅读5页,还剩59页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式操作系统uCOS II 陈虎tommychen74 C OS II简介 作者 JeanLabrosse源码公开的嵌入式实时系统已被移植到40多种不同的CPU上http www C OS II com提供技术服务支持 嵌入式实时操作系统 C OS II 邵贝贝译 北京航空航天大学出版社 2003年 C OS II的主要特点 可移植性和可确定性绝大部分代码用ANSIC编写与处理器硬件相关的代码用汇编语言编写移植条件移植目标处理器要有硬件堆栈指针CPU内容寄存器入栈 出栈指令C编译器支持内嵌汇编或C可扩展 可连接汇编模块关中断 开中断可在C语言中实现 C OS II的主要特点 续1 抢占式多任务可以管理64个任务 8个任务是系统任务用户可以最多定义56个任务 每个任务优先级不相同实时性较强 参看下表 4种嵌入式操作系统的实时性能典型值 C OS II的主要特点 续2 可固化可裁剪实用程序可以只使用 C OS II中需要的那些系统服务任务由独立堆栈 C OS II允许每个任务由不同的栈空间嵌套中断管理嵌套层数可达255层 主要API voidOSInit void 系统初始化voidOSStart void 启动操作系统 任务管理 INT8UOSTaskCreate void task void pd void pdata OS STK ptos INT8Uprio task 指向任务代码的指针 pdata 指向向任务传递参数的数据结构 ptos 堆栈指针prio 优先级INT8UOSTaskSuspend INT8Uprio prio 指定要获取挂起的任务优先级INT8UOSTaskResume INT8Uprio prio指定要唤醒任务的优先级 信号量 OS EVENT OSSemCreate INT16Uvalue value 信号量的初始值 0到65535返回指向分配给所建立的信号量的控制块的指针voidOSSemPend OS EVNNT pevent INT16Utimeout int8u err pevent 信号量的指针timeout 最大等待时间 时钟节拍 err 包含错误码的变量的指针INT8UOSSemPost OS EVENT pevent pevent 信号量的指针 时间 voidOSTimeDly INT16Uticks ticks 延时的时钟节拍数 INT8UOSTimeDlyHMSM INT8Uhours INT8Uminutes INT8Useconds INT16Umilli hours为延时小时数 0 255 minutes为延时分钟数 0 59 seconds为延时秒数 0 59 milli为延时毫秒数 0 999 内存管理 OS MEM OSMemCreate void addr INT32Unblks INT32Ublksize INT8U err addr 内存区域的起始地址nblks 内存块的数目blksize 每个内存块的大小void OSMemGet OS MEM pmem INT8U err pmem 内存区域控制块的指针 INT8UOSMemPut OS MEM pmem void pblk pmem 内存区域控制块的指针pblk 将被释放的内存块的指针 INT8UOSMemQuery OS MEM pmem OS MEM DATA pdata 消息队列 OS EVENT OSQCreate void start INT8Usize start 消息内存区的首地址size 消息内存区的大小 void OSQPend OS EVENT pevent INT16Utimeout INT8U err 接收消息pevent 消息队列的指针timeout 最大等待时间err 包含错误码的变量的指针 消息队列 INT8UOSQPostFront OS EVENT pevent void msg 向消息队列的前端插入消息pevent 消息队列指针msg 发送消息的指针INT8UOSQPost OS EVENT pevent void msg 向消息队列的尾端插入消息pevent 消息队列指针msg 发送消息的指针INT8U OSQFlush OS EVENT pevent INT8UOSQQuery OS EVENT pevent OS Q DATA pdata C OS II的主程序 Bootloader执行完毕后 调用应用程序主文件 通常是main c 里的main 函数 main 函数在执行过程中 完成以下功能 硬件初始化函数操作系统初始化OSInit 任务创建OSTaskCreate 任务调度开始OSStart 一个主程序的例子 intMain void externvoidMainTaskInit void OSInit neededbyuC OS II ARMTargetInit dotarget uHALbasedARMsystem initialisation MainTaskInit OSStart starttheOS return0 voidMainTaskInit void OSTaskCreate Main Task void 0 OS STK C OS II的应用任务 周期性任务 一次性任务 voidUsertask void pdata 用户代码 OSTaskDel OS PRIO SELF voidUsertask void pdata INT8UReturnNum 返回值InitTimer 可选for 应用程序代码OSTimeDly n 常用的语句 C OS II的层次 C OS II的代码结构 A类 处理器无关B类 应用程序有关C类 硬件平台相关包括 核心模块预处理模块进程间通信模块内存管理模块任务与调度管理器模块时间管理模块移植模块 C OS II的内核 C OS II内核只提供任务调度 任务间通信 ITC 与同步 任务管理 时间管理和内存管理等基本功能可裁剪编译到8K左右 全部只有100K左右 消耗资源非常小在小规模的代码内实现了抢占式任务调度 多任务通信功能 C OS II的临界区 定义在OS CPU H文件中的两个宏 OS ENTER CRITICAL 关中断OS EXIT CRITICAL 开中断 defineOS ENTER CRITICAL cpu sr INTS OFF defineOS EXIT CRITICAL if cpu sr 0 INTS ON 开关中断的汇编语言程序段 INTS OFFmrsr0 cpsr currentCSRmovr1 r0 makeacopyformaskingorrr1 r1 0 xC0 maskoffintbitsmsrCPSR cxsf r1 disableints IRQandFIQ andr0 r0 0 x80 returnFIQbitfromoriginalCSRmovpc lr return INTS ONmrsr0 cpsr currentCSRbicr0 r0 0 xC0 maskonintsmsrCPSR cxsf r0 enableints IRQandFIQ movpc lr return C OS II的任务调度 C OS II的任务状态最大任务数64个 最高优先级为0 最低优先级取值为实际定义的最大任务数减1 任务建立之后 拥有优先级 执行函数 自用栈空间和任务控制块 TCB 在运行时刻能够完全控制CPU的操作以及全部用户可访问寄存器的操作 C OS II的任务状态转换图 C OS II的任务状态 休眠态 dormant 任务驻留在内存中 但还没有交给内核管理 通过调用任务创建函数把任务交给内核 就绪态 ready 任务已经准备好 且可运行 但由于优先级比正在运行的任务的优先级低 所以还暂时不能运行运行态得到了CPU的控制权正在运行之中的任务状态 C OS II的任务状态 挂起态 pending 或者等待态 waiting 正在运行的任务由于调用延时函数OSTimeDly 或等待事件信号量而将自身挂起被中断态 Interrupted 发生中断时CPU提供相应的中断服务 原来正在运行的任务暂时停止运行 进入了被中断状态 任务控制块OS TCB 在任务创建时内核会申请一个空白TCB初始化时将创建的任务信息填入该TCB的各个字段 当任务的CPU使用权被剥夺时 C OS II用它来保存该任务的状态 当任务重新得到CPU使用权时 任务控制块能确保任务从当时被中断处继续执行 OS TCB的定义 typedefstructos tcb OS STK OSTCBStkPtr 栈顶指针 structos tcb OSTCBNext TCB后项链表指针 structos tcb OSTCBPrev TCB前项链表指针 INT16UOSTCBDly 事件最长等待节拍数 INT8UOSTCBStat 任务状态 INT8UOSTCBPrio 任务优先级 INT8UOSTCBX INT8UOSTCBY INT8UOSTCBBitX INT8UOSTCBBitY 用于加速任务位置计算变量 OS TCB 加速任务位置计算 OSTCBX OSTCBY OSTCBBitX OSTCBBitY四个变量用于加速任务进入就绪态的过程或进入等待事件发生状态的过程根据任务的优先级OSTCBPrio计算得出 计算公式如下OSTCBY OSTCBPrio 3 OSTCBBitY OSMapTbl OSTCBY OSTCBX OSTCBPrio C OS II的就绪表 C OS II的就绪任务登记在就绪表中 就绪表由两个变量OSRdyGrp和OSRdyTbl 构成OSRdyGrp是一个单字节整数变量OSRdyTbl OS LOWEST PRIO 8 1 是单字节整数数组 其元素个数定义为最低优先级除以8加1 最多可有8个元素 字节 C OS II的就绪表 位图形式的 C OS II的任务就绪表和就绪实例 C OS II的就绪表 任务就绪表的操作登记一个新就绪表操作的典型指令段删除不再处于就绪态任务的指令段从就绪表中找到最高优先级的任务找到具有最高优先级的任务y OSUnMapTbl OSRdyGrp OSPrioHighRdy INT8U y 3 OSUnMapTbl OSRdyTbl y 请问构造OSUnMapTbl的原理是什么 C OS II的任务调度 voidOS Sched void INT8Uy OS ENTER CRITICAL if OSIntNesting 0 C OS II的任务调度 OS Sched 的执行时间是一个常数当有新的任务进入到就绪状态时将调用任务调度过程 事件处理MailBox处理信号量消息队列任务的创建和删除时间管理 C OS II的任务切换 上下文切换 ContextSwitch 当 C OS II内核决定运行另外任务时 它保存正在运行任务的上下文 这些内容保存在任务的自用堆栈之中 上下文入栈工作完成以后 把下一个将要执行的任务的上下文从该任务自用堆栈中装入CPU的寄存器 然后开始该任务的运行 ARM处理器任务栈上下文存储结构 C OS II的中断处理 中断服务子程序在执行前将被中断任务的执行现场保存在自用堆栈中断服务子程序执行事件处理有两种方法 通过OSMBoxPost OSQPost OSSemPost 等函数去通知该处理中断的任务 让任务完成中断事件的处理 由中断服务子程序本身完成事件处理 C OS II的中断处理服务程序流程 保存全部CPU寄存器到堆栈 调用OSIntEnter 对OSIntNesting变量加1 执行中断服务代码 或者发出IPC消息通知特定任务去执行中断服务 调用OSIntExit 函数 恢复所有CPU寄存器 执行中断返回指令 C OS II的OSIntExit voidOSIntExit void if OSRunning TRUE OS ENTER CRITICAL if OSIntNesting 0 OSIntNesting if OSIntNesting 0 C OS II的时间管理 C OS II能够提供周期性的时钟信号 节拍率10 100Hz 用户必须在多任务系统启动以后即在调用OSStart 之后激活时钟节拍信号发生器每当硬件定时器发出节拍中断请求 C OS II就要响应这个中断 C OS II的时间管理函数 节拍延时函数OSTimeDly 该函数常常位于任务函数的结束处 用以退出运行 用户可以借助定义全局常数OS TICKS PER SECOSTimeDlyHMSM 该函数可以按小时 H 分 M 秒 S 和毫秒 m 来定义时间OSTimeDlyResume 根据需要正处于延时期任务可以被用户中止延时 OSTimeDly 处理流程 voidOSTimeDly INT16Uticks if ticks 0 0meansnodelay OS ENTER CRITICAL if OSRdyTbl OSTCBCur OSTCBY Findnexttasktorun C OS II的内存管理 一般操作系统任意大小内存管理的问题存在内存碎片内存分配和释放的时间不确定固定分区法由操作系统把连续的大块内存按分区进行管理每个分区包含整数个大小相同的内存块可以有多个不同大小的分区 内存分区数据结构 typedefstruct MEMORYCONTROLBLOCK void OSMemAddr 内存分区起始地址 void OSMemFreeList 空闲块指针链表 INT32UOSMemBlkSize 每块大小 按照字节 INT32UOSMemNBlks 分区中块的总数 INT32UOSMemNFree 当前可用块数 OS MEM 在空闲块的前面放置空闲链表指针 C OS II的内存管理 C OS II对内存的管理通过以下四个函数完成创建一个内存分区 OSMemCreate 分配一个内存块 OSMemGet 释放一个内存块 OSMemPut 查询一个内存分区的状态 OSMemQuery 分配一个空闲内存块 void OSMemGet OS MEM pmem INT8U err void pblk OS ENTER CRITICAL if pmem OSMemNFree 0 是否有空闲块 pblk pmem OSMemFreeList pmem OSMemFreeList void pblk 调整指针链表 pmem OSMemNFree OS EXIT CRITICAL err OS NO ERR return pblk OS EXIT CRITICAL err OS MEM NO FREE BLKS return void 0 C OS II的任务间通信 C OS II中任务间通信的主要方式 信号量互斥信号量事件标志邮箱消息队列 事件控制块ECB 实现信号量 互斥型信号量 消息邮箱以及消息队列管理的基本数据结构 事件控制块ECB 任务或中断服务子程序可以给事件控制块ECB发信号 只有任务可以等待另一个任务或中断服务子程序通过事件控制块ECB给它发送信号 而中断服务子程序是不能等待事件控制块ECB给它发送信号的 处于等待状态的任务可以指定一个最长等待时间多个任务可以同时等待同一事件的发生 当事件控制块ECB是一个信号量时 任务可以等待它 也可以给它发送消息 事件控制块ECB typedefstruct INT8UOSEventType ECB类型 INT8UOSEventGrp 等待事件发生的组 INT16UOSEventCnt 信号量的值 void OSEventPtr 消息或消息队列的指针 INT8UOSEventTbl OS EVENT TBL SIZE 等待事件任务列表 OS EVENT defineOS EVENT TBL SIZE OS LOWEST PRIO 8 1 OSEventGrp和OSEventTbl的结构与OSRdyGrp和OSRdyTbl类似 这里用于表示等待某事件的任务集合 事件控制块ECB ECB的基本操作将任务加入等待事件的任务列表从等待事件的任务列表删除特定任务从等待事件的任务列表中找到最高优先级任务对外函数接口使任务列表中的最高优先级任务进入就绪态OS EventTaskRdy 使一个任务进入等待某事件发生状态OS EventTaskWait 由于等待超时而将任务设置为就绪态OS EventTO 互斥信号量 OS EVENT OSMutexCreate INT8Uprio INT8U err prio 优先级继承优先级err 出错代码指针voidOSMutexPend OS EVENT pevent INT16Utimeout INT8U err pevent ECB指针timeout 最长延迟err 出错代码指针INT8UOSMutexPost OS EVENT pevent pevent ECB指针 信号量创建的源代码 OS EVENT OSMutexCreate INT8Uprio INT8U err OS EVENT pevent if OSIntNesting 0 如果在中断处理程序中调用 返回错误 err OS ERR CREATE ISR return OS EVENT 0 OS ENTER CRITICAL if OSTCBPrioTbl prio OS TCB 0 互斥信号量的优先级不应该存在 OS EXIT CRITICAL err OS PRIO EXIST return OS EVENT 0 信号量创建的源代码 OSTCBPrioTbl prio OS TCB 1 在OSTCBPrioTbl表中标注 pevent OSEventFreeList 获取空闲ECB块指针 if pevent OS EVENT 0 OSTCBPrioTbl prio OS TCB 0 没有空闲块 OS EXIT CRITICAL err OS ERR PEVENT NULL return pevent OSEventFreeList OS EVENT OSEventFreeList OSEventPtr 修改空闲ECB指针 OS EXIT CRITICAL 信号量创建的源代码 填充数据结构pevent OSEventType OS EVENT TYPE MUTEX pevent OSEventCnt prioOSEventPtr void 0 OS EventWaitListInit pevent 初始化等待任务列表 err OS NO ERR return pevent 等待信号量的源代码处理流程 voidOSMutexPend OS EVENT pevent INT16Utimeout INT8U err 1 检查中断嵌套 如果在中断中调用 则返回错误2 检查pevent OSEventCnt的低8位 如果为FFh 表示没有任务占有此信号量 在此低8位中设置占有此信号量的任务优先级 并返回3 比较当前任务优先级和信号量所有者的优先级 如果当前任务优先级较高 则设置信号量所有者的优先级为pip 并进入就绪状态4 设置当前任务为信号量等待状态和timeout参数 并进入等待状态5 任务调度OS Sched 6 检查信号量标志 如果标志没有设置 表示出现超时错误 返回7 获得信号量 返回 释放互斥信号量的操作流程 INT8UOSMutexPost OS EVENT pevent 1 检查中断嵌套 如果在中断中调用 则返回错误2 获得优先级继承优先级pip和任务原有优先级prio3 坚持此任务是否确实拥有此信号量 如果不是 则返回错误4 如果此任务当前优先级等于prio 表明优先级上升了 则根据prio恢复到原先的优先级5 如果有别的任务在等待此信号量 则选择一个优先级最高者 并将其优先级设置在pevent OSEventCnt的低8位 重新调度任务 返回 6 设置pevent OSEventCnt的低8位为0FFH 表示无任务占用 返回 C OS II的移植 移植 C OS II必须满足以下要求处理器的C编译器能产生可重入代码用C语言可以打开和关闭中断处理器支持中断 并且能产生定时中断处理器支持能够容纳一定量数据的硬件栈区处理器有将栈区指针和其他CPU寄存器读出和存储到栈区或内存中的指令 C OS II的移植 续1 基本的配置和定义基本配置和定义全部集中在OS CPU H中定义和编译器相关的数据结构定义关中断和开中断宏定义栈指针的增长方向 C OS II的移植 续2 与移植有关的四个汇编语言程序OSStartHighRdy 运行优先级最高的任务OSCtxSw 任务级任务切换函数OSintCtxSw 中断级任务切换函数OSTickISR 时钟节拍中断服务子程序 OSTickISR OSTickISR 时钟节拍中断服务子程序时钟节拍来源于硬件电路 它是嵌入式操作系统的基本定时单位OSTickISR 首先在被中断任务栈区中保存CPU寄存器的值 调用OSIntEnter 该函数将中断嵌套记录值OSIntNesting加1OSTickISR 然后调用OSTimeTick OSTickISR 最后调用OSIntExit C OS II的移植 续3 与移植有关的主要C函数需要在OS CPU C C文件中改写10个简单的C函数 其中必须修改的函数是OSTaskStkInit 其余9个都是用户接口函数用户接口函数的调用位置都是在任务状态发生显著变动的地方OSTaskStkInit 函数用于初始化任务的自用栈区 它在任务创建时被调用 负责在内存开辟该任务的栈工作区 然后返回该栈的栈顶指针stk 有关 C OS II源代码的通读 通读 C OS II源代码是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年安徽省江淮十校高考英语模拟试卷(4月份)
- 初二班主任德育个人工作总结
- 在急诊科实习报告
- 胡旺数据库原理及应用第1章 概述 v21
- 2026年新高考全国卷III化学易错知识点卷(含解析)
- 2026年新课标 I 卷数学专题突破卷易错题含解析
- 2026年全国甲卷化学高频考点覆盖卷(含解析)
- 纤维板热压工岗前安全技能考核试卷含答案
- 提琴制作工班组协作水平考核试卷含答案
- 稀土熔炼工岗前操作管理考核试卷含答案
- 商务信函讲解课件
- 9686教学培训课件
- 2026年中考复习必背初中英语单词词汇表(精校打印)
- 福州三年级期中数学试卷
- 集体备课培训课件
- 老年人骨关节疾病防治与护理
- 山东省工程建设标准《高品质住宅建设标准》DB37T 5319-2025
- 建筑机电安装知识点课件
- 电气防爆管线安装规范
- 2024年河北高中学业水平合格性考试地理试题(含答案)
- 《公路建设项目文件管理规程》
评论
0/150
提交评论