已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
uCOS II 初级程序员指南初级程序员指南 一 一 uC OS II 简介简介 uC OS II 是一种基于优先级的可抢先的硬实时内核 自从 年发布以来 在世界各地都获得 了广泛的应用 它是一种专门为嵌入式设备设计的内核 目前已经被移植到 多种不同结构的 CPU 上 运行在从 位到 位的各种系统之上 尤其值得一提的是 该系统自从 51 版本之后 就通过 了美国 FAA 认证 可以运行在诸如航天器等对安全要求极为苛刻的系统之上 鉴于 uC OS II 可以 免费获得代码 对于嵌入式 RTOS 而言 选择 uC OS 无疑是最经济的选择 二 二 uC OS II 应用程序基本结构应用程序基本结构 应用 uC OS II 自然要为它开发应用程序 下面论述基于 uC OS II 的应用程序的基本结构以及注意 事项 每一个 uC OS II 应用至少要有一个任务 而每一个任务必须被写成无限循环的形式 以下是推荐 的结构 void task void pdata INT8U err InitTimer 可选 For 你的应用程序代码 OSTimeDly 1 可选 以上就是基本结构 至于为什么要写成无限循环的形式呢 那是因为系统会为每一个任务保留一 个堆栈空间 由系统在任务切换的时候换恢复上下文 并执行一条 reti 指令返回 如果允许任务执行 到最后一个花括号 那一般都意味着一条 ret 指令 的话 很可能会破坏系统堆栈空间从而使应用程 序的执行不确定 换句话说 就是 跑飞 了 所以 每一个任务必须被写成无限循环的形式 程序员一 定要相信 自己的任务是会放弃 CPU 使用权的 而不管是系统强制 通过 ISR 还是主动放弃 通过 调用 OS API 现在来谈论上面程序中的 InitTimer 函数 这个函数应该由系统提供 程序员有义务在优先级最 高的任务内调用它而且不能在 for 循环内调用 注意 这个函数是和所使用的 CPU 相关的 每种系统 都有自己的 Timer 初始化程序 在 uC OS II 的帮助手册内 作者特地强调绝对不能在 OSInit 或 者 OSStart 内调用 Timer 初始化程序 那会破坏系统的可移植性同时带来性能上的损失 所以 一 个折中的办法就是象上面这样 在优先级最高的程序内调用 这样可以保证当 OSStart 调用系统内 部函数 OSStartHighRdy 开始多任务后 首先执行的就是 Timer 初始化程序 或者专门开一个优 先级最高的任务 只做一件事情 那就是执行 Timer 初始化 之后通过调用 OSTaskSuspend 将自 己挂起来 永远不再执行 不过这样会浪费一个 TCB 空间 对于那些 RAM 吃紧的系统来说 还是不 用为好 三 三 一些重要的一些重要的 uC OS II API 介绍介绍 任何一个操作系统都会提供大量的 API 供程序员使用 uC OS II 也不例外 由于 uC OS II 面 向的是嵌入式开发 并不要求大而全 所以内核提供的 API 也就大多和多任务息息相关 主要的有以 下几类 任务类 消息类 同步类 时间类 临界区与事件类 我个人认为对于初级程序员而言 任务类和时间类是必须要首先掌握的两种类型的 API 下面我就来 介绍比较重要的 OSTaskCreate 函数 这个函数应该至少在 main 函数内调用一次 在 OSInit 函数调用之后调用 作用就是创建一个任务 目前有四个参数 分别是任务的入口地址 任务的参数 任务堆栈的首地址和任务的优先级 调用本函 数后 系统会首先从 TCB 空闲列表内申请一个空的 TCB 指针 然后将会根据用户给出参数初始化任 务堆栈 并在内部的任务就绪表内标记该任务为就绪状态 最后返回 这样一个任务就创建成功了 OSTaskSuspend 函数 这个函数很简单 一看名字就该明白它的作用 它可以将指定的任务挂起 如果挂起的是当前任务的 话 那么还会引发系统执行任务切换先导函数 OSShed 来进行一次任务切换 这个函数只有一个参 数 那就是指定任务的优先级 那为什么是优先级呢 事实上在系统内部 优先级除了表示一个任务 执行的先后次序外 还起着分别每一个任务的作用 换句话说 优先级也就是任务的 ID 所以 uC OS II 不允许出现相同优先级的任务 OSTaskResume 函数 这个函数和上面的函数正好相反 它用于将指定的已经挂起的函数恢复成就绪状态 如果恢复任务的 优先级高于当前任务 那么还为引发一次任务切换 其参数类似 OSTaskSuspend 函数 为指定任务 的优先级 需要特别说明是 本函数并不要求和 OSTaskSuspend 函数成对使用 OS ENTER CRITICAL 宏 很多人都以为它是个函数 其实不然 仔细分析一下 OS CPU H 文件 它和下面马上要谈到的 OS EXIT CRITICAL 都是宏 他们都是涉及特定 CPU 的实现 一般都被替换为一条或者几条嵌入 式汇编代码 由于系统希望向上层程序员隐藏内部实现 故而一般都宣称执行此条指令后系统进入临 界区 其实 它就是关个中断而已 这样 只要任务不主动放弃 CPU 使用权 别的任务就没有占用 CPU 的机会了 相对这个任务而言 它就是独占了 所以说进入临界区了 这个宏能少用还是少用 因 为它会破坏系统的一些服务 尤其是时间服务 并使系统对外界响应性能降低 OS EXIT CRITICAL 宏 这个是和上面介绍的宏配套使用另一个宏 它在系统手册里的说明是退出临界区 其实它就是重新开 中断 需要注意的是 它必须和上面的宏成对出现 否则会带来意想不到的后果 最坏的情况下 系统 会崩溃 我们推荐程序员们尽量少使用这两个宏调用 因为他们的确会破坏系统的多任务性能 OSTimeDly 函数 这应该程序员们调用最多的一个函数了 这个函数完成功能很简单 就是先挂起当起当前任务 然后进 行任务切换 在指定的时间到来之后 将当前任务恢复为就绪状态 但是并不一定运行 如果恢复后是优 先级最高就绪任务的话 那么运行之 简单点说 就是可以任务延时一定时间后再次执行它 或者说 暂时放弃 CPU 的使用权 一个任务可以不显式的调用这些可以导致放弃 CPU 使用权的 API 但那样多任务性能会大大降低 因为此时仅仅依靠时钟机制在进行任务切换 一个好的任务应该 在完成一些操作主动放弃使用权 好东西要大家分享嘛 四 四 uC OS II 多任务实现机制分析多任务实现机制分析 前面已经说过 uC OS II 是一种基于优先级的可抢先的多任务内核 那么 它的多任务机制到底 如何实现的呢 了解这些原理 可以帮助我们写出更加健壮的代码来 由于我们面向的初级程序员 本文不打算写成又一篇 uC OS II 的源码分析 那样的文章太多了 本文打算从实现原理的角度探讨 这个问题 首先我们来看看为什么多任务机制可以实现 其实在单一 CPU 的情况下 是不存在真正的多任务机 制的 存在的只有不同的任务轮流使用 CPU 所以本质上还是单任务的 但由于 CPU 执行速度非常快 加 上任务切换十分频繁并且切换的很快 所以我们感觉好像有很多任务同时在运行一样 这就是所谓的 多任务机制 由上面的描述 不难发现 要实现多任务机制 那么目标 CPU 必须具备一种在运行期更改 PC 的途径 否则无法做到切换 不幸的是 直接设置 PC 指针 目前还没有哪个 CPU 支持这样的指令 但是一般 CPU 都允许通过类似 JMP CALL 这样的指令来间接的修改 PC 我们的多任务机制的实现也正是基 于这个出发点 事实上 我们使用 CALL 指令或者软中断指令来修改 PC 主要是软中断 但在一些 CPU 上 并不存在软中断这样的概念 所以 我们在那些 CPU 上 使用几条 PUSH 指令加上一条 CALL 指令来模拟一次软中断的发生 回想一下你在微机原理课程上学过的知识 当发生中断的时候 CPU 保存当前的 PC 和状态寄存器的 值到堆栈里 然后将 PC 设置为中断服务程序的入口地址 再下来一个机器周期 就可以去执行中断服 务程序了 执行完毕之后 一般都是执行一条 RETI 指令 这条指令会把当前堆栈里的值弹出恢复到状 态寄存器和 PC 里 这样 系统就会回到中断以前的地方继续执行了 那么设想一下 如果再中断的 时候 人为的更改了堆栈里的值 那会发生什么 或者通过更改当前堆栈指针的值 又会发生什么呢 如果更改是随意的 那么结果是无法预料的错误 因为我们无法确定机器下一条会执行些什么指令 但是如果更改是计划好的 按照一定规则的话 那么我们就可以实现多任务机制 事实上 这就是目前 几乎所有的 OS 的核心部分 不过他们的实现不像这样简单罢了 uC OS II v2 52 学习摘要学习摘要 一一 特别声明 本笔记是对 uc os ii 研究做一些重要的内核思路整理和心得记录 以日期为 作为记录块 故没有思路和规范可言 为此贴于工程师笔记里面 一来方便自己温故知新 二来希望能给初学者带来一些方便和帮助 高手别见笑 偶刚起步 另外 如有错误和 不当之处 请指正和发表您的心得体会 谢谢 2005 12 18 1 任务是一个无返回的无穷循环 uc os ii 总是运行进入就绪状态的最高优先级的任务 2 任务是如何调度 切换 的 因为 uc os ii 总是运行进入就绪状态的最高优先级的任务 所以 确定哪个任务优先级最高 下面该哪个任务运行 这个工作就是由调度器 scheduler 来完成的 任务级的调度是由函数 OSSched 完成的 而中断级的调度是由函数 OSIntExt 完成 对于 OSSched 它内部调用的是 OS TASK SW 完成实际的调度 人为模仿一次中断 OSIntExt 内部调用的是 OSCtxSw 实现调度 参考 P92 P106 任务切换其实很简单 由如下 2 步完成 1 将被挂起任务的处理器寄存器推入自己 的任务堆栈 2 然后将进入就绪状态的最高优先级的任务的寄存器值从堆栈中恢复到寄 存器中 参见 P92 1 作为 uc os ii 的一条普通原则 调用 uc os ii 功能函数时 中断总应当是开着 的 2 任务永不返回 就算任务自我删除 也绝对不会返回 任务删除并非代码删 除 只是 ucos ii 不会理会这任务 3 OSTimeTick 函数是 ucos ii 内部函数 用户无需调用 4 ucos ii 从中断返回之前 要判断被中断的任务是否还是就绪状态任务中优先 级最高的任务 3 OSInit 初始化示意图 我做了一个很好的图示 竟然粘贴不出来 没办法 4 任务的 5 种状态 参见 P79 图 睡眠态 task dormat 任务驻留于程序空间 rom 或 ram 中 暂时没交给 ucos ii 处理 就绪态 task ready 任务一旦建立 这个任务就进入了就绪态 运行态 task running 调用 OSStart 可以启动多任务 OSStart 函数只能调用 一次 一旦调用 系统将运行进入就绪态并且优先级最高的任务 等待状态 task waiting 正在运行的任务 通过延迟函数或 pend 挂起 相关函数后 将进入等待状态 中断状态 ISR running 正在运行的任务是可以被中断的 除非该任务将中断关闭或者 ucos ii 将中断关闭 5 任务控制块 OS TBC 任务一旦建立 任务控制块 OS TBC 将被赋值 OS TBC 是一个数据结构 当任务的 CPU 使用权被剥夺后 ucos ii 将把当前的任务状态存 放于 OS TBC 数据结构中 当任务的 CPU 使用权得到恢复后 任务控制块能确保任务能从 被中断点那一点丝毫不差地继续执行 每个任务都有自己的 OS TBC 控制块 OS TBC 的数量由 OS MAX TASK 决定 任务数 量少 当然 OS TBC 占用 RAM 的空间就少 所有的任务控制块 OS TBC 都是放在任务控制块列表数组 OSTCBTbl 中 在 ucos ii 初始 化时 所有任务控制块 OS TBC 都被链表连接成单向空任务链表 注意 OS TBC 全部驻留于 RAM 中 6 关于任务切换使用到的 OS TASK SW 函数 其中调用软中断实现寄存器的保持和 弹出 开始调用含软中断 ucos ii 强制处理器保存 psw pc 的当前值 最后通过执行中断 返回指令 pc 和 psw 的值装回到 cpu 中 2005 12 21 1 中断服务所做的事应尽量少做 应把大部分工作留给任务去做 2 OSIntExit 和 OSSched 有点相似 但 OSIntExit 使中断 nestiing 减 1 而重新调度的条 件是 中断 nesting 和锁定 nesting 计算器 OSLockNesting 均为 0 3 OS TASK SW 和 OSCtxSw 的区别 后者使用于中断服务程序中 中断返回已经对 cpu 做了保存工作 而前者需要采用模仿软中断返回指令实现 cpu 保存 4 时钟节拍 1 ucos ii 需要提供周期性的信号源 用于实现时间延迟和确认超时 节拍率应 为 10 100Hz 时钟节拍率越高 系统额外的负荷就越重 2 系统多任务启动时候 调用 OSStart 之后 第一件初始化事情就是初始化 定时中断 3 ucos ii 中的时钟节拍服务是通过在中断服务子程序 OSTickISR 中调用 OSTimeTick 实现的 OSTimeTick 跟踪所以任务的定时器和超时时限 时钟节拍中断服 从一般中断规则 含任务调度判断 5 OSTCBList 指向任务控制块链表的开始 而且它总是指向最新建立的任务 6 非常好的一个图示 OSInt 之后的变量和数据结构 请参阅 P112 7 启动多任务时 执行 OSStart 函数 OSStart 先从任务就绪表中找出用户建立的优先级 最高的任务的任务控制块 而后调用了 OSStartHighRdy 此函数实质上是将任务堆栈中 的保存内容返回到 cpu 寄存器中 然后执行一条中断返回指令 信号量专题 1 信号量的理解 1 uc os ii 的信号量是由两个部分组成 一部分是 16 位的无符号整型信号量的计数值 0 65535 另一部分是等待该信号量的任务组成的等待任务表 另外参考事件控制块 ECB 2 信号量可以是 2 值的变量 称为二值信号量 也可以是计数式的 根据信号量的值 内核跟踪那些等待信号量的任务 3 建立信号量的工作必须在任务级代码中或者多任务启动之前完成 4 任务要得到信号量的问题 想得到信号量的任务 必须执行等待操作 pend 如果信号量有效 非 0 则信号量减 1 任务得以继续运行 如果信号量无效 为 0 则等待信号量的任务就被列入等待信号量 的任务表中 多少内核允许定义等待超时 当等待时间超过了设定值 该信号量还是无效 则等待该信号量的任务进入就绪态 准备运行 并返回出错代码 等待超时错误 5 任务对信号量的释放问题 任务执行发信号 post 操作来释放信号量 如果没有任务等待信号量 那么信号量的值 仅是简单的加 1 则信号量大于 0 有效 如果有任务等待该信号量 那么就会有另一个 任务进入就绪态 信号量的值就不加 1 之后 这个释放的信号量给那个等待中的任务 要看内核如何调度的 收到信号量的任务 可能是如下两者之一 等待任务中 优先级最高的 uc os ii 仅支持这种方式 最早开始等待信号量的任务 如果是按先进先出 FIFO 原则 2 信号量的有效与无效问题 信号量有效 信号量的计算器非 0 OSEventCnt 0 信号量有效表示任务对资源可用 信号量无效 信号量的计算器为 0 信号量无效表示任务对目前资源不可用 需要等待其 他另一个任务 或者中断服务子程序 发出该信号量 OSSemPost 3 信号量的值 OSEventCnt 大小表示什么 二值信号量 表示任务可以独占共享资源 计数式信号量 用于某资源可同时为 N 个任务所用 4 信号量是如何实现任务之间的通信的 参见第 1 点的 4 5 概述 5 信号量有关的三个重要函数分析 OSSemCreate 创建一个信号量 注 由任务或启动代码操作 创建工作必须在任务级代码中或者多任务启动之前完成 功能只要是先获取一个事件控制 块 ECB 写入一些参数 其中调用了 OS EeventWaitListInt 函数 对事件控制块的等待任 务列表进行初始化 完成初始化工作后 返回一个该信号量的句柄 Handle OSSemPend 等待一个信号量 注 只能由任务操作 本函数应用于任务试图获得共享资源的使用权 任务需要与其他任务或中断同步及任务需 要等待特定事件发生的场合 如果任务 Task A 调用 OSSemPend 且信号量的值有效 非 0 那么 OSSemPend 递减信 号量计数器 OSEventCnt 并返回该值 换句话说 Task A 获取到共享资源的使用权了 之后就执行该资源 如果如果任务 Task A 调用 OSSemPend 且信号量的值无效 为 0 那么 OSSemPend 调 用 OS EventTaskWait 函数 把 Task A 放入等待列表中 等待到什么时候呢 要看 OSSemPost 或者等待超时情况 由它释放信号量并检查任务执行权 见下资料 不错 呵呵 有点懂了 OSSemPost 发出 释放 一个信号量 注 由任务或中断操作 本函数其中调用 OS EventTaskRdy 函数 把优先级最高的任务 Task A 在这假如是 Task A 另外假设当前调用 OSSemPost 的任务是 Task B 从等待任务列表中去除 并使 它进入就绪态 然后调用 OSSched 进行任务调
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电光源电路部件制造工安全生产意识模拟考核试卷含答案
- 2025年教师资格证(初中英语)面试模拟题库及答案
- 《GB-T 37303.6-2019船舶和海上技术 船舶操纵性 第6部分:模型试验特殊要求》专题研究报告
- 化纤聚合工安全文化模拟考核试卷含答案
- GBT 34749-2017《木材及木质复合材料耐火试验方法 锥形量热仪法》专题研究报告
- 《GBT 8960-2015 涤纶牵伸丝》专题研究报告
- 体育场馆管理员安全检查水平考核试卷含答案
- 香精配制工持续改进评优考核试卷含答案
- 海水珍珠养殖工创新方法竞赛考核试卷含答案
- 《GBT 34916-2017 纳米技术 多壁碳纳米管 热重分析法测试无定形碳含量》专题研究报告
- 在“生源差”的学校:别让“救火”拖垮整个班级
- 收购技术团队协议书
- 2026年国元农业保险股份有限公司管培生校园招聘考试笔试参考题库附答案解析
- T-CES 148-2022 配电网电化学储能系统规划配置导则
- 015《煤矿安全规程》修改条款学习辅导:第十五讲 电气
- 消防设施中断管理操作规范
- 2022北京首都师大附中高一12月月考化学试卷含答案解析
- 机房基本运维知识培训课件
- 道路建筑材料知识培训内容课件
- 事业单位保密知识培训课件
- 房土两税课件
评论
0/150
提交评论