1、第4章 进程与线程_uCOS的任务,1,4,2,5,uC/OS-II的任务,3,任务控制块,任务堆栈,uC/OS-II 概述,系统任务,uC/OS-II 概述,C/OSMicro Controller OS,微控制器操作系统 美国人Jean Labrosse 1992年完成 应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等 1998年出C/OS-II,目前的版本C/OS -II V2.61 2000年,得到美国航空管理局(FAA)的认证,可以用于飞行器中 网站www.ucos-II.com(),uC/OS-II 概述-文件结构,体系结构,uC/OS
2、-II 概述-性能特点,源代码公开 可移植(Portable) 大部分代码用ANSI C写,与处理器无关,移植时不需修改 少量与微处理器硬件相关的部分用C与汇编编写,移植时需修改: OS_CPU.H /与硬件相关,移植时需修改 OS_CPU_A.ASM /集中了所有与处理器相关的汇编语言代码 OS_CPU.C /集中了所有与处理器相关的汇编语言代码,uC/OS-II 概述-性能特点,可裁剪(Scalable) 可以只使用 C/OS-II中应用程序需要的那些系统服务。也就是说某产品可以只使用很少几个 C/OS-II调用,而另一个产品则使用了几乎所有 C/OS-II的功能,这样可以减少产品中的 C
3、/OS-II所需的存储器空间(RAM和ROM)。 可剪裁性通过条件编译实现。,uC/OS-II 概述-性能特点,可剥夺性(Preemptive)与可确定性 内核可剥夺、函数调用或系统服务的执行时间具有可确定性,是硬实时操作系统。 支持多任务 C/OS-II可以管理64个任务 任务栈 每个任务有自己单独的栈, C/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。,uC/OS-II 概述-性能特点,系统服务 C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。 中断管理 中断可以使正在执行的任务暂时挂起,如果优先级更高的任
4、务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。,uC/OS-II 概述-图书,描述了C/OS-II内部的工作原理 随书的CD中包含了源代码 工业界最清晰的源代码 除英文版外,有中文和韩文版,Chinese,English,ISBN 1-57820-103-9 美国CMP BOOK,ISBN 7-81077-290-2 北京航空航天大学出版社,第4章 进程与线程_uCOS的任务,1,4,2,5,uC/OS-II的任务,3,任务控制块,任务堆栈,uC/OS-II 概述,系统任务,uC/OS-II的任务,任务代码结构 任务存储结构 任务状态 任务优先级,uC
5、/OS-II的任务代码结构,uCOS中的任务是一个线程,其代码通常是一个无限循环结构/超循环结构,看起来像其它C函数一样。,void mytask(void *pdata) for (;) do something;waiting;do something; ,void mytask () for(;) ,任务代码,任务控制块,指向任务堆栈的指针 指向前一个任务控制块的指针 指向后一个任务控制块的指针 任务的优先级别 ,任务,任务的存储结构,uC/OS-II的任务-存储结构,指向任务代码,任务 控制块,任务 代码,任务 堆栈,任务1,任务控制块链表,uC/OS-II的任务-存储结构,任务 控制
6、块,任务 代码,任务 堆栈,任务2,任务 控制块,任务 代码,任务 堆栈,任务n,uC/OS-II的任务-状态,uC/OS-II的任务有5种状态 睡眠态(DORMANT): 任务驻留在程序空间,还没有交给uCOS管理,即还没有配备任务控制块,还没有被创建。 就绪态(READY): 任务一旦建立,就进入就绪态准备运行,“万事具备,只欠CPU”。 运行态(RUNNING): 正在使用CPU的状态称运行态。 等待态(WAITING):等待某事件发生的状态. 中断服务态(ISR):正在运行的任务被中断时就进入了中断服务态(ISR)。,uC/OS-II的任务-状态,uC/OS-II的任务-优先级,COS
7、 支持64个任务,每个任务有一个特定的优先级。 任务的优先级别用数字表示,0表示的任务的优先级最高,数字越大表示的优先级越低。 通过常数OS_LOWEST_PRIO (在OS_CFG.H中)定义系统的最低优先级别,同时限定系统能容纳的最多任务数量。 OS_LOWEST_PRIO给空闲任务, OS_LOWEST_PRIO-1给统计任务。,第4章 进程与线程_uCOS的任务,1,4,2,5,uC/OS-II的任务,3,任务控制块,任务堆栈,uC/OS-II 概述,系统任务,任务控制块,1)任务控制块结构 2)任务控制块链表 3)任务控制块初始化,任务控制块-结构,任务控制块(Task Contro
8、l Blocks, OS_TCBs)是COS用来存储任务堆栈指针、当前状态、优先级及任务链表指针等属性的一个数据结构。 任务控制块是任务的身份证,每个任务都有一个属于自已的任务控制块,当任务的CPU使用权被剥夺时,任务的属性被保存在任务控制块中,而当任务重新得到CPU使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差地继续执行。 OS_TCBs全部驻留在RAM中。 OS_TCBs 在任务建立的时候被初始化.,任务控制块-结构,OSTCBStkPtr:指向当前任务堆栈栈顶的指针。 OSTCBExtPtr:指向用户定义的任务控制块扩展的指针。用户可以扩展任务控制块而不必修改COS-的源代码
9、,只在函数OstaskCreateExt()中使用,使用时将OS_TASK_CREAT_EN设为1. OSTCBStkBottom:指向任务堆栈栈底的指针。递减栈指针指向任务使用的栈空间的最低地址;递增型栈则指向栈空间的最高地址。,任务控制块-结构,OSTCBStkSize:堆栈尺寸。 OSTCBOpt :OSTaskCreateExt()中的选项,COS-目前只支持3个选择项: OS_TASK_OTP_STK_CHK- STK检查 OS_TASK_OPT_STK_CLR-清零 OS_TASK_OPT_SAVE_FP-浮点运算,任务控制块-结构,OSTCBId:存储任务的识别码。 OSTCBN
10、ext和OSTCBPrev:任务控制块OS_TCBs双向链接,将任务控制块链接起来。 OSTCBEventPtr :指向事件控制块的指针。 OSTCBMsg:指向传给任务的消息的指针,任务控制块-结构,OSTCBDly:任务延时的时钟节拍数。当需要把任务延时若干时钟节拍时,或者需要把任务挂起一段时间以等待某事件的发生时需要用到这个变量。如果这个变量为0,表示任务不延时,或者表示等待事件发生的时间没有限制 .,任务控制块-结构,OSTCBStat:任务状态字,可取下列值: OS_STAT_RDY: 处于就绪状态 OS_STAT_SEM: 处于等待信号量状态 OS_STAT_MBOX:处于等待邮箱
11、状态 OS_STAT_Q: 处于等待消息队列状态 OS_STAT_SUSPEND:处于被挂起状态 OS_STAT_MUTEX:处于等待互斥信号量状态,任务控制块-结构,OSTCBPrio:任务优先级。高优先级任务的OSTCBPrio值小,低优先级任务的 OSTCBPrio值大 OSTCBX、OSTCBY、OSTCBBitX与OSTCBBitY: 与优先级有关的量,用于加速任务进入就绪态的过程或进入等待事件发生状态的过程。这些值是在任务建立时算好的,或者是在改变任务优先级时算出的 。,任务控制块-结构,任务控制块-结构,OSTCBDelReq:一个布尔量,用于表示该任务是否需要删除。,任务控制块
12、-链表,任务控制块空闲链表:任务控制块空白链表。 系统初始化时,初始化函数OSInit()将创建一个任务控制块空闲缓冲池,其中有一定数量的空任务控制块,并将其链接成一个单向链表,即空闲链表,并用OSTCBFreeList 指向表头。 当建立一个任务时,即将空闲链表表头指针OSTCBFreeList指向的空任务控制块赋给该任务,然后将OSTCBFreeList指向链表中的下一个空任务控制块,任务控制块-链表,任务控制块空闲链表(List of free OS_TCBs),任务控制块-链表,任务控制块使用链表(双向),使用链表用于管理已建立任务的控制块,任务控制块-初始化,创建任务时,必须创建任务
13、的控制块,通过控制块初始化函数OSTCBInit()完成,其做三件事: 1、从空白/闲任务控制块链表中获取一个任务控制块; 2、用任务的属性值对任务控制块各个成员进行赋值; 3、把这个任务控制块链入到任务控制块使用链表的头部。,任务控制块-初始化OSTCBInit(),/从空闲的OS_TCB缓冲池中获得一个OS_TCB,/如果OS_TCB池中有空闲的OS_TCB,它就被初始化了,/一旦OS_TCB被分配,该任务的创建者就已经完全拥有它了,不担心被同时建立的另一个任务夺取,故可以重新开中断,并继续初始化OS_TCB的数据单元。,任务控制块-初始化OSTCBInit(),任务控制块-初始化OSTC
14、BInit(),任务控制块-初始化OSTCBInit(),任务控制块-初始化OSTCBInit(),/将OS_TCB插入到已建立任务的OS_TCB的双向链表中,该双向链表开始于OSTCBList,而一个新任务的OS_TCB常常被插入到链表的表头,任务控制块-初始化OSTCBInit(),OSTCBList = ptcb,/使任务进入就绪态,/返回一个代码表明OS_TCB已经被分配和初始化了,任务控制块-初始化OSTCBInit(),第4章 进程与线程_uCOS的任务,1,4,2,5,uC/OS-II的任务,3,任务控制块,任务堆栈,uC/OS-II 概述,系统任务,任务堆栈,堆栈创建 堆栈增长
15、方向 堆栈的初始化,任务堆栈-创建,1)堆栈创建 堆栈是在存储器中按数据“后进先出”的原则组织的连续存储空间。用于任务切换和响应中断时保存CPU寄存器中的内容及其它任务私有数据。uCOS如何创建堆栈? OS_STK MyTaskStackstack_size; typedef unsigned int OS_STK; /16位,任务堆栈-增长方向,2)堆栈增长方向:COS支持向上增长(低地址往高地址) 及向下增长堆栈。用户在调用OSTaskCreate()或OSTaskCreateExt()的时候必须确定堆栈增长方式。,任务堆栈-增长方向,向下增长堆栈(OS_STK_GROWTH=1),OST
16、askCreate(task,pdata,可上下两方向增长堆栈,任务堆栈-增长方向,任务堆栈-初始化,3)任务堆栈的初始化 当处理器启动一个任务时,处理器的各寄存器总是需要预置一些与待运行任务相关的初始数据,如指向任务代码的指针、指向任务堆栈的指针、程序状态字PSW等,这些初始数据从何而来? 系统在创建一个新任务时,应该把启动该任务所需的初始数据(指向任务代码的指针、指向任务堆栈的指针、程序状态字PSW等)事先存放到这个任务的堆栈中。 任务堆栈初始化函数OSTaskStkInit()完成上述工作(其在OSTaskCreate()创建任务时被调用)。,任务堆栈-初始化,OS_STK *OSTas
17、kStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt) unsigned int *stk ;opt = opt; /* opt is not used, prevent warning */stk = (unsigned int *)ptos; /* Load stack pointer */,OSTaskStkInit (),任务堆栈-初始化,/* build a context for the new task */*-stk = (unsigned int) task; /* pc */*-stk
18、 = (unsigned int) task; /* lr */*-stk = 0; /* r12 */*-stk = 0; /* r11 */*-stk = 0; /* r10 */*-stk = 0; /* r9 */*-stk = 0; /* r8 */*-stk = 0; /* r7 */*-stk = 0; /* r6 */,任务堆栈-初始化,*-stk = 0; /* r5 */*-stk = 0; /* r4 */*-stk = 0; /* r3 */ *-stk = 0; /* r2 */*-stk = 0; /* r1 */*-stk = (unsigned int) pda
19、ta; /* r0 */*-stk = (SVC32MODE|0x0); /* cpsr IRQ, FIQ disable*/*-stk = (SVC32MODE|0x0); /* spsr IRQ, FIQ disable */return (void *)stk); ,第4章 进程与线程_uCOS的任务,1,4,2,5,uC/OS-II的任务,3,任务控制块,任务堆栈,uC/OS-II 概述,系统任务,系统任务 -空闲任务,空闲任务OSTaskIdle() COS总要建立一个空闲任务,这个任务在没有其它任务进入就绪态时投入运行。这个空闲任务永远设为最低优先级,即OS_LOWEST_PRI0
20、。 空闲任务OSTaskIdle()什么也不做,只是在不停地给一个32位的名叫OSIdleCtr的计数器加1,统计任务使用这个计数器以确定现行应用软件实际消耗的CPU时间。 空闲任务不可能被应用软件删除,系统任务 -空闲任务,系统任务-统计任务,统计任务OSTaskStat() 统计任务是负责统计运行时间的任务,如果用户将系统定义常数OS_TASK_STAT_EN(见文件OS_CFG.H)设为1,这个任务就会建立。一旦得到允许,统计任务每秒运行一次(OS_CORE.C)以计算当前的CPU利用率。也即计算应用程序使用了多少CPU时间,用百分比表示,这个值放在一个有符号8位整数OSCPUsage中,精确度是1个百分点。,第4章 进程与线程_uCOS的任务,1,4,2,5,uC/OS-II的任务,3,任务控制块,任务堆栈,uC/OS-II 概述,系统任务,