嵌入式操作系统uCOS2
嵌入式实时操作系统_uCOSII

uC/OS-II北京邮电大学计算机学院 邝 坚 2011年10月教材及参考文献《嵌入式实时操作系统 uC/OS-II(第2 版)》,Jean brosse, 邵贝贝, 北航出版 社, 2003年1月uC/OS-II的主要特点实时性可确定:绝大多数系统服务的执行时间具有可确定 性,不依赖于用户应用程序Task数目的多少。
多任务、独立栈:最多64个Task,基于优先级抢占调度方 式。
每个Task有自身独立的堆栈。
可裁减性:系统最小可裁减到几K到十几K,这种裁减还可 以做到基于函数级。
可移植性:与CPU体系结构相关部分用汇编编写,其他功 能组件CPU无关。
可靠、稳定性:由整个系统设计来保证,市场验证。
美国 联邦航空管理局(FAA)认证。
开源代码:内核约5500行C代码。
可固化:面向嵌入式应用。
系统功能实时内核 任务管理 时间管理 信号量、互斥信号量管理 事件标志组管理 消息邮箱管理 消息队列管理 内存管理 …Targets x86 68k PPC CPU32 i960 SPARC ARM MIPS XScale …Typical development configurationEthernetRS-232Development HostTargetTypical scenario:1. Boot target. 4. Download object module. 2. Attach target server. 5. Test & Debug. 3. Edit & compile. 6. Return to 3 or 1 as necessaryMulti-TaskingTask是代码运行的一个映像,从系统的角 度看,Task是竞争系统资源的最小运行单 元。
Task可以使用或者等待CPU、I/O设备 及内存空间等系统资源,并独立于其它的 Task,与它们一起并发运行。
Task OperationPriority-base preemptive scheduling(基 于优先级的抢占式调度)Task调度器上锁和开锁给调度器上锁函数OSSchedlock() 用于临 时禁止任务调度,直到任务完成后调用给 调度器开锁函数OSSchedUnlock()为止。
第九讲 uCOS-II嵌入式实时操作系统

第九讲 第九讲 系统函数 uC/OS-II 嵌入式实时操作系统
1、uC/OS-II简介 2、系统函数 3、任务组成 4、任务管理 5、时钟和中断 6、内存管理 7、移植方法 8、移植实例
9.2 9.2.1 总体组成 uC/OS-II的系统函数
1)uC/OS-II的组成: 与处理器无关的代码; 与
9.1 uC/OS-II 简介 9.1.3 应用范围
3)uC/OS-II的应用范围 • uC/OS已经移植到了很多CPU上,例如:
AnalogDevices的AD21xx; ARM的ARM7/ ARM9等; Hitachi的64180、H8/3xx和SH系列; Intel的80x86、Pentium、PentiumII、 8051、8052、MCS-251、80196等; Motorola的PowerPC、68K、CPU32、 ColdFire、M.Core、68HC系列; Siemens的80C166和TriCore; TexasInstruments的TMS320等;
9.3 9.3.1 任务组成 uC/OS-II的任务组成
1) 任务组成
9.3 9.3.2 任务状态 uC/OS-II的任务组成
2) 任务的状态:睡眠、就绪、运行、等 待和中断服务5种状态。
9.3 uC/OS-II的任务组成 9.3.3 任务优先级
3)任务的优先级 uC/OS-II 按硬件实时任务的可剥夺型 内核来设计的,因此每个任务必须要有一 个唯一的优先级,用于表明该任务在抢夺 微处理器时所具有的优先权。 uC/OS-II规定应用程序最多包含64个 任务,即最多64个优先级。
9.2 9.2.1 应用相关 uC/OS-II的系统函数
2)应用程序有关的部分 • OS_CFG.H: 配置文件
嵌入式操作系统uCOS2复习指南

复习:第一章:实时操作系统、操作系统基本功能、任务、多任务、任务状态及相互关系、任务切换、可重入和不可重入;可剥夺和不可剥夺内核;同步与通信:同步、互斥、临界区、事件、信号量、互斥信号量、消息邮箱、消息队列;中断、时钟、内存管理。
第二章:任务管理:任务控制块TCB数据结构及各数据项意义任务控制块实体任务控制块空闲链表、就绪链表优先级指针表任务堆栈任务就绪表及就绪组及相关代码图2.16:任务状态转换图,要弄清楚任务各状态及转换条件程序2.6,2.7,2.8和2.9,获取就绪任务中的最高优先级,能给出OsRdyGrp和OsRdyTbl后,依据程序,算出最高优先级;并且说明处理时间是恒定的程序2.10、2.11、2.14、2.15、2.17、2.27、2.28、2.29、2.30、2.34分析第三章中断和时间管理中断处理流程,图3.1时钟中断服务,程序3.2,OSTIMETICK(程序2.27)任务延迟函数OSTIMEDLY作用及代码分析(程序3.4)第4章ECB数据结构事件等待组、等待表作用,与就绪组合就绪表有何联系和不同事件控制块空闲链表及ECB初始化函数(程序4.3)事件等待函数(程序4.5)将等待事件就绪(程序4.8)信号管理:OSSEMCREAT、OSSEMDEL、OSSEMPEND、OSSEMPOST4.3.9:信号量应用举例互斥信号管理:OSMutexCreat、OSMutexDEL、OSMutexPEND、OSMUtexPOST优先级反转解决优先级反转采用何种策略4.4.8:互斥信号量应用举例第5章5.1 消息邮箱:OSMBOXCREAT、DEL、PEND、POST5.1.8 例子5.2消息队列:Os_QInit,OsQCreat;POST;PEND消息队列数据结构:图5.8到5.115.2.8 例子第6章内存管理内存控制块数据结构MCB链表Os_MemInit();OsMemCreat();OsMemGet();OsMemPut()设内存区有6个块构成,依次画出4个图:内存块创建后、分配一个块后、再分配两个块后、释放第一次分配的块后的结构图。
嵌入式实时操作系统uCOS-II(就绪算法)

OSTCBTbl[1]
OSTCBStkPtr
OSTCBTbl[0]
OSTCBStkPtr
OSTCBNext
OSTCBTbl[2]
OSTCBStkPtr OSTCBNext
OSTCBTbl[n]
OSTCBStkPtr OSTCBNext NULL
OSTCBNext
NULL
20
任务控制块数组与指针
OSTCBFreeList
OSTCBPrioTbl[ ]
[0] [4] [5]
NULL
… &OSTCBTBL[1] &OSTCBTBL[2]
…
[OS_LOEEST_PRIO] &OSTCBTBL[0]
OS_TaskIdle
15
任务控制块数组与指针
OSTCBPrioTbl[
]
任务的优先级资源由操作系统提供,uc/OS-II 有64各优先级,优先级的高低按照编号从0(最高) 到63(最低)排序。由于用户实际使用的优先级的 个数通常少于64个,所以为节约系统资源,可以通 过定义系统常量OS_LOWEST_PRIO的值来限制优 先级编号的范围。
OSTCBTbl[2]
OSTCBStkPtr OSTCBNext
OSTCBTbl[n]
OSTCBStkPtr OSTCBNext NULL
NULL
13
任务控制块数组与指针
OSTCBPrioTbl[
]
任务控制块优先级表,专门用来存放指向各任 务控制块的指针,并按任务的优先级别将这些指针存 放在数组的各个元素里,这样系统在访问一个任务的 任务控制块时,就不必遍历任务控制块链表了。只要 知道任务的优先级,就可以迅速地从该数组中找到它 的任务控制块。
16.嵌入式操作系统uCOS-II

嵌套中断管理
嵌套层数可达255层
主要API
void OSInit(void); //系统初始化 // //启动操作系统
void OSStart(void);
任务管理
INT8U OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio); task:指向任务代码的指针; pdata:指向向任务传递参数的数据结构; ptos: 堆栈指针 prio: 优先级 INT8U OSTaskSuspend(INT8U prio); prio:指定要获取挂起的任务优先级 INT8U OSTaskResume(INT8U prio); prio指定要唤醒任务的优先级.
C/OS-II的主要特点
可移植性和可确定性
绝大部分代码用ANSI C编写 与处理器硬件相关的代码用汇编语言编写 移植条件 移植目标处理器要有硬件堆栈指针 CPU内容寄存器入栈,出栈指令 C编译器支持内嵌汇编或C可扩展,可连接汇编 模块 关中断,开中断可在C语言中实现
C/OS-II的主要特点(续1)
OS_ENTER_CRITICAL() OS_EXIT_CRITICAL() //关中断 //开中断
#define OS_ENTER_CRITICAL() { cpu_sr = INTS_OFF(); } #define OS_EXIT_CRITICAL() { if(cpu_sr == 0) INTS_ON(); }
开关中断的汇编语言程序段
INTS_OFF mrs r0, cpsr ; current CSR mov r1, r0 ; make a copy for masking orr r1, r1, #0xC0 ; mask off int bits msr CPSR_cxsf, r1 ; disable ints (IRQ and FIQ) and r0, r0, #0x80 ; return FIQ bit from original CSR mov pc,lr ; return INTS_ON mrs r0, cpsr ; current CSR bic r0, r0, #0xC0 ; mask on ints msr CPSR_cxsf, r0 ; enable ints (IRQ and FIQ) mov pc,lr ; return
嵌入式操作系统_第5章 ucOS-II - 任务就绪表及任务就绪组

0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 2
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 3
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 4
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
或
y = OSUnMapTbl[OSRdyGrp]; prio = (INT8U)((y << 3)
+ OSUnMapTbl[OSRdyTbl[y]]);
优先级判定表OSUnMapTbl[256] (os_core.c)
举例: 如OSRdyGrp的值为
00101000B,即0X28,则 查得 OSUnMapTbl[OSRdyGrp] 的值是3,它相应于 OSRdyGrp中的第3位置1;
图5-6 在就绪表中查找最高优先级别任务的过程
从任务就绪表中获取优先级别最高的就绪任务可用如下 类似的代码:
y = OSUnMapTal[OSRdyGrp]; //D5、D4、D3位
x = OSUnMapTal[OSRdyTbl[y]]; //D2、D1、D0位
prio = (y<<3)+x;
//优先级别
};
优先级判定表OSUnMapTbl[256]
OSUnMapTbl[]这个数组的生成原则:先 把一个数用二进制表示,然后从低位往高 位数,返回第一次碰到1的位置。比如: OSUnMapTbl[0x111100(60)] = 2。可 以看到,如果要表示8位数的对应关系, 则数组的大小为2^8=256。这也是为什么 OSRdyTbl[],OSRdyGrp采用8位的原因。
嵌入式操作系统_第7章 ucOS-II - 任务的同步互斥通信

IO)N;SO当就T_函8SE任绪USV数e务状EmON等P态S的TeS待n。e*返dmp的允如ePv回o时许果esnt间用值t参(/超参数/为信过数ti号已mttii量emmo创eeu的ootu被u建指tt时设设针的可置置信以一为结个0号,束等量则等待表的待时明状间指任态的针务而限。的进制入,等
待时间为无限长。 调用函数成功后,函数返回值为OS_ON_ERR,否则会根据具体 错误返回OS_ERR_EVENT_TYPE、OS_SEM_OVF。
函块以8 位IO)表数,N;至函vOS赋o明TO把S_占数i8低号号优_EdS这以U成EMVO用O8 先为值V是ESu员pOS这ENtMre无位级(M一SiNOTxo个uMTuCS个t效和(反该*te资uEre*pxet互xvpee)高转值Pa欲源Pevxete斥enevePn的,8现为(提ntneodT型dnts()y其t高位象0t从升,)p/信(/x的e他(/互/空8两而F赋互的号原任F斥事位部要斥以量时优型务型件型常用分提,为,先释信控信数然:来:升放信号级制号后O了存低的量号别S块量再该指_放8优为链指E)把信针V为位先有针表成,E号N了用级获效员量低T取避来别O_,。8TS一免存pY否位ErPv个i出放则oeE赋n。事_t现信M信C以件nUt常控的TE制数高X
第7章 实时操作系统uCOS-Ⅱ

OSTCBPrev
OSTCBPrev
OSTCBPrev
OSTCBPrev
OSTCBPrev
图7-1 空任务列表
14
本节提要
C/OS-Ⅱ简介 2 C/OS-Ⅱ内核结构 3 4 5 6 7 C/OS-Ⅱ任务管理
1
C/OS-Ⅱ任务通信与同步 C/OS-Ⅱ中断与时间管理
C/OS-Ⅱ应用程序举例
4
C/OS的性能特点(二)
占先式(Preemptive) 多任务 C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系 统。应用程序最多可以有56个任务 可确定性 全部 C/OS-II的函数调用与服务的执行时间具有可确定性 任务栈 每个任务有自己单独的栈, C/OS-II允许每个任务有不同的栈 空间,以便压低应用程序对RAM的需求。 系统服务 C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、 块大小固定的内存的申请与释放、时间相关函数等。 中断管理 中断可以使正在执行的任务暂时挂起,如果优先级更高的任务 被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执 行,中断嵌套层数可达255层。 稳定性与可靠性
19
2.任务创建与删除
创建任务函数利用函数的调用参数为任务分配和初始化相 关的数据结构。首先初始化一个任务控制块,并通过任务控制 块把任务代码和任务堆栈关联起来形成一个完整的任务。 (1)任务创建 µC/OS-Ⅱ通过OSTaskCreate() 或 OSTaskCreateExt()来 建立任务。函数OSTaskCreate()的声明为:
11
Alternate Structure
void YourTask (void *pdata)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程名称:嵌入式实时操作系统操作系统名:µCOS-II实时操作系统学生姓名:张琴班级学号:SX11030242012年3月μC/OS-II实时操作系统1. 嵌入式实时操作系统μC/OS-II内核分析1.1 μC/OS-II简介μC/OS-II是一个源码公开、可移植、可固化、可裁剪、占先式、支持多任务的实时操作系统,最初是由Jean brosse先生撰写的,前身是μC/OS。
应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等。
μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。
CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。
用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II 嵌人到开发的产品中。
μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB 。
μC/OS-II 已经移植到了几乎所有知名的CPU 上。
1.2 μC/OS-II内核结构在多任务系统中,内核负责管理各个任务,或者说为每一个任务分配CPU 时间及其相关的资源,并且负责任务之间的通信。
内核提供的基本服务是任务切换。
使用实时内核可以大大简化应用系统的设计,因为实时内核允许将应用分成若干个任务,由实时内核来管理它们。
内核提供必不可少的系统服务。
μC/OS-II它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。
没有提供输入输出管理,文件系统,网络等额外的服务。
但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。
uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。
接下来从几方面对μC/OS-II的内核作出介绍:①临界区的处理机制所谓临界区,即多个任务共享的资源,在某一时刻只允许一个任务访问。
μC/OS-II在处理临界区时,代码需要关中断,处理完毕后再开中断,以避免同时有其他任务或中断服务进入临界区代码。
μC/OS-II提供了两个宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来实现对临界区的排他性操作。
②任务定义及状态μC/OS-II的任务是一个无限的循环,一个任务可以有返回类型,有形式参数变量,但是任务是绝不会返回的。
当任务完成以后,任务可以自我“删除”,即μC/OS-II不理会这个任务了,这个任务的代码也不会再运行。
μC/OS-II可以管理多达64个任务,其中空任务(IDLE)和统计任务(STATISTICS)被系统占用。
任务在建立时必须被赋予不同的优先级,优先级的数值越小,则任务的优先级越高。
μC/OS-II总是运行进入就绪状态的优先级最高的任务。
图2.1给出了μC/OS-II控制下的任务状态转换过程。
在任一时刻,任务的状态一定是这五种状态之一。
③任务控制块OS_TCBμC/OS-II中是采用任务控制块的方式对任务进行管理的。
任务控制块在任务被建立时赋值,它是一个数据结构,当任务的CPU使用权被剥夺时,μC/OS-II 用它来保存该任务的状态。
而当任务重新得到CPU使用权时,任务控制块能确保重庆大学硕士学位论文实时嵌入式操作系统μC/OS-Ⅱ内核分析④就绪表每一个任务的就绪态标志都放入就绪表中,就绪表中有两个变量OSRdyGrp 和OSRdyTbl[]。
在OSRedyGrp中,任务按优先级分组,8个任务为一组。
OSRedyGrp 中的每一位表示8组任务中每一组中是否有进入就绪态的任务。
任务进入就绪态时,就绪表OSRdyTbl[]中的相应元素的相应位也置位。
μC/OS-II就是利用就绪任务表对任务进行优先级的调度。
如果任务被删除,则该任务在表中相应优先级的位置要清零。
⑤任务调度μC/OS-II总是运行就绪态任务中优先级最高的那一个,任务调度由函数OSSched()来完成。
任务如果在中断服务子程序中调用OSSched(),此时中断嵌套层数OSIntNesting>0,或者由于用户至少调用了一次给任务调度上锁的函数OSSchedLock(),使OSLockNesting>0,则调度不允许。
如果不是在中断服务子程序中调用OSSched(),并且任务调度是允许的,即没有上锁,则任务调度函数查找就绪任务表,将找出那个进入就绪态且优先级最高的任务。
一旦找到那个优先级最高的任务,OSSched()检验这个优先级最高的任务是不是当前正在运行的任务,以此来避免不必要的任务调度。
重庆大学硕士学位论文实时嵌入式操作系统μC/OS-Ⅱ内核分析⑥中断处理μC/OS-II中,中断服务子程序将全部CPU寄存器推入当前任务栈。
μC/OS-II 允许中断嵌套,由中断嵌套层数计数器OSIntNesting跟踪嵌套层数。
处理完中断服务后,μC/OS-II调用函数OSIntExit()通知内核,到了返回任务级代码的时候了,于是OSIntExit()将OSIntNesting减一。
当OSIntNesting为零时,μC/OS-II要判定有没有优先级较高的任务进入了就绪态,若有,μC/OS-II就返回到那个高优先级的任务,如果调度被禁止了(OSIntNesting>0),μC/OS-II将被返回到被中断了的任务。
⑦时钟节拍μC/OS-II需要用户提供周期性信号元,用于实现时间延时和确认超时。
时钟节拍频率可在μC/OS-II的配置文件中配置,时钟节拍率越高,系统的额外负荷就越重,时钟节拍源可以是专门的硬件定时器。
应用程序必须在多任务系统启动以后再启动时钟节拍源计时,也就是在调用OSStart()之后。
1.3 任务管理μC/OS-II可以管理多达64个任务,并从中保留了四个最高优先级和四个最低优先级的任务供自己使用,所以用户可以使用的只有56个任务。
任务的优先级越高,反映优先级的值则越低。
其中0 为最高优先级,63为最低级。
uC/OS-II 提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。
任务管理中最重要的数据结构是任务控制块OS_TCBtypedef struct os_tcb{OS_STK*OSTCBStkPtr;/*当前栈顶指针*/#if OS_TASK_CREATE_EXT_ENVoid*OSTCBExtPtr;/*指向用户定义数据的指针*/OS_STK*OSTCBStkBottom;/*栈底指针*/INT32U OSTCBStksize;/*堆栈大小*/INT16U OSTCBOpt;/*任务选项*/INT16U OSTCBId;/*任务ID(0..65535)*/#endifstruct os_tcb*OSTCBNext;/*指向TCB链中下一TCB块的指针*/strtuct os_tcb*OSTCBPrev;/*指向TCB链中上一TCB块的指针*/#if(OS_Q_EN&&(OSJ_MAX_QS>=2))||OS_MBOX_EN||OS_SEM_ENOS_EVENT*OSTCBEventPtr;/*事件控制块指针*/#endif#if(OS_Q_EN&&(OSJ_MAX_QS>=2))||OS_MBOX_ENVoid*OSTCBMsg;/*从OSMboxPost()或OSQPost()收到的消息*/#endifINT16U OSTCBDly;/*延迟时间*/INT8U OSTCBStat;/*任务状态*/INT8U OSTCBPrio;/*任务优先级(0..63)*/INT8U OSTCBX;/*根据任务优先级指出就绪组(0..7)*/INT8U OSTCBY;/*根据任务优先级指出就绪表*/INT8U OSTCBBitX;/*就绪表的位掩码*/INT8U OSTCBBitY;,/*就绪组的位掩码*/#if OS_TASK_DEL_ENB00LEAN OSTCBDelReq;/*指出一个任务是否要删除本身*/#endif}OS_TCB一旦任务建立了,任务控制块OS_TCB将被赋值。
当任务的CPU使用权被剥夺时,μC/OS-II用它来保存该任务的状态。
当任务重新得到CPU使用权时,任务控制块确保任务从当时被中断的那一点继续执行。
OS_TCB全部驻留在RAM中。
建立任务:用户可以通过传递任务地址和其它参数到以下两个函数之一来建立任务OSTaskCreate()或OSTaskCreateExt(),OSTaskCreate()与μC/OS-II向下兼容,OSTaskCreateExt()是OSTaskCreate()的扩展版本,提供了一些附加功能。
在开始任务调度(即调用OSStart())前,用户必须建立至少一个任务。
任务不能由中断服务程序(ISR)来建立。
OSTaskCreate()需要四个参数:task是任务代码的指针,pdata是当任务开始执行时传递给任务的参数的指针,ptos是分配给任务的堆栈的栈顶指针,prio是分配给任务的优先级。
程序清单OSTaskCreate()INT8U OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK INT8U prio) {void*psp;INT8U err;If(prio>OS_LOWEST_PRIO){return(OS_PRIO_INVALID);}OS_ENTER_CRITICAL();If(OS_TCBPrioTbl[prio]=(OS_TCB*)0){//在规定的优先级上还没有建立任务OSTCBPrioTbl[priol=(OS_TCB*)1;OS_EXIT_CRITICAL();psp=(void*)OSTaskStklnit(task,pdata,ptos,0);err=OSTCBInlt(prio,psp,(void*)O,O,0,(void*)0,0If(err==OS_NO_ERR){OS_ENTER_CRITICAL();OSTaskCtr++;OSTaskCreateHook(OSTCBPrioTbl[prio];OS_EXIT_CRITICAL();If(OSRunning){OSSched();}}else{OS_ENTER_CRITICAL();OSTCBPrioTbl[prio]=(OS_TCB*)0;OS_EXIT_CRITICAL();}Return(err);}else{OS_EXIT_CRITICAL();return(OS_PRIO_EXIST);}}任务堆栈:每个任务都有自己的堆栈空间。