




已阅读5页,还剩150页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九讲嵌入式操作系统概述 嵌入式系统概论 目录 嵌入式操作系统概念嵌入式操作系统的基本原理 uC OS II 任务和调度中断和时钟管理任务同步和通信动态内存管理 计算机操作系统 OperatingSystem OS 操作系统是一种为应用程序提供服务的系统软件 是一个完整计算机系统的有机组成部分 从层次来看 操作系统位于计算机硬件之上 应用软件之下 所以也把它叫做应用软件的运行平台 什么是计算机操作系统 简而言之 OS就是一个屏蔽层 屏蔽了计算机的具体硬件 向使用者提供了一台虚拟的计算机开发 使用环境 它在计算机应用程序与计算机硬件系统之间 屏蔽了计算机硬件工作的一些细节 并对系统中的资源进行有效的管理 通过提供函数 应用程序接口 API 从而使应用程序的设计人员得以在一个友好的平台上进行应用程序的设计和开发 大大地提高了应用程序的开发效率 计算机操作系统的作用 从用户的角度来看 它就是一大堆函数 API和系统函数 用户可以调用 普通调用或系统调用 它们来对系统资源进行操作 操作系统 计算机操作系统的功能 处理器的管理 存储管理 网络和通信的管理 总之 需要许多的表和数据结构 嵌入式软件的发展 循环轮询系统 单线程程序Single threadedprogram也称为顺序程序Sequentialprogram 它分为两种 循环轮询系统 PollingLoop 最简单的软件结构是循环轮询优点 便于实现没有中断机制 程序运行良好不会出现随机的问题缺点 有限的应用领域 对于大量的I O服务的应用不易实现 initialize While true if condition 1 action 1 if condition 2 action 2 if condition n acition n 嵌入式软件的发展 前后台系统 单线程程序第二种 前后台系统 Foreground Background Super Loops 应用程序是一个无限的循环 循环中调用相应的函数完成相应的操作 这部分可以看成后台行为 background 中断服务程序处理外部I O事件 这部分可以看成前台行为 foreground 时间相关性很强的关键操作 Criticaloperation 靠中断服务来保证的 很多基于微处理器的产品采用前后台系统设计 例如微波炉 电话机 玩具等 极端情况下 后台只是一个简单的循环不做任何事情所有其它工作都是由中断处理程序完成的 嵌入式软件的发展 多任务操作系统 问题的提出 对于一个复杂的嵌入式实时系统来说当采用中断处理程序加后台主程序难以完成时存在一些互不相关的过程需要在一个计算机中同时处理时 多任务运行很像前后台系统 但后台任务有多个 CPU在许多任务之间转换 需要对这些共享的设备和数据进行管理系统分成相对简单的相互合作的模块 嵌入式操作系统的特点 必要性 嵌入式系统软硬件愈加庞大复杂 微型化 可裁减 软 硬件小而精 够用即可 实时性 抢占式管理策略 满足时间正确性 可靠性 无人值守 自动化设备的使用要求 易移植 便于应用到多种的硬件平台 微内核 完成OS主要功能的代码很小 附加功能需另挂 多任务嵌入式操作系统的任务 多任务管理 丰富的多任务管理函数供目标系统设计者容易完成多任务应用设计 任务管理和调度任务同步和通信中断和时钟内存管理 动态内存管理充分利用硬件资源 外设管理 例如I2C UART Timer SPI等设备的驱动 嵌入式RTOSuC OS II简介 uC OS由JeanJ Labrosse先生 加拿大 1992编写的RTOS 1999年改写后命名为uC OS II 2000年被美航空管理局认证 uC OS II中的代码90 用C语言编写 时有少量的相关于硬件的代码用汇编编写 易移植到各类体系结构的8位 16位 32位处理器 官方网站 目录 嵌入式操作系统概念嵌入式操作系统的基本原理 uC OS II 任务和调度中断和时钟管理任务同步和通信动态内存管理 任务的基本概念 复杂问题 分而治之 的问题解题思路 针对目标系统拆分后的 小且易 的问题的具体处理方法编码和数据结构 任务 uC OS II的两种任务 系统任务 用户任务 任务的组成 任务控制块 uC OS II进行任务管理用的一个数据结构 任务代码 描述任务算法的程序编码 任务堆栈 任务的工作现场环境 任务的基本概念 任务的基本概念 宏观 上的多任务并发 实际上是用单CPU进行多任务处理 微观 任何时刻 只能运行一个任务 存在CPU资源竞争 任务调度 任务现场 各个任务在多任务系统中也随着环境条件的情况而具有不同的状态 任务状态划分也是多任务操作系统的管理手段 任务的状态及其转换 正在运行的任务 需要等待一段时间或需要等待一个事件发生再运行时 该任务就会把CPU的使用权让给别的任务而使任务进入等待状态 任务在没有被配备任务控制块或被剥夺了任务控制块时的状态叫做任务的睡眠状态 系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记 这时任务的状态叫做就绪状态 处于就绪状态的任务如果经调度器判断获得了CPU的使用权 则任务就进入运行状态 一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序 这时任务的状态叫做中断服务状态 用户任务代码的一般结构 voidMyTask void pdata 任务的初始化for 超循环构成任务体 可被中断的用户代码片断 OS ENTER CRITICAL 进入临界区 关中断 不可被中断的用户代码片断 OS EXIT CRITICAL 退出临界区 开中断 可被中断的用户代码片断 用户应用程序的一般结构 用户任务 代码形式上很像C函数 但他不是函数 任务 不能被主函数main 或其他函数调用 只能被主函数或已激活任务创建 任务的运行由操作系统调度管理 voidMyTask1 void pdata voidMyTask2 void pdata voidmain OSInit OSTaskCreate MyTask1 OSTaskCreate MyTask2 OSStart 任务的基本概念 在此学习uC OS II的3个系统函数和2个宏 OSInit 初始化uC OS II环境 OSTaskCreate 创建任务系统函数 OSStart 启动uC OS II任务调度器 OS ENTER CRITICAL 进入临界区 宏 OS EXIT CRITICAL 退出临界区 宏 OSInit 函数原型 voidOSInit void OSStar 函数原型 voidOSStart void OSTaskCreate 函数原型 INT8UOSTaskCreate void task void pd 指向任务的指针void pdata 传递给任务的参数OS STK ptos 任务堆栈栈顶的指针INT8Uprio 任务的优先级别 OSTaskCreate 函数使用举例 定义任务task Avoidtask A void pdata 任务初始化部分while 1 任务功能代码 在系统 创建 任务task Avoidmain void OSInit 系统初始化部分 OSTaskCreate task A void 0 任务的基本概念 系统任务 空闲任务 OSTaskIdel 使用说明 1 uC OS II规定用户程序中必须使用OSTaskIdel 2 该任务不能用软件删除 3 该任务是uC OS II初始化时自动创建 其任务优先级固定为最低级 用户也可修改该任务的业务 4 目的 使CPU在没有用户任务可执行时也有事可做 统计任务 OSTaskStat 使用说明 1 功能完成用户任务CPU使用率的统计 结果以百分比的形式存放在变量OSCPUsage中 2 该任务用户可选择使用 OS CFG H文件中的常数OS TASK STAT EN设置为1 使能该函数 3 用户在OS CFG H中使能该任务后 系统自动创建该任务 但在用户使用统计数据前必须调用系统函数OSStatInit 先进行初始化 4 该任务固定拥有次末任务优先级 任务的基本概念 任务的优先权和优先级别 uC OS II的每个任务都必须有唯一的优先级 uC OS II最多可以管理64个优先级别分配给64个任务 uC OS II中用一个8b的整型数来表示优先级别 数字越小 优先级越高 prio 0的任务优先级最高 uC OS II中使用任务的优先级 prio 作为任务句柄 用户通过修改OS CFG H中的宏定义常数OS LOWEST PRIO的值 约定本用户系统的最大优先级数 任务堆栈 堆栈 LIFO访问原则组织的连续存储器 任务堆栈在uC OS II中的应用 任务堆栈是任务的三大组成部分之一 保存CPU寄存器现场 R0 R12 LR SPSR等 本Task的私有数据 任务堆栈 任务堆栈的创建 在创建任务的同时 任务堆栈即被创建 举例 defineMyTaskStkSize64OS STKMyTaskStk MyTaskStkSize 在OS CPU H中定义OS STK typedefINT32UOS STKINT8UOSTaskCreate void task void pd 指向任务的指针void pdata 传递给任务的参数MyTaskStk MyTaskStkSize 1 任务堆栈栈顶的指针INT8Uprio 任务的优先级别 任务堆栈 任务堆栈的使用注意事项 存在两种堆栈形式 递增堆栈 进栈操作向大地址方向发展 递减堆栈 进栈操作向小地址方向发展 OSTaskCreate MyTaskStk StkSize 1 OSTaskCreate MyTaskStk 0 备注 利用条件编译技术和OS CPU H中的宏定义常数OS STK GROWTH编写易移植用户系统 1 递减堆栈forARMCPU 任务控制块及任务控制块链表 任务控制块 TCB 任务在系统中的身份证 TCB uC OS II中用于记录任务信息 任务堆栈指针 任务当前状态 任务优先级别等 的数据结构 uC OS II将系统中的所有TCB构成两个链表 OSTCBList OSTCBFreeList 进行任务管理 空任务控制块链表 未被分配的TCB链OSTCBFreeList 任务控制块链表 已分配的TCB链OSTCBList 任务控制块及任务控制块链表 任务控制块 TCB 的结构 任务控制块结构的主要成员typedefstructos tcb structos tcb OSTCBNext 指向下一个TCB的指针structos tcb OSTCBPrev 指向前一个TCB的指针OS STK OSTCBStkPtr 指向任务堆栈栈顶的指针 INT16UOSTCBDly 任务等待时间INT8UOSTCBStat 任务的当前状态标志INT8UOSTCBPrio 任务的优先级别 OS TCB 任务控制块及任务控制块链表 任务控制块链表 空任务控制块链表 OSTCBFreeList 任务控制块链表 OSTCBList uC OS II用两个链表来管理TCB 任务控制块及任务控制块链表 任务控制块链表 空任务块链表是在uC OS II初始化 OSInit 时系统自建的 用户可依据目标系统的实际需求 设定其链表长度 OS CFG H文件中的宏常数OS MAX TASKS 用于定义最大用户任务数 UCOS II H文件中的宏常数OS N SYS TASKS 用于约定系统任务数 其值固定为2 当应用程序调用函数OSTaskCreate 创建一个任务时 这个函数会调用系统函数OSTCBInit 来为任务控制块进行初始化 这个函数首先为被创建任务从空任务控制块链表获取一个任务控制块 然后用任务的属性对任务控制块各个成员进行赋值 最后再把这个任务控制块链入到任务控制块链表的头部 当进行系统初始化时 初始化函数会按用户提供的任务数为系统创建具有相应数量的任务控制块并把它们链接为一个链表 由于这些任务控制块还没有对应的任务 故这个链表叫做空任务块链表 即相当于是一些空白的身份证 任务控制块链表 空任务控制块链表 uC OS II中提供了系统函数OSTaskDel 用于删除一个任务 实质就是将该任务的TCB从 任务控制块列表 移到了 空任务控制块列表 任务控制块及任务控制块链表 任务控制块 就相当于是一个任务的身份证 没有任务控制块的任务是不能被系统承认和管理 任务控制块链表 任务控制块及任务控制块链表 任务控制块链表其他相关系统管理变量 OSTCBPrioTbl OS TCB 数据类型的数组 以Prio为下标存放已使能的TCB指针 用于加速TCB的访问 OSTCBCur 全局系统变量 指向当前正在运行的任务的TCB OSTCBFreeList OSTCBListOSTCBTbl OSInit 建立的任务控制块数组OSTCBPrioTbl 任务控制块优先级数组OSTCBCur 什么是多任务系统 简单地说 就是能用一个处理器并发 注意 不是同时 地运行多个程序的计算机管理系统 并发 由同一个处理器轮换地运行多个程序 或者说是由多个程序轮班地占用处理器这个资源 且在占用这个资源期间 并不一定能够把程序运行完毕 并发过程示意图 处理器如何进行程序的切换 程序的切换 处理器是个傻瓜 PC让它干啥 它就干啥 PC是个指路器 它指向哪儿 处理器就去哪儿 从此可以知道 哪个程序占有了PC 哪个程序就占有了处理器 深刻地理解PC是理解系统进行程序切换动作的关键 如何操作PC 指令 不同的计算机类型的指令是不同的 数据传送指令子程序返回指令 由堆栈弹出 中断 中断返回指令 由堆栈弹出 任务代码 任务堆栈 内存 处理器 任务运行时与处理器之间的关系 处理器通过两个指针寄存器 PC和SP 来与任务代码和任务堆栈建立联系并运行它 寄存器组 运行环境包括了两部分 处理器中的运行环境和内存中的运行环境 处理器 多任务时的问题 当有多个任务时 处理器中的运行环境应该怎么办 寄存器组 程序运行环境 多任务时任务与处理器之间关系的处理 程序 在内存中为每个任务创建一个虚拟的处理器 处理器部分的运行环境 由操作系统的调度器按某种规则来进行这两个复制工作 寄存器组 寄存器组 也就是说 任务的切换是任务运行环境的切换 虚拟处理器 虚拟处理器应该存储的主要信息 1 程序的断点地址 PC 2 任务堆栈指针 SP 3 程序状态字寄存器 PSW 4 通用寄存器内容5 函数调用信息 已存在于堆栈 这些内容通常保存在任务堆栈中 这些内容也常叫做任务的上下文 其实 程序切换的关键是把程序的私有堆栈指针赋予处理器的堆栈指针SP 实质上系统是通过SP的切换来实现程序的切换的 要建立一个概念 具有控制块的程序才是一个可以被系统所运行的任务 程序代码 私有堆栈 任务控制块是任务的三要件 任务控制块提供了运行环境的存储位置 任务就绪表及任务调度 多任务操作系统的核心工作就是任务调度 所谓调度 就是通过一个算法在多个任务中确定该运行的任务 做这项工作的函数就叫做调度器 C OS II进行任务调度的思想是 近似地每时每刻总是让优先级最高的就绪任务处于运行状态 为了保证这一点 它在系统或用户任务调用系统函数及执行中断服务程序结束时总是调用调度器 来确定应该运行的任务并运行它 C OS II进行任务调度的依据就是任务就绪表 内核对任务的调度 内核的主要职责之一 决定任务运行的次序 基本的调度算法 有先来先服务FCFS 最短周期优先SBF优先级法Priority轮转法Round Robin调度的基本方式有可占先式和非占先式 多数实时内核是基于优先级调度的多种方法的复合 优先级的概念每个任务按其重要性被赋予一定的优先级 静态优先级与动态优先级 基于优先级的系统会出现优先级倒置的问题 一个好的实时内核应该提供解决倒置的方法 已开发出多种算法用于实时任务的优先级分配 基本的有单调执行率调度法RMS和最早期限优先法EDF等 非抢占式 不可剥夺式 的任务 Non PreemptiveKernel 非抢占内核要求每个任务自我放弃CPU的所有权 异步事件还是由中断服务来处理 中断服务可以使一个高优先级的任务由挂起状态变为就绪状态 中断服务以后控制权还是回到原来被中断了的那个任务 优点 不可剥夺型内核的一个优点是响应中断快问题 不可剥夺型内核的任务级响应时间是不确定的 不知道什么时候最高优先级的任务才能拿到CPU的控制权 完全取决于应用程序什么时候释放CPU 基于优先级的抢占式调度 最高优先级的任务一旦就绪 总能得到CPU的控制权当一个运行着的任务使一个比它优先级高的任务进入了就绪态 时钟机制 当前任务的CPU使用权就被剥夺了 或者说被挂起了那个高优先级的任务立刻得到了CPU的控制权 如果是中断服务子程序使一个高优先级的任务进入就绪态中断完成时 中断了的任务被挂起 优先级高的那个任务开始运行 抢占式内核总是让就绪态的高优先级的任务先运行 中断服务程序可以抢占CPU 到中断服务完成时 内核让此时优先级最高的任务运行 不一定是那个被中断了的任务 任务级系统响应时间得到了最优化 时间片轮转调度 当两个或两个以上任务有同样优先级 内核允许一个任务运行事先确定的一段时间 叫做时间额度 quantum 然后切换给另一个任务 也叫做时间片调度 内核在满足以下条件时 把CPU控制权交给下一个任务就绪态的任务当前任务已无事可做当前任务在时间片还没结束时已经完成了 抢占式任务调度问题 优先级反转 优先级反转 任务1 任务2 任务3 因为任务1要等 任务3释放占有的那个共享资源 由于任务2剥夺任务3的CPU使用权使任务1的状况更加恶化 任务2使任务1增加了额外的延迟时间 任务1和任务2的优先级发生了反转 优先级继承 Priorityinheritance 方法解决优先级反转 内核知道该信号量被任务3占用了 而任务3的优先级比任务1低 内核于是将任务3的优先级升至与任务1一样问题 TASK3和TASK2的优先级反转 目录 嵌入式操作系统概念嵌入式操作系统的基本原理 uC OS II 任务和调度中断和时钟管理任务同步和通信动态内存管理 uC OS II的中断 基本概念 中断 任务正在执行过程中被某紧要事件打断运行 而去处理该紧迫事件的过程 中断源 中断信号的申请者 中断响应 CPU对中断信号相应处理的机制 中断嵌套 优先级高的中断可以再中断低级的ISR ISR 某紧要事件的 中断服务处理程序 中断向量 ISR的入口地址 ARM处理器中断控制原理 VICIntSelect 中断选择寄存器 配置32个中断源的F I属性 1 FIQ VICIntEnable 中断使能寄存器 控制相应通道中断申请屏蔽否 1 使能 异常向量表ResetLDRPC ResetAddrLDRPC UndefinedAddrLDRPC SWI AddrLDRPC PrefetchAddrLDRPC DataAbortAddrDCD0 xb9205f80LDRPC PC 0 xff0 LDRPC FIQ AddrResetAddrDCDResetInitUndefinedAddrDCDUndefinedSWI AddrDCDSoftwareInterruptPrefetchAddrDCDPrefetchAbortDataAbortAddrDCDDataAbortNouseDCD0IRQ AddrDCD0FIQ AddrDCDFIQ Handler 8个字单元 每单元存放一条转移指令 8个字单元 每单元存放一条目标地址 0 x00 0 x04 0 x08 0 x0c 0 x10 0 x14 0 x18 0 x1c FIQ中断的响应 IRQ中断的响应 在存储器0 x1c单元安排有指令 LDRPC FIQ Addr 在存储器0 x18单元安排有指令 LDRPC PC 0 xff0 备注 执行本指令时 PC 0 x0000 0020 0 x0000 0020 0 x0000 0ff0 0 x0000 0020 0 xffff f010 0 xffff f030 即VICVectAddr寄存器 1 硬件自动过程 2 ISR过程 无高级任务激活返回 有高级任务激活返回 uC OS II的中断 uC OS II的中断过程 在应用系统设计中编写uC OS II的中断服务程序 ISR 时 要用到两个重要的系统函数 OSIntEnter OSIntExit uC OS II允许中断嵌套 最多可嵌套255层 系统全局变量OSIntNesting记录中断嵌套层数 uC OS II的中断 系统函数OSIntEnter OSIntExit OSIntEnter OSIntExit 函数原型 voidOSIntEnter void 主要功能 系统变量OSIntNesting自加1 目的告诉uC OS II系统记录中断的嵌套层数 函数原型 voidOSIntExit void 主要功能 系统变量OSIntNesting自减1 目的告诉uC OS II系统中断的嵌套层数 OSIntNesting 0时 则进行一次中断级的任务调度OSIntCtxSw uC OS II的中断 应用程序中的临界段 临界段的基本概念及实现原理 uC OS II提供了两个宏操作用于临界段 工程应用中有 代码段必须被连续执行 的需求 这种不允许被打断执行的代码段称为 临界代码段 或 原子操作 通过开关CPU中断来实现 OS ENTER CRITICAL 进入临界段OS EXIT CRITICAL 退出临界段 注意事项 用户原子操作尽量的少且小 因为它会影响系统的实时性 uC OS II的中断 应用程序中的临界段举例 在uC OS II系统文件中很多地方都要用到 在用户程序中也可能用到 如进行PLL重置 PLLCON V PLLCON DATA PLLCFG V PLLCFG DATA OS ENTER CRITICAL 进入临界段PLLFEED 0 xaa PLLFEED 0 x55 OS EXIT CRITICAL 退出临界段 uC OS II的中断 uC OS II的中断服务程序 ISR 的编写 uC OS II对ARM7TDMI的IRQ进行了管理 用户的使用方式与不受管理的FIQ有较大的区别 uC OS II在对ARM7TDMI移植时已作了处理 ARM IRQ inc文件 用户可以直接使用C语言编程ISR 此之前用户要编写VIC配置及ISR句柄关联代码 voidxxx Eception void OS ENTER CRITICAL 清除中断源标志 VICVectAddr 0 通知VIC中断已响应ISR业务代码 OS EXIT CRITICAL uC OS II的中断 uC OS II的中断服务程序 ISR 的编写 中断句柄 uC OS II约定 每个受控的ISR都必须按照ADS汇编宏的格式要求 在IRQ s的尾部添加中断句柄 xxx HandlerHANDLERxxx Exception 备注 xxx Handeler句柄是在target c文件voidVICInit void 函数中约定的 中断源用 中断源通道号 对应指派 HANDLER是语言关键词 keyword xxx Exception是ISR的函数名 在中断源正式工作前 首先要进行 中断源初始化 VIC初始化 这部分的代码一般编放在一个硬件系统初始化函数中 该函数一般是编写在target c文件中 代码少的话 也可以放在main 函数中 uC OS II的中断 uC OS II的中断服务程序 ISR 的编写 VIC配置 VIC初始化部分主要是 用 中断通道号 指定中断源和对应的中断句柄 例如 指定Timer1的ISR句柄为 Timer1 Handler 并将其配置到硬件优先级10代码如下 voidVICInit void externvoidTimer1 Handler void VICVectAddr10 uint32 Timer1 Handler VICVectCntl10 0 x20 0 x05 VICIntEnable 1 5 允许Timer1中断 在IRQ s文件的尾部添加中断句柄指定 Timer1 HandlerHANDLERTimer1 Exception编写Timer1 ISR Timer1 Exception voidTimer1 Exception void 关中断 清中断 通知VIC中断已响应 开中断 C代码完成Timer1具体业务处理 uC OS II的中断 uC OS II的中断服务程序 ISR 的编写 外设初始化 若想使指定的外设按照我们约定的方式工作 需对它进行初始化 此部分代码主要工作 设置外设的工作方式 例如 设置Timer1的定时常数 中断允许否 代码如下 voidTimer1Init void T1IR 0 xffffffff 清除Timer1的中断标示 T1TC 0 Timer1的定时计数器TC赋初值 T1TCR 0 x01 Timer1使能 设置匹配常数 uC OS II的中断 uC OS II的中断使用策略 备注 具体情况具体分析 起因 故而 uC OS II对任务有完备的管理能力 一系统函数的方式为用户提供了丰富的管理手段 硬件层上希望ISR尽量的短 通常并不将中断事件对应的业务处理代码安排在ISR中 而是在ISR中仅安排产生 信号 或 消息 将物理级的中断事件转换为逻辑级的事件 通过中断级任务器OSIntCtxSw 调度 再完成具体功能 uC OS II的时钟 任何OS都需要一个标准时钟作为系统资源 驱动OS前行 如用于系统定时 延时 超时判断等 定时通常由硬件定时器实现 uC OS II移植到ARM上时 用Timer0实现它的 标准时钟 其周期的设置方法 在uC OS II配置文件OS CFG H中用宏定义方式设置 defineOS TICKS PER SEC200 片内外设Timer0的ISR Tmier0 Exception 在有些书中称为OSTickISR 通过调用OSTimeTick 函数 完成每个OS节拍的系统工作 uC OS II的时钟 uC OS II的OSTimeTick 函数的两个基本功能 OSTime 它位于OS CORE C文件 INT32U类型 遍历TCB链表 将任务延时变量OSTCBDly 若该变量为0 且该任务又不是Suspend 则将该任务转入到 就绪状态 备注 OSTimeTick 函数是uC OS II的基本组成部分 位于OS CORE C文件中 该函数中内嵌了OSTimeTickHook 时钟钩子函数 用户可以将目标系统中需要单节拍触发的业务安排在此函数中 uC OS II的时间管理 任务延时 取消延时 获取 设置系统时间等操作 任务的延时 uC OS II规定除了OSTaskIdel 之外的所有任务必须在任务体中合适的位置安排OSTimeDly 函数 使本任务的运行能延时 暂停 一段时间或xxxPend函数 使其他任务有机会得到CPU运行机会 备注 OSTimeDly 函数结束时会进行一次任务调度 两个延时函数的原型 voidOSTimeDly INT16Uticks ticks是节拍数 INT8UOSTimeDlyHMSM INT8Uhours INT8Uminutes INT8Useconds INT16Umilli 绝对时间延时 位于OS TIME C 备注 参数值域hours 255 minutes 59 seconds 59 milli 999 取消任务的延时 uC OS II提供了系统函数OSTimeDlyResume 可用于取消指定任务的延时而进入 就绪状态 OSTimeDlyResume 函数的原型 OS Time C文件中 INT8UOSTimeDlyResume INT8Uprio 备注 函数返回值OS NO ERR 正常取消 OS TIME NOT DLY 延时已到 uC OS II的时间管理 任务延时 取消延时 获取 设置系统时间等操作 获取 设置系统时间 uC OS II系统变量INT32UOSTime用于记录系统时钟的时钟节拍数 在OSInit 时被初始化为0 之后每一个tickOSTime uC OS II提供两个系统函数可 读 写 OSTime 读 写 OSTime系统变量的函数原型 INT32UOSTimeGet void 返回OSTime当前值 voidOSTimeSet INT32Uticks 重置OSTime uC OS II的时间管理 任务延时 取消延时 获取 设置系统时间等操作 目录 嵌入式操作系统概念嵌入式操作系统的基本原理 uC OS II 任务和调度中断和时钟管理任务同步和通信动态内存管理 什么是任务的同步和通信 一个应用系统通常是由多个任务组成 任务之间互相协作共同完成目标功能 例如任务对共享资源竞争 先采集数据才能处理数据等情况 任务的同步控制 共享资源的竞争 任务间的通信等问题的解决方案 OS 任务间的同步 任务间的制约 合作运行机制 系统各任务之间通过 任务通信 的方式 实现任务的信息传递和同步控制 任务通信 的载体就是 事件 常用的事件 信号量 计数型 SEM 互斥型 MUTEX 消息邮箱 MBOX 消息队列 Q 事件标志组等 事件用 事件控制块 ECB 来描述 任务间的同步 任务间的同步 各任务运行的先后 触发等关系 备注 数据采集任务A和数据处理任务B之间存在同步关系 任务间的互斥 共享资源的申请使用 备注 数据采集任务A和数据处理任务B之间存在互斥关系 任务间的互斥 任务间的同步和事件控制块 任务之间的这种相互制约 相互合作的运行机制称为 任务间的同步 系统中任务之间相互传递事件 来实现任务的同步 协作 备注 用户自定义全局变量的方法 也可以编程实现程序间的信息传递 但如果想将信息传递的各项功能作完备 工作量是比较大的 况且 这类需求在应用系统设计中是很常用的 uC OS II中将此类工作以系统功能方式提供与用户 事件操作 举例 任务间的共享资源竞争问题及处理方式 某一分布式系统 需要主设备 M Dev 使用同一个UART资源分别与从设备1 S Dev1 和从设备2 S Dev2 以不同的 串行通信模式 进行通信 voidmain void 系统主函数 OSInit OSTaskCreate Task A void pdata OSTaskCreate Task B void pdata OSStart voidTask A void pdata Task A环境初始化for Task A业务OSTaskCreate UART S1 Task void US1 Task A业务OSTimeDly xxx voidTask B void pdata Task B环境初始化for Task B业务OSTaskCreate UART S2 Task void US2 Task B业务OSTimeDly yyy 说明 如此设计未对共享资源作任何约束 实际运行中可能发生Task A与Task B冲突竞争 BOOLEANuart key voidmain void 系统主函数 OSInit uart key TRUE OSTaskCreate Task A void pdata OSTaskCreate Task B void pdata OSStart voidTask A void pdata Task A环境初始化for Task A业务if uart key uart key FALSE OSTaskCreate UART S1 Task void US1 uart key TRUE Task A业务OSTimeDly xxx voidTask B void pdata Task B环境初始化for Task B业务if uart key uart key FALSE OSTaskCreate UART S2 Task void US2 uart key TRUE Task B业务OSTimeDly yyy 互斥型任务处理 说明 通过用户定义全局变量uart key对任务使用共享资源作约束 可以避免Task A与Task B冲突竞争 但其管理性能支持较弱 void msg ptr INT16UAD Value voidmain void 系统主函数 OSInit OSTaskCreate Task A void pdata OSTaskCreate Task B void pdata OSStart voidTask A void pdata Task A环境初始化for Task A业务if msg ptr NULL Signal Capture AD Value 采集数据msg ptr voidTask B void pdata Task B环境初始化INT16UAD B for Task B业务if msg ptr NULL AD B msg ptr 数据处理msg ptr NULL Task B业务OSTimeDly yyy 带数据传递的协作型任务处理 说明 Task A数据采集任务 Task B数据处理任务 通过用户定义全局指针变量msg ptr对 采集 处理数据 任务作约束 可以协调Task A与Task B 但其管理性能支持较弱 任务间的同步和事件控制块 事件 汉语中所谓的 事件 是指一个事情的发生 在uC OS II中将信号量 消息邮箱和消息队列的一个存在称为一个事件 事件操作 创建 发送 请求和删除等 uC OS的原作者将 事件 EVENT 理解为静态的数据结构 发送事件 向信号量 消息邮箱和消息队列的一次信息发送 写 Post 操作 请求事件 对信号量 消息邮箱和消息队列的一次查询 读 Pend 操作 uC OS II中以系统函数的方式向任务提供事件操作 任务间的同步和事件控制块 事件 1 信号量 Sem Mutex 两类信号量 互斥信号量 Mutex 计数型信号量 Sem 互斥信号量是一个二值信号量 主要用于 独占式共享资源 的管理 例如 打印机 计数型信号量用以 多个同类型资源 的管理 通常用一个计数器实现 例如 存储块 BOOLEANuart key 互斥标志voidmain void 系统主函数 OSInit uart key TRUE OSTaskCreate Task A void pdata OSTaskCreate Task B void pdata OSStart voidTask A void pdata Task A环境初始化for Task A业务if uart key uart key FALSE OSTaskCreate UART S1 Task void US1 uart key TRUE Task A业务OSTimeDly xxx voidTask B void pdata Task B环境初始化for Task B业务if uart key uart key FALSE OSTaskCreate UART S2 Task void US2 uart key TRUE Task B业务OSTimeDly yyy 互斥型任务处理 说明 通过用户定义全局变量uart key对任务使用共享资源作约束 可以避免Task A与Task B冲突竞争 但其管理性能支持较弱 任务间的同步和事件控制块 事件 2 消息邮箱 Mbox 用于解决任务间的数据传送问题 在多任务OS中采用消息传送的方式实现任务间的 单批次数据 通信 这个数据称为 消息 例如 Task A采集一个数据 Task B要使用Task A采集的数据 原理 在内存中创建数据传送缓冲区 消息缓冲区 通过传送该缓冲区的地址指针传递数据 这个缓冲区指针的数据结构称为 消息邮箱 任务间的同步和事件控制块 事件 2 消息邮箱 Mbox 任务间的同步和事件控制块 事件 3 消息队列 Q 用于解决任务间的 多个数据 传送问题 在多任务OS中 采用 指针数组 的方式进行多数据的传送 这个指向 指针数组 的指针 指针数组 消息缓冲区所构成的数据结构称为 消息队列 任务间的同步和事件控制块 等待任务列表 当一个 事件 被占用时 其它请求该事件的任务暂时得不到事件的服务 处于等待状态 OS使用 等待任务表 管理 事件 即使用 等待任务表 对那些等待该事件的各个任务进行管理 记录等待该事件的任务并排序 任务等待事件有限时等 每个事件都有一个 等待任务表 用于完成事件对任务的驱动 限时等管理 其原理类似于任务就续表 任务等待事件限时则记录在TCB的OSTCBDly成员中 每个Tick都会对其进行维护 当限时到时uC OS II强行将其转入就续状态 任务间的同步和事件控制块 事件控制块 ECB uC OS II使用ECB的数据结构统一描述三类事件 信号量 消息邮箱 消息队列 uC OS II中的ECB数据结构如下 typedefstruct INT8UOSEventType 事件类型INT16UOSEventCnt 计数信号量的计数器void OSEventPtr 消息 消息队列 指针INT8UOSEventGrp 等待事件的任务组INT8UOSEventTbl OS EVENT TBL SIZE 任务等待表 OS EVENT 任务间的同步和事件控制块 事件控制块 ECB 的结构 OSEventType取值含义 OSEventTbl 任务等待表 任务间的同步和事件控制块 空事件控制块 ECB 链表 uC OS II初始化 OSInit 时 按OS CFG H中OS MAX EVENTS定义的系统事件总数创建该链表 使用中应用系统每创建一个事件 都会从此链表中申请一个空ECB 并填写相关成员初值 删除一个事件时 会将相应事件的ECB归还该链表 任务间的同步和事件控制块 事件控制块 ECB 操作函数 uC OS II有三类事件 信号量 Sem 互斥信号量 Mutex 消息邮箱 Mbox 消息队列 Q uC OS II中对每种事件提供5个基本操作函数 供用户管理事件 这些系统函数定义在相应的 事件 文件中 OSxxxCreate 创建事件 OSxxxPost 发送事件 OSxxxPend 请求事件 OSxxxDel 删除事件 OSxxxQuery 查看事件 备注 其中xxx为事件名 Sem Mutex Mbox Q 信号量及其操作 信号量 Sem 1 信号量事件的数据成员OSEventType OS EVENT TYPE SEM OSEventPtr Null2 有任务申请某信号量时 if TheECB OSEventCnt 0 then OSEventCnt TheTaskGoon else SettheTaskatWAIT STATE 3 有任务发送某信号量时 if noTaskWaittingtheSEM then TheECB OSEventCnt else SettheH Prio TASkatREADY OS Sched 信号量及其操作 信号量的操作 创建信号量 信号量操作系统函数定义在OS SEM C文件 在使用信号量之前 必须创建信号量 创建信号量系统函数的原型 OS EVENT OSSemCreate INT16Ucnt 信号量计数初值 功能 从OSEventFreeList中申请一个ECB 并进行初始化 用cnt初始化ECB Sem OSEventCnt 返回一个已初始化的ECB的指针 OS EVENT UART Flag 声明事件指针变量INT8Uerr 声明全局状态变量 voidmain void OSInit UART Flag OSSemCreate 1 创建信号量OSTaskCreate Task A 创建任务AOSTaskCreate Task B 创建任务BOSStart 信号量的应用举例1 主函数部分 信号量及其操作 信号量的操作 发送信号量 发送信号量也称为释放信号量 释放信号量系统函数的原型 INT8UOSSemPost OS EVENT pevent 信号量指针指示释放目标 操作 检查是否还有等待该信号量的任务 若有则OS Sched 调度优先级最高的任务运行 否则OSEventCnt 函数返回值解释 OS NO ERR释放成功 OS ERR EVENT TYPE释放的不是信号量事件 OS SEM OVF信号量 个数 65535 溢出 voidTask A void pdata for 任务体A OSSemPend UART Flag 0 Task A延时nnnn个时钟节拍 信号量的应用举例1 任务部分 voidTask B void pdata for 任务体B OSSemPend UART Flag 0 Task B延时mmm个时钟节拍 信号量及其操作 信号量的操作 请求信号量 请求信号量系统函数的原型 voidOSSemPend OS EVENT pevent 信号量指针指示申请目标INT16Utimeout 等待限时 OSTick数INT8U err 函数执行情况 备注 参数timeout用于约定本任务等待申请信号量的时限 单位是Tick 当等待超时时 本任务被uC OS II直接转入就续状态 当该参数为0时 含义为无限时等待 通过查阅 err参数可知函数的执行情况 操作 如果信号量有效 ECB Sem OSEventCnt 0 则OSEventCnt 本任务goon 否则 将申请的事件的ECB OSEventGrp及OSEventTbl 相应位置1 本Task转入Wait状态并执行OS Sched 信号量及其操作 信号量的操作 请求信号量 请求信号量系统函数的原型 voidOSSemPend OS EVENT pevent 信号量指针指示申请目标INT16Utimeout 等待限时INT8U err 函数执行情况 函数返回值解释 OS NO ERR信号量申请成功 OS ERR EVENT TYPE申请的不是信号量事件 OS ERR EVENT NULL申请的信号量不存在 OS ERR PEND ISR不能在ISR中申请信号量 OS TIMEOUT申请信号量超时退出 voidTask A void pdata for 任务体A OSSemPend UART Flag 0 Task A延时nnnn个时钟节拍 信号量的应用举例1 任务部分 voidTask B void pdata for 任务体B OSSemPend UART Flag 0 Task B延时mmm个时钟节拍 信号量及其操作 信号量的操作 无等待请求信号量 无等待请求信号量系统函数的原型 INT16UOSSemAccept OS EVENT pevent 信号量指针指示申请目标 该函数无等待地申请指定的信号量 函数返回值解释 0信号量申请成功 0信号量申请不成功 信号量及其操作 信号量的操作 删除信号量 删除信号量系统函数的原型 OS EVENT OSSemDel OS EVENT pevent 信号量指针指示删除目标INT8Uopt 删除条件 方式INT8U err 函数执行情况 备注 信号量不能在ISR中删除 1 删除系统不再使用的信号量 归还事件资源
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025自考专业(计算机信息管理)复习提分资料附参考答案详解(夺分金卷)
- 2025年一级建造师测试卷及完整答案详解【易错题】
- 2025年房地产营销顾问项目启动指导合同
- 2025年度汽车车身贴膜与防护服务合同
- 2024年收银审核员试题预测试卷附参考答案详解【综合题】
- 中班音乐教案及教学反思
- 施工安全员a证考试及答案
- 鹿城区安全员证考及答案1
- 2024年自考专业(金融)自我提分评估含完整答案详解(典优)
- 2025年汽车机修考试题及答案
- 创伤记忆的集体性遗忘-洞察及研究
- 浙江科技大学《高等数学Ⅱ》2025-2026学年期末试卷(A卷)
- 13 唐诗五首《钱塘湖春行》课件
- (高清版)DB11∕T 2456-2025 消防安全管理人员能力评价规范
- 胎心监护及并发症处理
- 锁骨骨折术后护理
- 酒店餐饮部主管考试题库
- 产业策划投标方案(3篇)
- 眼科常见疾病及其用药
- 脑疝患者的急救及护理
- 2025年广西专业技术人员继续教育公需科目(一)答案
评论
0/150
提交评论