ucos-ii中文书(邵贝贝)第3章
- 格式:pdf
- 大小:498.90 KB
- 文档页数:29
转:⼀步⼀步教你使⽤uCOS-II第⼀篇 UCOS介绍第⼀篇 UCOS介绍这个⼤家都知道。
呵呵。
考虑到咱们学习的完整性还是在这⾥唠叨⼀下。
让⼤家再熟悉⼀下。
⾼⼿们忍耐⼀下吧! uC/OS II(Micro Control Operation System Two)是⼀个可以基于ROM运⾏的、可裁减的、抢占式、实时多任务内核,具有⾼度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统(RTOS)。
为了提供最好的移植性能,uC/OS II最⼤程度上使⽤ANSI C语⾔进⾏开发,并且已经移植到近40多种处理器体系上,涵盖了从8位到64位各种CPU(包括DSP)。
uC/OS II可以简单的视为⼀个多任务调度器,在这个任务调度器之上完善并添加了和多任务操作系统相关的系统服务,如信号量、邮箱等。
其主要特点有公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。
内核属于抢占式,最多可以管理60个任务。
µC/OS-II 的前⾝是µC/OS,最早出⾃于1992 年美国嵌⼊式系统专家Jean brosse 在《嵌⼊式系统编程》杂志的5 ⽉和6 ⽉刊上刊登的⽂章连载,并把µC/OS 的源码发布在该杂志的B B S 上。
µC/OS 和µC/OS-II 是专门为计算机的嵌⼊式应⽤设计的,绝⼤部分代码是⽤C语⾔编写的。
CPU 硬件相关部分是⽤汇编语⾔编写的、总量约200⾏的汇编语⾔部分被压缩到最低限度,为的是便于移植到任何⼀种其它的CPU 上。
⽤户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件⼯具,就可以将µC/OS-II嵌⼈到开发的产品中。
µC/OS-II 具有执⾏效率⾼、占⽤空间⼩、实时性能优良和可扩展性强等特点,最⼩内核可编译⾄ 2KB 。
µC/OS-II 已经移植到了⼏乎所有知名的CPU 上。
u c o s i i中文书邵贝贝集团标准化工作小组 [Q8QX9QT-X8QQB8Q8-NQ8QJ8-M8QMN]第5章时间管理在节时钟节拍中曾提到,μC/OS-Ⅱ(其它内核也一样)要求用户提供定时中断来实现延时与超时控制等功能。
这个定时中断叫做时钟节拍,它应该每秒发生10至100次。
时钟节拍的实际频率是由用户的应用程序决定的。
时钟节拍的频率越高,系统的负荷就越重。
节讨论了时钟的中断服务子程序和节时钟节函数OSTimeTick——该函数用于通知μC/OS-Ⅱ发生了时钟节拍中断。
本章主要讲述五个与时钟节拍有关的系统服务:OSTimeDly()OSTimeDlyHMSM()OSTimeDlyResume()OSTimeGet()OSTimeSet()本章所提到的函数可以在文件中找到。
5.0任务延时函数,OSTimeDly()μC/OS-Ⅱ提供了这样一个系统服务:申请该服务的任务可以延时一段时间,这段时间的长短是用时钟节拍的数目来确定的。
实现这个系统服务的函数叫做OSTimeDly()。
调用该函数会使μC/OS-Ⅱ进行一次任务调度,并且执行下一个优先级最高的就绪态任务。
任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态。
注意,只有当该任务在所有就绪任务中具有最高的优先级时,它才会立即运行。
程序清单所示的是任务延时函数OSTimeDly()的代码。
用户的应用程序是通过提供延时的时钟节拍数——一个1 到65535之间的数,来调用该函数的。
如果用户指定0值[(1)],则表明用户不想延时任务,函数会立即返回到调用者。
非0值会使得任务延时函数OSTimeDly()将当前任务从就绪表中移除[(2)]。
接着,这个延时节拍数会被保存在当前任务的OS_TCB中[(3)],并且通过OSTimeTick()每隔一个时钟节拍就减少一个延时节拍数。
第4章任务管理 (1)4.0建立任务,OSTaskCreate() (2)4.1建立任务,OSTaskCreateExt() (6)4.2任务堆栈 (9)4.3堆栈检验,OSTaskStkChk() (11)4.4删除任务,OSTaskDel() (14)4.5请求删除任务,OSTaskDelReq() (17)4.6改变任务的优先级,OSTaskChangePrio() (20)4.7挂起任务,OSTaskSuspend() (23)4.8恢复任务,OSTaskResume() (25)4.9获得有关任务的信息,OSTaskQuery() (26)第4章任务管理在前面的章节中,笔者曾说过任务可以是一个无限的循环,也可以是在一次执行完毕后被删除掉。
这里要注意的是,任务代码并不是被真正的删除了,而只是µC/OS-Ⅱ不再理会该任务代码,所以该任务代码不会再运行。
任务看起来与任何C函数一样,具有一个返回类型和一个参数,只是它从不返回。
任务的返回类型必须被定义成void型。
在本章中所提到的函数可以在OS_TASK文件中找到。
如前所述,任务必须是以下两种结构之一:void YourTask (void *pdata){for (;;) {/* 用户代码 */调用µC/OS-Ⅱ的服务例程之一:OSMboxPend();OSQPend();OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTimeDly();OSTimeDlyHMSM();/* 用户代码 */}}或void YourTask (void *pdata){/* 用户代码 */OSTaskDel(OS_PRIO_SELF);}本章所讲的内容包括如何在用户的应用程序中建立任务、删除任务、改变任务的优先级、挂起和恢复任务,以及获得有关任务的信息。
µC/OS-Ⅱ可以管理多达64个任务,并从中保留了四个最高优先级和四个最低优先级的任务供自己使用,所以用户可以使用的只有56个任务。
第2章实时系统概念 (1)2.0 前后台系统(F OREGROUND/B ACKGROUND S YSTEM) (1)2.1 代码的临界段 (2)2.2 资源 (2)2.3 共享资源 (2)2.4 多任务 (2)2.5 任务 (3)2.6 任务切换(C ONTEXT S WITCH OR T ASK S WITCH) (4)2.7 内核(K ERNEL) (5)2.8 调度(S CHEDULER) (5)2.9 不可剥夺型内核(N ON-P REEMPTIVE K ERNEL) (5)2.10 可剥夺型内核 (6)2.11 可重入性(R EENTRANCY) (7)2.12 时间片轮番调度法 (9)2.13 任务优先级 (10)2.14 2.14静态优先级 (10)2.15 动态优先级 (10)2.16 优先级反转 (10)2.17 任务优先级分配 (12)2.18 互斥条件 (13)2.18.1关中断和开中断 (14)2.18.2测试并置位 (15)2.18.3禁止,然后允许任务切换 (15)2.18.4信号量(Semaphores) (16)2.19 死锁(或抱死)(D EADLOCK (OR D EADLY E MBRACE)) (21)2.20 同步 (21)2.21 事件标志(E VENT F LAGS) (23)2.22 任务间的通讯(I NTERTASK C OMMUNICATION) (24)2.23 消息邮箱(M ESSAGE M AIL BOXES) (25)2.24 消息队列(M ESSAGE Q UEUE) (26)2.25 中断 (27)2.26 中断延迟 (27)2.27 中断响应 (28)2.28 中断恢复时间(I NTERRUPT R ECOVERY) (29)2.29 中断延迟、响应和恢复 (29)2.30 中断处理时间 (30)2.31 非屏蔽中断(NMI) (31)2.32 时钟节拍(C LOCK T ICK) (33)I2.33 对存储器的需求 (35)2.34 使用实时内核的优缺点 (36)2.35 实时系统小结 (37)II1 第2章 实时系统概念实时系统的特点是,如果逻辑和时序出现偏差将会引起严重后果的系统。
/ 电子技术论坛 电子发烧友第一章: 第一章:范例在这一章里将提供三个范例来说明如何使用 C/OS-II。
笔者之所以在本书一开始就写 这一章是为了让读者尽快开始使用 C/OS-II。
在开始讲述这些例子之前,笔者想先说明一 些在这本书里的约定。
这些例子曾经用 Borland C/C++ 编译器(V3.1)编译过,用选择项产生 Intel/AMD80186 处理器(大模式下编译)的代码。
这些代码实际上是在 Intel Pentium II PC (300MHz)上 运行和测试过,Intel Pentium II PC 可以看成是特别快的 80186。
笔者选择 PC 做为目标系 统是由于以下几个原因:首先也是最为重要的,以 PC 做为目标系统比起以其他嵌入式环境, 如评估板,仿真器等,更容易进行代码的测试,不用不断地烧写 EPROM,不断地向 EPROM 仿 真器中下载程序等等。
用户只需要简单地编译、链接和执行。
其次,使用 Borland C/C++产 生的 80186 的目标代码(实模式,在大模式下编译)与所有 Intel、AMD、Cyrix 公司的 80x86 CPU 兼容。
1.00 安装 C/OS-II C/OS本书附带一张软盘包括了所有我们讨论的源代码。
是假定读者在 80x86,Pentium,或者 Pentium-II 处理器上运行 DOS 或 Windows95。
至少需要 5Mb 硬盘空间来安装 uC/OS-II。
请按照以下步骤安装: 1.进入到 DOS(或在 Windows 95 下打开 DOS 窗口)并且指定 C:为默认驱动器。
2.将磁盘插入到 A:驱动器。
3.键入 A:INSTALL 【drive】 注意『drive』是读者想要将 C/OS-II 安装的目标磁盘的盘符。
INSTALL.BAT 是一个 DOS 的批处理文件,位于磁盘的根目录下。
它会自动在读者指定的 目标驱动器中建立\SOFTWARE 目录并且将 uCOS-II.EXE 文件从 A: 驱动器复制到\SOFTWARE 并 且运行。
关于uC/OS-II中优先级翻转问题■ 山东大学 秦绍华 陈涤1uC/OS-II的运行机制在嵌入式系统的应用中,实时性是一个重要的指标,而优先级翻转是影响系统实时性的重要问题。
本文着重分析优先级翻转问题的产生和影响,以及在uC/OS-II中的解决方案。
uC/OS-II采用基于固定优先级的占先式调度方式,是一个实时、多任务的操作系统。
系统中的每个任务具有一个任务控制快OS_TCB,任务控制块记录任务执行的环境,包括任务的优先级,任务的堆栈指针,任务的相关事件控制块指针等。
内核将系统中处于就绪态的任务在就绪表(ready list)进行标注,通过就绪表中的两个变量OSRdyGrp和OSRdyTbl[]可快速查找系统中就绪的任务。
在uC/OS-II中每个任务有唯一的优先级,因此任务的优先级也是任务的唯一编号(ID),可以作为任务的唯一标识。
内核可用控制块优先级表OSTCBPrioTbl[]由任务的优先级查到任务控制块的地址。
uC/OS-II主要就是利用任务控制快OS_TCB、就绪表(ready list)和控制块优先级表OSTCBPrioTbl[]来进行任务调度的。
任务调度程序OSSched()首先由就绪表(ready list)中找到当前系统中处于就绪态的优先级最高的任务,然后根据其优先级由控制块优先级表OSTCBPrioTbl[]取得相应任务控制块的地址,由OS_TASK_SW()程序进行运行环境的切换。
将当前运行环境切换成该任务的运行环境,则该任务由就绪态转为运行态。
当这个任务运行完毕或因其它原因挂起时,任务调度程序OSSched()再次到就绪表(ready list)中寻找当前系统中处于就绪态中优先级最高的任务,转而执行该任务,如此完成任务调度。
若在任务运行时发生中断,则转向执行中断程序,执行完毕后不是简单的返回中断调用处,而是由OSIntExit()程序进行任务调度,执行当前系统中优先级最高的就绪态任务。
打算学习一个嵌入式操作系统,研究了一下决定还是先研究一下ucosii,一方面权当学习C语言,另一方面ucosii2.52版本代码只有5500行左右,还是一个能接受的范围。
对于新手,入门选书是最重要的了。
用了几天研究了一下参考书,和大家分享一下。
1.嵌入式实时操作系统μC/OS-II(第2版) 邵贝贝等译北京航空航天大学出版社应该说每一个学习ucosii的人都应该知道这本书,也都应该看一下这本书,但是不建议作为入门书籍。
这本书是ucosii的作者原著的翻译本,必然是很详细,必然是权威,然而书中分析ucosii内核原理是核心内容,应用则不多。
想要快速上手的应当选用其他书籍,这本书应该当做手册。
2.嵌入式实时操作系统μC/OS-II原理及应用(第2版) 任哲北京航空航天大学出版社这本书和第一本书比在讲述ucosii原理的同时,配备了一些很简单的例子,可以在PC上调试代码。
我用了大概5天的时间反复看了三遍这本书,感觉不错,适合入门。
当然书中有一些原理讲的不清楚,这个时候翻一下邵贝贝那本书就懂了。
3.ucosii标准教程杨宗德人民邮电出版社这本书我只翻了一下,看了看目录和前面一点内容。
用的模拟环境是VC++6.0对于那些搞软件的朋友看这本书应该合适,书中的内核是2.8版本。
我对这本书的好奇是,为什么没有参考文献?呵呵,所以。
你懂的。
4.基于嵌入式实时操作系统的程序设计技术周慈航北京航空航天大学出版社这本书有第一版和第二版,我手里只有第一版,在网上查了一下第二版的信息。
应该说内容差不多,第一版例子的平台是基于LPC2000系列的ARM7,而第二版是真对ARM Cortex-M3的。
LPC2000系列的ARM是可以用proteus仿真的,所以建议手里面没有ARM Cortex-M3开发板的朋友还是看第一版。
第一版的缺点是要有一些实时系统的知识,在你看完第任哲的那本书的时候就可以看这本了。
5.嵌入式系统软件设计中的数据结构陆玲周慈航北京航空航天大学出版社如果你和我一样,是非计算机专业的学生,没有学过数据结构,又不想看计算机系那么厚的所谓经典教材,那我建议你看一看这本书。
本学习ucos的必看书籍
这里给大家推荐三本学习ucos的必看书籍
1.(比较难买)嵌入式实时操作系统uc/os-II教程西安电子科技大学出版 -----这本书对UCOS的源代码分析的非常清楚比作者原著在某种程度上要好,这本书对关键的代码都给出了流程图!
2.(比较好买)嵌入式实时操作系统uc/os-II原理与应用(第二版)任哲北航出版的
这本书告诉你UCOS怎么用对源代码分析的比较少看完这本书你可以简单应用UCOS
3.(比较难买) 这本书是绝对重量级的
基于嵌入式实时操作系统的程序设计周慈航北航
这本书教你UCOS的高级程序设计是你迈向UCOS高手的必经之路!!
当然了有人说作者原著才是最经典的但是我觉得在原著之上的理解也许要更好吧作者的原著也必须要参考!!。
目录1.实验概述 (1)2.实验特点及困难描述 (1)3.系统介绍 (2)3.1uCOS-II系统简介 (2)3.2CoMPCert编译器简介 (3)3.3Crosstool交叉编译工具简介 (3)3.4SkyEye嵌入式模拟器简介 (4)4.uCOS-II针对CoMPCert的修改 (5)5.移植概述 (5)6.平台相关的结构及C函数部分 (5)6.1OS_CPU.H 说明 (5)6.2OS_CPU_C.C 说明 (6)7.汇编部分的移植说明 (7)7.1OSStartHighRdy函数 (7)7.2OSCtxSw函数说明 (8)7.3OSIntCtxSw 函数说明 (9)7.4OSTickISR函数说明 (9)8.在SkyEye上的运行 (10)9.实验总结 (12)1.实验概述我们这次编译—嵌入式联合大实验,主要是将uCOS-II嵌入式系统移植到PowerPC平台,并用CoMPCert这个经过验证的编译器进行验证,最后将uCOS-II系统在SkyEye的PPC平台模拟上进行运行。
我们所做的主要工作如下:●将uCOS-II分离成平台相关与平台无关的两部分●将平台无关部分,使用CoMPCert进行编译●使用PowerPC汇编语言,重写平台相关的部分●使用交叉编译工具Crosstool对整体进行编译与链接●配置SkyEye模拟器,并验证其对MPC-8641d的支持●在SkyEye模拟器上面运行uCOS-II系统2.实验特点及困难描述我们大实验的主要特点是涉及的领域相对较陌生,且相对工作量大。
与其他组的项目相比,我们组的实验不仅仅是对一个系统进行修改以使其可以使用于某个编译器,还需要对大量的系统代码进行重写和修改,并且在这个基础上需要与多种基础工具打交道,在这个过程中我们也为SkyEye平台的完善做出了一定的贡献。
uCOS-II移植到PowerPC平台的项目非常少,而进一步在SkyEye平台上运行,是我们独创性的工作,之前从未有人事先过。
μC/OS-II在S3C44BOX处理器上的移植- ET电子技术网::因此,对μC/OS-II实时操作系统的学习研究、开发、应用具有重要意义。
Samsung S3C4 4B0X 微处理器是三星公司专为手持设备和其它嵌入式应用提供的高性价比的微控制器解决方案。
它使用ARM公司的16位/32位RISC结构,内核是ARM7TDMI,工作在66MHz,片上集成了/html/dianzhijxwz/qianrushixitong/ARMxilie/20070105/101.htm lAnalysiS of Porting c/0s-i I to SkyEye 宋凯熊海泉严丽平Song Kai ::ARⅥ系列的处理器当前有ARbi7、ARM9、ARMgE、ARMIO等多个产品,此~bARM公司合作伙伴,例如Intel也提供基于XScale微体系结构的 S 4 结束语文件的移植,这个文件的实现集中体现了所要移植到处理器uC/OS-II作为一个优秀的实时操作系统已经被移植到各的/content/tp/97497a/2004/000/012/gc127_tp3_12188625.pdf摘要:本文介绍了基于ARM微处理器的µC/OS-II的移植,并对其进行扩展,主要包括内核、lwip、µC/GUI的移植。
关键字:微处理器; µC/OS-II;LWIP TCP/IP协议栈; µC/GUI嵌入式图形用户接口; 实时操作系统0 概述嵌入式操作系统µC/OS-II是一个公开源代码的占先式多任务的微内核RTO S,其特点可以概括为以下几个方面:公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。
内核属于抢占式,最多可以管理60个任务。
目前国内对µC/OS-II的研究和应用都很多。
只要买一本书就可获得源代码,对学校和教育的使用完全免费,商业应用的费用相对也很低。
教程简介名称《uCOS-II移植与深入实战指南》作者WildFire Team@野火科技版本V1.0硬件平台野火STM32ISO/ISO-MINI开发板淘宝店论坛野火系列教程简介,可到论坛下载。
STM32篇《零死角玩转STM32》系统篇《uCOS-II移植与深入实战指南》GUI篇《emWin实战指南》GSM篇《野火WF-SIM900A数据手册》《野火WF-SIM900A用户手册》GPS篇《野火WF-NEO-6M模块数据手册》《野火WF-NEO-6M模块用户手册》开源共享共同进步!从0开始移植UCOS-II到野火STM32开发板前言uC/OS是一个微型的实时操作系统,包括了一个操作系统最基本的一些特性,如任务调度、任务通信、内存管理、中断管理、定时管理等。
而且这是一个代码完全开放的实时操作系统,简单明了的结构和严谨的代码风格,非常适合初涉嵌入式操作系统的人士学习。
很多人在学习STM32中,都想亲自移植一下uC/OS,而不是总是用别人已经移植好的。
在我学习uC/OS的过程中,查找了很多资料,也看过很多关于如何移植uC/OS到STM32处理器上的教程,但都不尽人意,主要是写得太随意了,思路很乱,读者看到最后还是不确定该怎样移植。
为此,我决定写这个教程,让广大读者真正了解怎样移植。
学前建议:C语言+数据结构Wildfire Team2011年11月3日1、官方源代码介绍首先我们下载源代码,官方下载地址:/page/downloads/ports/st/stm32(下载资料需要注册帐号)或者网盘下载:/c0jnhmfxcp我们需要下载的就是下面这个,因为我用到的开发板芯片是STM32F103VET6注意:下载的源代码开发环境是IAR编译器的。
我们使用的uCOS是2.86版本。
下载解压后可以看到Micrium含有三个文件夹:文件名说明AppNote s 包含uCOS-II的说明文件,其中文件Micrium\AppNotes\AN1xxx-RTOS\AN1018-uCOS-II-Cortex-M3\AN-1018.pdf是很重要的。
图1 零件压装过程时采集压装过程的位移和压力数据,并将这些数据实时发送给S3C2440,最后S3C2440会对这些数据进行曲线图绘制、结果判定等操作。
2 压装数据采集系统本文的重点是对压装设备的采集系统进行论述。
根据上面的系统总述,我们知道该数据采集系统必须达到以下方面的要求。
第一,ADC的选择,ADC必须是精度足够高,由于同时采集压力和位移数据,并且采集的数据量很大,所以必须选择多通道的高速高精度AD转换器[7]。
第二,数据制芯片[8]。
C8051f060是完全集成的混合信号片上系统型MCU,里面具有两个16位精度1Msps最高转换速度的AD转换器,转换数据直接存储到RAM中,不需额外软件开销,可同时使用的硬件SMBus,高速SPI及两个UART串行端口,具有 59 个数字 I/O 引脚[9]。
其中串口和SPI口都可直接和ARM连接无需其它驱动电路。
传感器方面,该系统采用压力传感器C9B,位移传感器PY1,然后对其产生的电压信号进行滤波放大送到单片机的AD采集端。
2.2 数据采集系统软件设计现多任务同时运行的UCOS-II实时操作系统[11]。
UCOS-II是有Micrium公司提供的一款可移植、可裁剪的小型多任务实时操作系统,它具有执行效率高、占用空间小、实时性优良和扩展性良好的特点。
虽然体积小但它包含了任务调度、任务管理、时间管理、内存管理和任务间的通信和同步等功能。
UCOS-II中最大可支持64个任务,分别对应优先级为0—63,高优先级任务可以抢占低优先级CPU资源。
多任务操作系统是把CPU的执行分为多个很多个时间块,任务A执行完后它会把CPU的使用权交给任务图2 压装监测设备系统总框架图图3 多任务控制结构图θ角是滞后,(式8)的数据通过上接44保存到片外。
学习ucosii操作系统的一点心得ucos-ii 操作系统的优异性能我就不说了,因为专家们说的太多了。
非要说的话,只能是狗尾续貂。
我就说说自己对学习ucosii 操作系统的一点学习心得。
对我而言--非计算机专业的人刚开始接触操作系统是多么的痛苦,毕竟自己的c 语言知识全靠自学得来的,况且对汇编语言几乎是一窍不通!学完51 单片机以及编程后,曾对朋友吹嘘:c 语言至少可以考70 分(满分100),那时信心是何其饱满!如今自叹:c 语言顶多能考50 分(满分100)!没办法,再难也得学啊!谁叫咱爱上这一口了呢?硬着头皮看呗。
资料太多了,简直就是汗牛充栋!管他呢,一篇篇的先过一遍,管他懂不懂。
通过对几乎3G 内容的过滤,最终确认《嵌入式实时操作系统ucosii 原理及应用---任哲》不错,篇幅适中,通俗易懂(相对其他资料而言);江湖中人都说邵贝贝老师的书不错,可是我觉得版本太老;另外,《北京航空航天大学ucosii 操作系统讲义》真的不错!很对我的胃口!把它和任哲的资料结合起来学习是不错的选择!另外再结合钟常慰老师的《ucosii 中文注释版》学习,也是不错的选择!再用MDK3.8 编译器打开原子老师的有关ucosii 例程配合以上资料就妥了!学习ucosii,还先得说说自己学会移植的过程。
要学习操作系统,不会移植这是一个大问题!在网上查阅了大量基于stm32 的移植方法资料,可惜说的都不够详细;没办法,自己就在自己的例程基础上尝试移植,失败过好多次!后来就和原子的例程对比,不断编译尝试,终于ok 了!终于在自己的工程模板上编译通过了!现在回想,多么弱智的问题,搞得这么苦?!学习就是这样,由许多这样弱智和痛苦的问题构成的。
数组,结构体,堆栈,链表,内存管理,指针函数,个个是问题!毕竟自己没有学过《数据结构》啊!关键是堆栈,链表学习51 单片机时就没有接触。
第3章内核结构 (1)3.0 临界段(Critical Sections) (1)3.1 任务 (1)3.2 任务状态 (3)3.3 任务控制块(Task Control Blocks, OS_TCBs) (4)3.4 就绪表(Ready List) (7)3.5 任务调度(Task Scheduling) (10)3.6 给调度器上锁和开锁(Locking and UnLocking the Scheduler) (11)3.7 空闲任务(Idle Task) (12)3.8 统计任务 (13)3.9 μC/OS中的中断处理 (16)3.10 时钟节拍 (20)3.11 μC/OS-Ⅱ初始化 (23)3.12 μC/OS-Ⅱ的启动 (24)3.13 获取当前μC/OS-Ⅱ的版本号 (27)3.14 OSEvent???()函数 (28)I第3章内核结构本章给出μC/OS-Ⅱ的主要结构概貌。
读者将学习以下一些内容;zμC/OS-Ⅱ是怎样处理临界段代码的;z什么是任务,怎样把用户的任务交给μC/OS-Ⅱ;z任务是怎样调度的;z应用程序CPU的利用率是多少,μC/OS-Ⅱ是怎样知道的;z怎样写中断服务子程序;z什么是时钟节拍,μC/OS-Ⅱ是怎样处理时钟节拍的;zμC/OS-Ⅱ是怎样初始化的,以及z怎样启动多任务;本章还描述以下函数,这些服务于应用程序:z OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(),z OSInit(),z OSStart(),z OSIntEnter()和OSIntExit(),z OSSchedLock()和OSSchedUnlock(), 以及z OSVersion().3.0临界段(Critical Sections)和其它内核一样,μC/OS-Ⅱ为了处理临界段代码需要关中断,处理完毕后再开中断。
这使得μC/OS-Ⅱ能够避免同时有其它任务或中断服务进入临界段代码。
关中断的时间是实时内核开发商应提供的最重要的指标之一,因为这个指标影响用户系统对实时事件的响应性。
μC/OS-Ⅱ努力使关中断时间降至最短,但就使用μC/OS-Ⅱ而言,关中断的时间很大程度上取决于微处理器的架构以及编译器所生成的代码质量。
微处理器一般都有关中断/开中断指令,用户使用的C语言编译器必须有某种机制能够在C中直接实现关中断/开中断地操作。
某些C编译器允许在用户的C源代码中插入汇编语言的语句。
这使得插入微处理器指令来关中断/开中断很容易实现。
而有的编译器把从C语言中关中断/开中断放在语言的扩展部分。
μC/OS-Ⅱ定义两个宏(macros)来关中断和开中断,以便避开不同C编译器厂商选择不同的方法来处理关中断和开中断。
μC/OS-Ⅱ中的这两个宏调用分别是:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。
因为这两个宏的定义取决于所用的微处理器,故在文件OS_CPU.H中可以找到相应宏定义。
每种微处理器都有自己的OS_CPU.H文件。
3.1任务一个任务通常是一个无限的循环[L3.1(2)],如程序清单3.1所示。
一个任务看起来像其它C的函数一样,有函数返回类型,有形式参数变量,但是任务是绝不会返回的。
故返回参数必须定义成void[L3.1(1)]。
程序清单 L3.1 任务是一个无限循环void YourTask (void *pdata) (1){for (;;) { (2)/* 用户代码 */调用uC/OS-II的某种系统服务:OSMboxPend();OSQPend();OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTimeDly();OSTimeDlyHMSM();/* 用户代码 */}}不同的是,当任务完成以后,任务可以自我删除,如清单L3.2所示。
注意任务代码并非真的删除了,μC/OS-Ⅱ只是简单地不再理会这个任务了,这个任务的代码也不会再运行,如果任务调用了OSTaskDel(),这个任务绝不会返回什么。
程序清单 L 3.2 . 任务完成后自我删除void YourTask (void *pdata){/* 用户代码 */OSTaskDel(OS_PRIO_SELF);}形式参数变量[L3.1(1)]是由用户代码在第一次执行的时候带入的。
请注意,该变量的类型是一个指向void的指针。
这是为了允许用户应用程序传递任何类型的数据给任务。
这个指针好比一辆万能的车子,如果需要的话,可以运载一个变量的地址,或一个结构,甚至是一个函数的地址。
也可以建立许多相同的任务,所有任务都使用同一个函数(或者说是同一个任务代码程序), 见第一章的例1。
例如,用户可以将四个串行口安排成每个串行口都是一个单独的任务,而每个任务的代码实际上是相同的。
并不需要将代码复制四次,用户可以建立一个任务,向这个任务传入一个指向某数据结构的指针变量,这个数据结构定义串行口的参数(波特率、I/O口地址、中断向量号等)。
μC/OS-Ⅱ可以管理多达64个任务,但目前版本的μC/OS-Ⅱ有两个任务已经被系统占用了。
作者保留了优先级为0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0这8个任务以被将来使用。
OS_LOWEST_PRI0是作为定义的常数在OS_CFG.H文件中用定义常数语句#define constant定义的。
因此用户可以有多达56个应用任务。
必须给每个任务赋以不同的优先级,优先级可以从0到OS_LOWEST_PR10-2。
优先级号越低,任务的优先级越高。
μC/OS-Ⅱ总是运行进入就绪态的优先级最高的任务。
目前版本的μC/OS-Ⅱ中,任务的优先级号就是任务编号(ID)。
优先级号(或任务的ID号)也被一些内核服务函数调用,如改变优先级函数OSTaskChangePrio(),以及任务删除函数OSTaskDel()。
为了使μC/OS-Ⅱ能管理用户任务,用户必须在建立一个任务的时候,将任务的起始地址与其它参数一起传给下面两个函数中的一个:OSTastCreat或OSTaskCreatExt()。
OSTaskCreateExt()是OSTaskCreate()的扩展,扩展了一些附加的功能。
,这两个函数的解释见第四章,任务管理。
3.2任务状态图3.1是μC/OS-Ⅱ控制下的任务状态转换图。
在任一给定的时刻,任务的状态一定是在这五种状态之一。
睡眠态(DORMANT)指任务驻留在程序空间之中,还没有交给μC/OS-Ⅱ管理,(见程序清单L3.1或L3.2)。
把任务交给μC/OS-Ⅱ是通过调用下述两个函数之一:OSTaskCreate()或OSTaskCreateExt()。
当任务一旦建立,这个任务就进入就绪态准备运行。
任务的建立可以是在多任务运行开始之前,也可以是动态地被一个运行着的任务建立。
如果一个任务是被另一个任务建立的,而这个任务的优先级高于建立它的那个任务,则这个刚刚建立的任务将立即得到CPU的控制权。
一个任务可以通过调用OSTaskDel()返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。
调用OSStart()可以启动多任务。
OSStart()函数运行进入就绪态的优先级最高的任务。
就绪的任务只有当所有优先级高于这个任务的任务转为等待状态,或者是被删除了,才能进入运行态。
图3.1 任务的状态正在运行的任务可以通过调用两个函数之一将自身延迟一段时间,这两个函数是OSTimeDly()或OSTimeDlyHMSM()。
这个任务于是进入等待状态,等待这段时间过去,下一个优先级最高的、并进入了就绪态的任务立刻被赋予了CPU的控制权。
等待的时间过去以后,系统服务函数OSTimeTick()使延迟了的任务进入就绪态(见3.10节,时钟节拍)。
正在运行的任务期待某一事件的发生时也要等待,手段是调用以下3个函数之一:OSSemPend(),OSMboxPend(),或OSQPend()。
调用后任务进入了等待状态(WAITING)。
当任务因等待事件被挂起(Pend),下一个优先级最高的任务立即得到了CPU的控制权。
当事件发生了,被挂起的任务进入就绪态。
事件发生的报告可能来自另一个任务,也可能来自中断服务子程序。
正在运行的任务是可以被中断的,除非该任务将中断关了,或者μC/OS-Ⅱ将中断关了。
被中断了的任务就进入了中断服务态(ISR)。
响应中断时,正在执行的任务被挂起,中断服务子程序控制了CPU的使用权。
中断服务子程序可能会报告一个或多个事件的发生,而使一个或多个任务进入就绪态。
在这种情况下,从中断服务子程序返回之前,μC/OS-Ⅱ要判定,被中断的任务是否还是就绪态任务中优先级最高的。
如果中断服务子程序使一个优先级更高的任务进入了就绪态,则新进入就绪态的这个优先级更高的任务将得以运行,否则原来被中断了的任务才能继续运行。
当所有的任务都在等待事件发生或等待延迟时间结束,μC/OS-Ⅱ执行空闲任务(idle task),执行OSTaskIdle()函数。
3.3任务控制块(Task Control Blocks, OS_TCBs)一旦任务建立了,任务控制块OS_TCBs将被赋值(程序清单3.3)。
任务控制块是一个数据结构,当任务的CPU使用权被剥夺时,μC/OS-Ⅱ用它来保存该任务的状态。
当任务重新得到CPU使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差地继续执行。
OS_TCBs全部驻留在RAM中。
读者将会注意到笔者在组织这个数据结构时,考虑到了各成员的逻辑分组。
任务建立的时候,OS_TCBs就被初始化了(见第四章 任务管理)。
程序清单 L 3.3 µC/OS-II任务控制块.typedef struct os_tcb {OS_STK *OSTCBStkPtr;#if OS_TASK_CREATE_EXT_ENvoid *OSTCBExtPtr;OS_STK *OSTCBStkBottom;INT32U OSTCBStkSize;INT16U OSTCBOpt;INT16U OSTCBId;#endifstruct os_tcb *OSTCBNext;struct os_tcb *OSTCBPrev;#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_ENOS_EVENT *OSTCBEventPtr;#endif#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_ENvoid *OSTCBMsg;#endifINT16U OSTCBDly;INT8U OSTCBStat;INT8U OSTCBPrio;INT8U OSTCBX;INT8U OSTCBY;INT8U OSTCBBitX;INT8U OSTCBBitY;#if OS_TASK_DEL_ENBOOLEAN OSTCBDelReq;#endif} OS_TCB;.OSTCBStkPtr是指向当前任务栈顶的指针。