uCOS-II中的任务管理
uCOS-II
实验一、任务创建与删除1、uC/OS-II介绍对于操作系统的学习,创建任务和删除任务是最为基础的工作,uC/OS-II以源代码的形式发布,是开源软件, 但并不意味着它是免费软件。
可以将其用于教学和私下研究;但是如果将其用于商业用途,那么必须通过Micrium获得商用许可。
uC/OS-II属于抢占式内核,最多可以支持64个任务,分别对应优先级0~63,每个任务只能对应唯一的优先级,其中0为最高优先级。
63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。
uC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。
系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整型变量做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当前cpu的利用率。
μC/OS-II可管理多达63个应用任务,并可以提供如下服务,本章将针对以下服务分别以例程的方式来介绍1)信号量2)互斥信号量3)事件标识4)消息邮箱5)消息队列6)任务管理7)固定大小内存块管理8)时间管理2、任务创建与删除想让uC/OS-II管理用户的任务,用户必须要先建立任务,在开始多任务调度(即调用OSStart())前,用户必须建立至少一个任务。
uC/OS-II提供了两个函数来创建任务:OSTask Create()或OSTaskCreateExt()。
可以使用其中任意一个即可,其函数原型如下:INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U pri o)INT8U OSTaskCreateExt (void(*task)(void *pd),void *pdata,SD_STK *ptos,INT8U prio, INT16U id,OS_STK *pbos,INT32U stk_size, void *pext,INT16U opt)task:任务代码指针pdata:任务的参数指针ptos:任务的堆栈的栈顶指针prio:任务优先级id:任务特殊的标识符(uC/OS-II中还未使用)pbos:任务的堆栈栈底的指针(用于堆栈检验)stk_size:堆栈成员数目的容量(宽度为4字节)pext:指向用户附加的数据域的指针opt:是否允许堆栈检验,是否将堆栈清零,任务是否要进行浮点操作等等删除任务,是说任务将返回并处于休眠状态,任务的代码不再被uC/OS-II调用,而不是删除任务代码。
ucos-ii中文书(邵贝贝)第4章
第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个任务。
嵌入式操作系统_第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
μC OS-II 任务的挂起和恢复
谢谢
纯手打到手抽筋
• 恢复任务函数:INT8U OSTaskResume (INT8U prio)
• INT8U prio :被挂起任务的优先级。
• 被挂起的任务只有通过调用 OSTaskResume()才能恢 复。恢复任务只能用于已经Suspend的Task且不能是 空任务。要使任务处于就绪状态,OS_TCBDly域必须 为0
• 挂起任务函数原型 INT8U OSTaskSuspend (INT8U prio); 如果参数prio为常数OS_PRIO_SELF,则表示 挂起当前任务自身。 • 恢复任务函数原型: INT8U OSTaskResume (INT8U prio)
• 挂起任务可通过调用OSTaskSuspend()函数 来完成。被 挂起的任务只能通过调用 OSTaskResume()函数来恢复。任务挂起是一 个附加功能。 也就是说,如果任务在被挂起的同时也在 等待延时的期满,那么,挂起操作需要被 取消,而任务继续等待延时期满,并转入 就绪状态。任务可以挂起自己或者其它任 务。
检验要挂起的任务是否存在
存在则从就续表移除
OSTASKSUSPEND在任务的在被挂起
任务调度程序:只有在被挂起的任务是调 用本函数的任务本身的情况下才调用
注意:被挂起的任务可能没有在就绪表中,因为它有可能在等待事 件发生或时延的期满,这种情况下,要被挂起的任务在OSRdyTb1[ ] 中对应的位已被清除了(即为0),再次清除该位,要比先检验该位是 否清除了再在它没被清除时清除它快得多,所以不用检验直接清除 它。
• 只能在其它的任务里面调用此函数来恢复
这里需要注意的是,如果 等待时间不是0,任务将 会清楚任务的挂起标志并 且返回OS_NO_ERR
北航ARM9嵌入式系统实验实验三uCOS-II实验
北航ARM9嵌⼊式系统实验实验三uCOS-II实验实验三 uCOS-II实验⼀、实验⽬的在内核移植了uCOS-II 的处理器上创建任务。
⼆、实验内容1)运⾏实验⼗,在超级终端上观察四个任务的切换。
2)任务1~3,每个控制“红”、“绿”、“蓝”⼀种颜⾊的显⽰,适当增加OSTimeDly()的时间,且优先级⾼的任务延时时间加长,以便看清三种颜⾊。
3)引⼊⼀个全局变量BOOLEAN ac_key,解决完整刷屏问题。
4)任务4管理键盘和超级终端,当键盘有输⼊时在超级终端上显⽰相应的字符。
三、预备知识1)掌握在EWARM 集成开发环境中编写和调试程序的基本过程。
2)了解ARM920T 处理器的结构。
3)了解uCOS-II 系统结构。
四、实验设备及⼯具1)2410s教学实验箱2)ARM ADS1.2集成开发环境3)⽤于ARM920T的JTAG仿真器4)串⼝连接线五、实验原理及说明所谓移植,指的是⼀个操作系统可以在某个微处理器或者微控制器上运⾏。
虽然uCOS-II的⼤部分源代码是⽤C语⾔写成的,仍需要⽤C语⾔和汇编语⾔完成⼀些与处理器相关的代码。
⽐如:uCOS-II在读写处理器、寄存器时只能通过汇编语⾔来实现。
因为uCOS-II 在设计的时候就已经充分考虑了可移植性,所以,uCOS-II的移植还是⽐较容易的。
要使uCOS-II可以正常⼯作,处理器必须满⾜以下要求:(1)处理器的C编译器能产⽣可重⼊代码可重⼊的代码指的是⼀段代码(如⼀个函数)可以被多个任务同时调⽤,⽽不必担⼼会破坏数据。
也就是说,可重⼊型函数在任何时候都可以被中断执⾏,过⼀段时间以后⼜可以继续运⾏,⽽不会因为在函数中断的时候被其他的任务重新调⽤,影响函数中的数据。
(2)在程序中可以打开或者关闭中断在uCOS-II中,可以通过OS_ENTER_CRITICAL()或者OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。
这需要处理器的⽀持,在ARM920T的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。
uOSII函数介绍
6.7.5 无等待地从一个消息队列中取得消息, OSQAccept() 39
6.7.6 清空一个消息队列, OSQFlush() 40
6.7.7 查询一个消息队列的状态,OSQQuery() 41
6.7.8 使用消息队列读取模拟量的值 42
c2, //OS_STK *ptos , //任务堆栈栈顶的指针
d2); //INT8U prio //任务的优先级别
//可以再加其他任务
//可以再加其他初始化
OSStart(); //开始多任务处理
}
//比如都要用公共资源UART,不能同时用,可分别用
{
OSSemPend(UART_Flag,0,&err); //请求信号量UART_Flag
Function(UART); //使用信号量UART_Flag
OSSemPost(UART_Flag); //发送信号量UART_Flag
第6章 任务之间的通讯与同步 1
6.0 事件控制块ECB 2
6.1 初始化一个ECB块,OSEVENTWAITLISTINIT() 6
6.2 使一个任务进入就绪状态,OSEVENTTASKRDY() 7
6.3 使一个任务进入等待状态, OSEVENTTASKWAIT() 9
6.4 由于等待超时将一个任务置为就绪状态, OSEVENTTO() 9
void a1(void *dataptr)
{
……;
while(1) //任务体1
{
OSSemPend(UART_Flag,0,&err); //请求信号量UART_Flag
uCOS-II内核详解
UC/OS-II内核详解一.内核概述:多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。
内核提供的基本服务是任务切换。
之所以使用实时内核可以大大简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,由实时内核来管理它们。
内核本身也增加了应用程序的额外负荷,代码空间增加ROM的用量,内核本身的数据结构增加了RAM的用量。
但更主要的是,每个任务要有自己的栈空间,这一块吃起内存来是相当厉害的。
内核本身对CPU的占用时间一般在2到5个百分点之间。
UC/OS-II有一个精巧的内核调度算法,实时内核精小,执行效率高,算法巧妙,代码空间很少。
UC/OS-II的内核还可以被裁剪,Hmax中RTOS的就是一个被高度裁剪过的UC/OS-II。
二.任务控制块 OS_TCB:uC/OS-II的TCB数据结构简单,内容容易理解,保存最基本的任务信息,同时还支持裁减来减小内存消耗,TCB是事先根据用户配置,静态分配内存的结构数组,通过优先级序号进行添加,查找,删除等功能。
减少动态内存分配和释放。
因为依靠优先级进行TCB分配,每个任务必须有自己的优先级,不能和其他任务具有相同的优先级。
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是指向当前任务栈顶的指针。
uCOS-II 的任务
uC/OS-II 的任务:从任务的存储结构来看,uC/OS-II的任务由三个部分构成:1任务程序代码,任务的执行部分2任务堆栈,用来保存任务工作环境3任务控制块,用来保存任务属性每一个任务都作为一个节点,组成一个双向的任务链表。
用户任务:从程序代码上看,用户任务似乎就是一个C语言函数,但是这个函数不是一般的C语言函数,它是一个任务(线程)。
因此,它不是被主函数或其他函数调用的,主函数mian()只是负责创建和启动它们,而由操作系统负责来调度它们。
系统任务:uC/OS-II预定义了两个为应用程序服务的系统任务:4空闲任务(OSTaskIdle)5统计任务(OSTaskStat)其中空闲任务是每个应用程序必须使用的。
OSTaskIdle由系统自动创建,在系统初始化时,∙OSInit --> OS_InitTaskIdle --> OSTaskIdle如果用户应用程序要使用统计任务,则必须把定义在OS_CFG.H 中的OS_TASK_STAT_EN设置为1,并且必须在创建统计任务之前调用函数OSStatInit( )对统计任务进行初始化。
任务优先级:优先级数目通过OS_CFG.H中的OS_LOWEST_PRIO配置。
固定地,系统总是把最低优先级别OS_LOWEST_PRIO自动赋给空闲任务。
如果应用程序中还使用了统计任务,则系统会把OS_LOWEST_PRIO - 1自动赋给统计任务。
由于每个任务都具有唯一的优先级别,因此uC/OS-II通常也用任务的优先级别来作为这个任务的标识。
任务堆栈:堆栈的增长方向随系统所使用的处理器不同而不同,为提高应用程序的可移植性,可利用OS_CFG.H中的OS_STK_GROWTH作为选择开关。
把CPU启动任务时所需的初始数据事先存放在任务的堆栈中,当任务获得CPU使用权时,就可以把堆栈中的初始数据复制到CPU 的各寄存器中,使任务顺利地启动并运行。
任务堆栈的初始化工作是由系统通过在OSTaskCreate ( )中调用OSTaskStkInit ( )来完成的。
μCOS-Ⅱ操作系统
μC/OS-Ⅱ操作系统的简介2009-05-26 22:06μc/os-ii是由jean brosse于1992年编写的一个嵌入式多任务实时操作系统。
最早这个系统叫做μc/os,后来经过近10年的应用和修改,在1999年jean j.labrosse推出了;μc/os-ii,并在2000年得到了美国联邦航空管理局对用于商用飞机的、符合rtca do178b标准的认证,从而证明μc/os-ii具有足够的稳定性和安全性。
μc/os-ii是一个可裁减、源代码开放、结构小巧、可抢占式的实时多任务内核,是专为微控制器系统和软件开发而设计的,是控制器启动后首先执行的背景程序,并作为整个系统的框架贯穿系统运行的始终。
它具有执行效率高、占用空间小、可移植性强、实时性能良好和可扩展性强等特点。
采用μc/os-ii实时操作系统可以有效地对任务进行调度;对各任务赋予不同的优先级可以保证任务及时响应,而且采用实时操作系统,降低了程序的复杂度,方便程序的开发和维护。
μc/os-ii的文件体系结构如图1所示。
图1 μc/os-ii的文件体系结构图基于μC/OS—II的嵌入式构件系统设计2009-05-26 22:08引言近些年来,随着嵌入式产品需求的不断增加,嵌入式软件正变得越来越复杂,而产品的开发周期也越来越短。
嵌入式软件开发迫切需要更高效的软件重用手段。
随着软件复用研究成为热点,其核心技术——构件化软件开发方法(CBD)引起了软件工程领域的高度关注,并且在工程应用领域获得了极大的成功。
这种开发方法已在办公应用、电子商务、因特网及分布式网络应用中广泛使用;但在嵌入式领域,构件技术仍处于起步阶段,目前没有一个统一通用的构件规范。
尽管如此,由于基于构件的软件设计方法能够极好地满足嵌入式软件几乎所有的特性(如定制、裁剪、动态演变等),有效缩短产品开发周期,这种设计方法无疑将给嵌入式系统的开发带来巨大的好处。
本文尝试将构件化软件设计思想引入嵌入式软件设计中,提出了一种适用于嵌入式软件的基于构件的软件体系结构,并且在常用输入设备键盘的应用实践中,验证了此体系结构的可行性。
1-uCOS-II 工作流程图
uC/OS 的实时性就是靠定时中断来完成。 每个时钟节拍到来,就会产生一次定时中断,中断后进行任务调度,运行 就绪表中优先级最高的任务(非抢先型内核中断后继续运行被中断任 务)。即过一段时间就检测是否有重要任务需要运行,是的就转而运行更 重要的任务,从而确保实时性(裸机程序就无法这样做了)。
至少创建一个任务。 一般创建一个最高优 先级别 TaskStart 任 务(建议),任务调 度后,在这个任务中 再创建其他任务,初 始化硬件,并开中 断。
进入多任务管理阶 段,将就绪表ቤተ መጻሕፍቲ ባይዱ最高 优先级任务的栈指针 加载到 SP 中,并强 制中断返回。
uC/OS 的任务调度工作: ①查找就绪表中最高优先级任务。 ②实现任务切换。 分为:
⑥ ①
初始化变量 OSIint
中断
②
创建任务 OSTaskCreate
③
进入多任务管理阶段 OSStart
④
任务调度 OSSched/OSIntExt
⑤
用户任务 MyTask
初始化所有全局变量、数 据结构、创建最低优先级 空闲任务 OSTaskIde, (如果使用了统计任务, 也在此创建),创建 6 个 空数据链表: ①空任务控制块链表 ②空事件控制块链表 ③空队列控制块链表 ④空标志组链表 ⑤空内存控制块链表 ⑥空闲定时器控制块链表
主动让出 CPU:延时、 请求临界资源而挂起、
如果按照刚才的建议 去做,首次调度时, 肯定运行 TaskStart ,在这任 务中再创建其他任
任务调度,是内核的主要服务,是 区分裸机跟多任务系统的最大特 点。好的调度策略,能更好地发挥 系统的效率
嵌入式实时操作系统题库1
嵌入式实时操作系统题库一、填空题1.uC/OS-II是一个简洁、易用的基于优先级的嵌入式(抢占式)多任务实时内核。
2.任务是一个无返回的无穷循环。
uc/os-ii总是运行进入就绪状态的(最高优先级)的任务。
3.因为uc/os-ii总是运行进入就绪状态的最高优先级的任务。
所以,确定哪个任务优先级最高,下面该哪个任务运行,这个工作就是由(调度器(scheduler))来完成的。
4.(任务级)的调度是由函数OSSched()完成的,而(中断级)的调度是由函数OSIntExt() 完成。
对于OSSched(),它内部调用的是(OS_TASK_SW())完成实际的调度;OSIntExt()内部调用的是(OSCtxSw())实现调度。
5.任务切换其实很简单,由如下2步完成:(1)将被挂起任务的处理器寄存器推入自己的(任务堆栈)。
(2)然后将进入就绪状态的最高优先级的任务的寄存器值从堆栈中恢复到(寄存器)中。
6.任务的5种状态。
(睡眠态(task dormat)):任务驻留于程序空间(rom或ram)中,暂时没交给ucos-ii处理。
(就绪态(task ready)):任务一旦建立,这个任务就进入了就绪态。
(运行态(task running)):调用OSStart()可以启动多任务。
OSStart()函数只能调用一次,一旦调用,系统将运行进入就绪态并且优先级最高的任务。
(等待状态(task waiting)):正在运行的任务,通过延迟函数或pend(挂起)相关函数后,将进入等待状态。
(中断状态(ISR running)):正在运行的任务是可以被中断的,除非该任务将中断关闭或者ucos-ii将中断关闭。
7.(不可剥夺型)内核要求每个任务自我放弃CPU的所有权。
不可剥夺型调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。
8.当系统响应时间很重要时,要使用(可剥夺型)内核。
最高优先级的任务一旦就绪,总能得到CPU的控制权。
嵌入式实时操作系统ucosii
医疗电子
ucosii在医疗电子领域 中应用于医疗设备、监
护仪、分析仪等。
物联网
ucosii在物联网领域中 应用于传感器节点、网
关、路由器等设备。
02
ucosii的体系结构与内核
任务管理
任务创建
ucosii提供了创建新任务的函数,如 OSTaskCreate(),用于创建新任务。
任务删除
ucosii提供了删除任务的函数,如 OSTaskDelete(),用于删除不再需要的任 务。
时间管理
01
02
03
时间节拍
ucosii通过定时器产生固 定时间间隔的节拍信号, 用于任务调度和时间管理 。
超时处理
ucosii支持超时机制,当 某个任务等待时间超过预 定阈值时触发相应的处理 函数。
时间函数
ucosii提供了一系列时间 函数,如OSTimeDly()、 OSTimeTick()等,用于时 间相关的操作和控制。
智能家居
ucosii适用于智能家居领域,可应用于 智能家电控制、家庭安全监控等场景。
02
03
医疗电子
ucosii适用于医疗电子领域,如医疗设 备控制、病人监控等,其可靠性和实 时性为医疗系统提供了有力保障。
THANKS。
应用软件的开发
任务管理
在UCOSII中,任务是用来实现应用程序功能的。在进行应用软件的开发时,需要创建和管理任务。这包括任务的创 建、删除、挂起和恢复等操作。
任务间通信
为了实现任务间的协同工作,需要进行任务间通信。UCOSII提供了信号量、消息队列、互斥量等机制来实现任务间 通信。在进行应用软件的开发时,需要利用这些机制来实现任务间的同步和数据交换。
uCOSII原理及应用
任务控制块
用于存储任务的运行状态和控制信息,包括任 务的优先级、状态、堆栈指针等。
任务切换函数
用于实现任务之间的切换,包括保存当前任务的上下文和恢复下一个任务的上 下文。
ucosii的任务管理
创建任务
通过调用ucosii提供的函数, 创建新的任务并分配相应的 资源。
在物联网应用中,ucosii能够为各种智能硬件提供统一的操 作系统平台,实现设备的互联互通和智能化管理。同时, ucosii还提供了丰富的中间件和驱动程序,方便开发者快速 开发出各种智能硬件和应用软件。
ucosii在嵌入式系统中的应用
嵌入式系统是指嵌入到硬件中的计算机系统,具有特定的功能和性能要求。ucosii作为一种实时操作 系统,在嵌入式系统中也有着广泛的应用。
调试工具
使用JTAG、SWD等调试工具,通过串口、网络等方式与目标板进行通信,实现程序的 下载、运行、断点设置等操作。
调试步骤
首先确认硬件连接正确,然后通过调试工具将程序下载到目标板中,设置断点并运行程 序,观察程序运行过程中变量的变化和程序的执行流程。
常见问题
硬件连接问题、调试工具配置问题、程序编译错误等。
ucosii的性能分析
性能指标
响应时间、吞吐量、资源利用率等。
分析方法
通过代码审查、性能测试、瓶颈分析等方法,找出影响性能的 关键因素,如算法复杂度、内存访问模式、IO性能等。
优化建议
针对分析结果,提出优化建议,如改进算法、优化数据结 构、减少IO操作等。
ucosii的优化建议
算法优化
通过改进算法,减少计算量和复杂度,提高程序执行效率。
易用性
UCOS-II操作系统详解
VμC/OS 和μC/OS-II是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。
CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。
工作原理编辑uC/OS-II是一种基于优先级的可抢先的硬实时内核。
要实现多任务机制,那么目标CPU必须具备一种在运行期更改PC的途径,否则无法做到切换。
不幸的是,直接设置PC指针,还没有哪个CPU支持这样的指令。
但是一般CPU都允许通过类似JMP,CALL这样的指令来间接的修改PC。
我们的多任务机制的实现也正是基于这个出发点。
事实上,我们使用CALL指令或者软中断指令来修改PC,主要是软中断。
但在一些CPU上,并不存在软中断这样的概念,所以,我们在那些CPU上,使用几条PUSH指令加上一条CALL指令来模拟一次软中断的发生。
在uC/OS-II里,每个任务都有一个任务控制块(Task Control Block),这是一个比较复杂的数据结构。
在任务控制块的偏移为0的地方,存储着一个指针,它记录了所属任务的专用堆栈地址。
事实上,在uC/OS-II内,每个任务都有自己的专用堆栈,彼此之间不能侵犯。
这点要求程序员在他们的程序中保证。
一般的做法是把他们申明成静态数组。
而且要申明成OS_STK类型。
当任务有了自己的堆栈,那么就可以将每一个任务堆栈在那里记录到前面谈到的任务控制快偏移为0的地方。
以后每当发生任务切换,系统必然会先进入一个中断,这一般是通过软中断或者时钟中断实现。
然后系统会先把当前任务的堆栈地址保存起来,仅接着恢复要切换的任务的堆栈地址。
由于哪个任务的堆栈里一定也存的是地址(还记得我们前面说过的,每当发生任务切换,系统必然会先进入一个中断,而一旦中断CPU就会把地址压入堆栈),这样,就达到了修改PC为下一个任务的地址的目的。
任务管理编辑uC/OS-II 中最多可以支持64 个任务,分别对应优先级0~63,其中0 为最高优先级。
uCOS-II嵌入式操作系统介绍与移植
OSStartHighRd
1、该函数是在OSStart函数中调用 2、负责从最高优先级任务的TCB中获得该任务的堆
栈指针sp,并依次将cpu现场恢复,这时系统就将 控制权交给用户创建的该任务进程,直到该任务被 阻塞或者被其他更高优先级的任务抢占cpu 3、该函数仅在多任务启动时被执行一次,用来启 动之前创建的第一个,也就是最高优先级的任务执 行
3、可从网站上获 得全部源码及其在各种体系结构平 台上的移植范例。
uC/OS-II特点
1、uC/OS-II内核具有可抢占的实时 多任务调度功能
2、提供了许多系统服务,如信号量、 消息队列、邮箱、内存管理、时间 函数等
3、这些功能可以根据不同的需求进 行裁减。
uC/OS-II的移植
ARM处理器相关宏定义
1、退出临界区
#defineOS_ENTER_CRITICAL() ARMDisableInt()
2、进入临界区
#defineOS_EXIT_CRITICAL() ARMEnableInt()
堆栈增长方向
1、堆栈由高地址向低地址增长,这个也 是和编译器有关的,当进行函数调用时, 入口参数和返回地址一般都会保存在当 前任务的堆栈中,编译器的编译选项和 由此生成的堆栈指令就会决定堆栈的增 长方向。
#define OS_STK_GROWTH 1
OS_CPU.c的移植
1、任务堆栈初始化 2、系统hook函数 3、中断级任务切换函数
任务堆栈初始化OSTaskStkInit
1、由OSTaskCreate或OSTaskCreateExt调用 2、用来初始化任务的堆栈并返回新的堆栈指针stk。
退出/进入临界区函数 ARMDisableInt/ARMEnableInt
uCOS-II简介
4.1OC/OS-II简介UC/OS-II 是一种基于优先级的可抢先的硬实时内核。
自从92 年发布以来,在世界各地都获得了广泛的应用,它是一种专门为嵌入式设备设计的内核,目前已经被移植到40 多种不同结构的CPU 上,运行在从8 位到64 位的各种系统之上。
尤其值得一提的是,该系统自从2.51版本之后,就通过了美国FAA 认证,可以运行在诸如航天器等对安全要求极为苛刻的系统之上。
鉴于UC/OS-II 可以免费获得代码,对于嵌入式RTOS 而言,选择UC/OS 无疑是最经济的选择。
需要说明的是,UC/OS-II 作为一个实时操作系统只提供了多任务调度等基本功能,这在实际应用中显然是不够的。
除了移植好的操作系统内核部分,还必须有文件系统,全部硬件的驱动程序,图形API,控件函数,综合提高的消息函数以及几个系统必须的基本任务,象键盘,触摸屏,LCD 刷新等。
有了这些,UC/OS-II 才能实现复杂的功能。
特殊需求的地方还需要像USB通信协议,TCP/IP 协议等更复杂的软件模块。
博创提供的UC/OS-II 库文件中包含了上述大部分功能,基于库的开发变的非常简单,在基本的程序框架下应用我们提供的丰富API 函数即可。
实际开发中,用户的工程中无需包括UC/OS-II 的源代码,只需要包括库文件即可。
当然,用户也可以了解库中部分代码的源文件,可以根据自己的需求就行重新编译,也可以对自己的一系列源文件生成一个专门的库,方便自己后续工作。
UC/OS-II 的开发中,应用程序和操作系统是绑在一起编译的,所生成的system.bin 文件是唯一的可执行文件,其中包括了所需要的UC/OS-II 代码和被用到的驱动程序等函数代码,以及应用程序的代码。
system.bin 文件是存放在平台的16M FLASH 中的,在系统启动时由BIOS依靠文件系统从FLASH 中读入到SDRAM 中,然后把控制转移到该代码上,完成所谓的引导。
简单协作式多任务操作系统设计
简单协作式多任务操作系统设计引言根据老师的要求,在这次的课程设计实验中,我们需要设计出满足老师要求的简单协作多任务操作系统。
本次实验中,我们需要设计的是简单协作式多任务操作系统,uC/OS-II是规模最小的系统之一,它的实质是一个微型内核,它是基于优先级的可剥夺型内核,系统中的所有的任务都是一个唯一的优先级别,它适合应用在实时性要求强的场合。
根据我们自身的能力和实际情况,我们发现,我们可以采用C语言来编写我们所需要的程序。
uC/OS-II的一个特点是它区分用户空间和系统空间,所以,它适合应用在比较简单的处理器上,所以,我们能够在自己的电脑上进行程序编写。
在uC/OS-II里,每个任务都有一个任务控制块,这是一个比较复杂的数据结构;任务控制块(即TCB)在uC/OS-II里是用来记录任务堆栈指针、任务的当前状态、任务的优先级别等一些与任务管理有关的属性的表。
而在uC/OS-II 中,会用两条链表来管理TCB:一条是空任务块链表(没有分配任务),一条是任务块链表(其中所有任务控制块已经分配给任务)。
同时,每个任务都有一个自身的堆栈,它们是独立属于任务本身的,即为自用堆栈。
堆栈的作用这里也简单的说明一下,即保护现场,传递函数,设置局部变量,保存任务上下文等。
通过指针的指向来控制堆栈的使用,先指向控制块,从栈中提取上下文,送入到CPU中运行,运行完毕后指针指向控制块提取下一个任务,依次循环执行。
任务上下文的切换实质是断点数据的切换,也就是处理器(CPU)的堆栈指针的切换,被中止的运行任务堆栈指针要保护到该任务的TCB中,待运行任务的任务堆栈指针要由该任务控制块转存到处理器的SP中。
uC/OS-II也提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等,由于我们这一次的实验要求比较低,所以,其中的函数调用我们是用不到的,具体使用的函数,我们会在下面的程序设计中进行说明。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
任务的优先权 及优先级别
void main(void) typedef unsigned int OS_STK; { 在应用程序中定义任务堆栈的栈区非常简单, //这是系统定义的一个数据类型 在创建用户任务时,要 …… 即定义一个 OS_STK 类型的一个数组并在创建 传递任务的堆栈指针和 OSTaskCreate( 任务优先级别 一个任务时把这个数组的地址赋给该任务就 MyTask, //任务的指针 可以了。 &MyTaskAgu, //传递给任务的参数 例如: & MyTaskStk[MyTaskStkN-1],//任务堆栈栈顶地址 20 //任务的优先级别 //定义堆栈的长度 ); #define TASK_STK_SIZE 512 …… }
μC/OS-II规定,一个 用户应用程序必须 可运行而处于所谓的空闲状态, 有调用任务延时函数 pdata =CPU pdata; //防止某些编译器报错 系统提供的空闲任务 使用这个空闲任务, 为了使 在没有用户任务可执 for(;;) 行的时候有事可做, μC/OS-II { 而且这个任务是不 OS_ENTER_CRITICAL( );//关闭中断 提供了一个叫做空闲任务 能用软件来删除的 OSdleCtr++; //计数
保存 CPU 寄存器中的内容及存 使用函数 储任务私有数据的需要,每个 OSTaskCreate( )创建任 任务都应该配有自己的堆栈, 务时,一定要注意所使 任 务 堆 栈 任务堆栈是任务的重要的组成 用的处理器对堆栈增长 部分
任务的状态及其转换
系统为任务配备 了任务控制块且 在任务就绪表中 进行了就绪登记, 这时任务的状态 叫做就绪状态。 处于就绪状态的 任务如果经调度 器判断获得了 CPU的使用权, 则任务就进入运 行状态
任务一旦响应中 。 断申请就会中止 运行而去执行中 断服务程序,这 时任务的状态叫 做中断服务状态
任务的优先级别。
任务在内存中的结构
void MyTask(void *pdata) { 临界段 for (;;) { 可以被中断的用户代码; OS_ENTER_CRITICAL( );//进入临界段(关中断) 不可以被中断的用户代码; OS_EXIT_CRITICAL( ); //退出临界段(开中断) 可以被中断的用户代码; } 无限循 }
μC/OS-II中 的任务管理
任务在没有被配备 任务控制块或被剥 夺了任务控制块时 的状态叫做任务的 睡眠状态
正在运行的任务,需要等 待一段时间或需要等待一 个事件发生再运行时,该 任务就会把CPU的使用权让 给别的任务而使任务进入 一个正在运行的 等待状态,利用等待函数 OSTimeDly()等实现
用户可以根据应用程序的需要,在文件 μC/OS_II 把任务的优先 固定地,系统总是把最低优先级别 OS_CFG.H中通过给表示最低优先级别的 OS_LOWEST_PRIO 自动赋给空闲任务。如果 权分为 64 个优先级别,每 常数OS_LOWEST_PRIO赋值的方法,来说 应用程序中还使用了统计任务,系统则会 一个级别都用一个数字来 明应用程序中任务优先级别的数目。该 把优先级别 OS_LOWEST_PRIO-1 自动赋给统 表示。数字0表示任务的 常数一旦被定义,则意味着系统中可供 计任务,因此用户任务可以使用的优先级 使用的优先级别为: 0,1,2,……, 优先级别最高,数字越大 别是:0,1,2…OS_LOWEST_PRIO-2,共 OS_LOWEST_PRIO ,共OS_LOWEST_PRIO+1 则表示任务的优先级别越 OS_LOWEST_PRIO-1个 个 低
于是可以这样说, μ C/OS-II 用户任务代码的 任务的代码结构是一个可以 一般结构 带有临界段的无限循环。
环
void OSTaskIdle(void* pdata) { # 在多任务系统运行时,系统经 if OS_CRITI; 常会在某个时间内无用户任务 空闲任务只是做了一 #endif注意!空闲任务中没 个计数工作
任务控制块结构的主要成员
任务控制块——任务在系统中的身份证
由于系统存在着多个任务,于是
typedef struct os_tcb { 系统如何来识别并管理一个任务就是 OS_STK *OSTCBStkPtr; //指向任务堆栈栈顶的指针 …… 一个需要解决的问题。识别一个任务 INT8U OSTCBStat; //任务的当前状态标志 基于上述原因,系统必须为每个任务创建 的最直接的办法是为每一个任务起一 INT8U OSTCBPrio; //任务的优先级别 一个保存与该任务有关的相关信息的数据 个名称。 …… 结构,这个数据结构就叫做该任务的任务 } OS_TCB; 由于μC/OS-II中的任务都有一个 控制块(TCB)。
任务控制块是不是像 前面谈到,一个任务的任务控制块 的主要作用就是保存该任务的虚拟 我们人在一个国家中 处理器的堆栈指针寄存器 SP 。 的身份证?(其实, 另外,前面也谈到,一个任务在 其实,随着任务管理工作的复杂性 不同的时刻还处于不同的状态, 系统中的所有资源 惟一的优先级别,因此μC/OS-II是用 的提高,它还应该保存一些其他信 显然,记录了任务状态的数据也 都应该有身份证。) 任务的优先级来作为任务的标识的。 息。 应该保存到任务控制块中。 所以,任务控制块还要来保存该
OS_EXIT_CRITICAL( ); //开放中断 OSTaskIdle( )的系统任务 }
}
μC/OS-II提供的另一个系统任务是统
计任务OSTaskStat( )。这个统计任务 每秒计算一次CPU在单位时间内被使用 系统提供的另一个任务 的时间,并把计算结果以百分比的形 —— 统计任务 式存放在变量OSCPUsage 中,以便应用 程序通过访问它来了解CPU的利用率, 所以这个系统任务OSTaskStat( )叫做 统计任务