uCOS-II中的任务管理

合集下载

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章

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 - 任务的同步互斥通信

嵌入式操作系统_第7章 ucOS-II - 任务的同步互斥通信
释印做畅与系是黄宋黄时缓态之放机,宏丹宏地人和依(冲,后:丹:同们谐靠后的那别:腿缓区只,步依、任,使么走我是冲得有才啊自你运靠工务系用也!己自区到等应行通作之统权会的己信 顺 间,为有任该腿的才。造,,来 利 的而空效务通能如成我但互 的 良不A时数知爱手向唤果极相 做 好致走是)据任缓醒这大就咱沟 法 通导,而务走俩通 一 信致冲任两的,的B任应, 样 来灾区去务个混你呀务该管!从 , 保难写取B任乱不B使处而计证性入因数务着。使算任的其于!了据不不人机务后获等数。能这际系与果得待据从样关统任。打状
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 任务的挂起和恢复

μ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实验

北航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函数介绍

uOSII函数介绍
6.7.4 向消息队列发送一个消息(LIFO),OSQPostFront() 37
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内核详解

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 的任务

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 ( )来完成的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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( )叫做 统计任务
相关文档
最新文档