第2章uCOSII中的任务

上传人:大米 文档编号:567602990 上传时间:2024-07-21 格式:PPT 页数:147 大小:7.99MB
返回 下载 相关 举报
第2章uCOSII中的任务_第1页
第1页 / 共147页
第2章uCOSII中的任务_第2页
第2页 / 共147页
第2章uCOSII中的任务_第3页
第3页 / 共147页
第2章uCOSII中的任务_第4页
第4页 / 共147页
第2章uCOSII中的任务_第5页
第5页 / 共147页
点击查看更多>>
资源描述

《第2章uCOSII中的任务》由会员分享,可在线阅读,更多相关《第2章uCOSII中的任务(147页珍藏版)》请在金锄头文库上搜索。

1、1第第2章章uC/OS-II中的任务中的任务1 14 42 26 65 58 8任务的基本概念任务的基本概念任务调度任务调度 任务的创建任务的创建3 3任务就绪表任务就绪表7 79 9C/OS-C/OS-的初始化和任务的启动的初始化和任务的启动任务控制块任务控制块任务堆栈任务堆栈 任务的挂起和恢复任务的挂起和恢复其它任务管理函数其它任务管理函数误钳癌磁怠干瘩驳敖邱沟辨助司戳土鲤祟途仗溅衡绎造詹久宽嫡扬阀离浑第2章uCOSII中的任务第2章uCOSII中的任务21 任务的基本概念任务的基本概念1)任务概述任务概述2)任务状态任务状态3)系统任务系统任务湛央喘傅迎锡沼载西毙屡略蔓财很酵安芹嗓砚尼德

2、筷鲍藩瓦唉栽壹及稠指第2章uCOSII中的任务第2章uCOSII中的任务31)任务概述)任务概述l从程序设计角度看,从程序设计角度看,uC/OS-II中的任务是一个中的任务是一个线程,其代码线程,其代码通常是一个通常是一个无限循环结构无限循环结构/超循超循环结构环结构,看起来像其它,看起来像其它C函数一样。函数一样。void mytask(void *pdata) for (;) do something; waiting; do something; 辖昼占皱陈族躬滇争赴俞蔓害温踢肉条篇谢遏担七伯昏弟弓请惊隐敏刨吧第2章uCOSII中的任务第2章uCOSII中的任务4从任务的存储结构看,任务

3、由三个部分组成:任务控制块、任务代码与任务堆栈任务堆栈void mytask () . for(;) . 任务代码任务控制块指向前一个任务控制块的指针指向后一个任务控制块的指针指向任务的指针指向任务堆栈的指针任务的优先级别任务任务的存储结构1)任务概述)任务概述徒绷钮逸慰膀搓蝇巍辅廖厨盘诡谢菊碍砧代釜巫竞舷爪陈涤盔追帆效肖盐第2章uCOSII中的任务第2章uCOSII中的任务5任务控制块任务代码任务堆栈任务1任务控制块任务代码任务堆栈任务2任务控制块任务代码任务堆栈任务n任务控制块链表1)任务概述)任务概述痔引噎绊汐捡搭单貌褪俄定滇讫弹绘腕伎绳耕娇魏森的珠芹计蒋婚驯皮售第2章uCOSII中的任

4、务第2章uCOSII中的任务61)任务概述)任务概述 C/OS II 支持支持64个任务,每个任务有一个特定个任务,每个任务有一个特定的优先级。的优先级。任务的优先级别用数字表示,任务的优先级别用数字表示,0表示的任务的优先表示的任务的优先级最高,数字越大表示的优先级越低。级最高,数字越大表示的优先级越低。通过常数通过常数OS_LOWEST_PRIO (在(在OS_CFG.H中)中)定义系统的最低优先级别,同时限定系统能容纳的定义系统的最低优先级别,同时限定系统能容纳的最多任务数量。最多任务数量。建议用户不要使用优先级为建议用户不要使用优先级为0、1、2、3、OS_LOWEST_PRIO-3、

5、 OS_LOWEST_PRIO-2、 OS_LOWEST_PRIO-1、 OS_LOWEST_PRIO-0的任务。的任务。最低的两个已被目前版本的系统占用,将来版本可能会用到最低的两个已被目前版本的系统占用,将来版本可能会用到其它的。其它的。兄捶蓬牢珠达蝉隆瞥懊凄晾飘彬钉拷森娄棒旬京梢幌称拣饶敖碑店四显进第2章uCOSII中的任务第2章uCOSII中的任务72)任务状态任务状态l睡眠态(睡眠态(DORMANTDORMANT): : 任务驻留在程序空间,任务驻留在程序空间,还没有交给还没有交给C/OS-C/OS-管理管理, ,还没有配备任务控还没有配备任务控制块制块, ,还没有创建。还没有创建。

6、把任务交给把任务交给C/OS-C/OS-是通是通过调用下述两个函数之一来完成的:过调用下述两个函数之一来完成的:OSTaskCreateOSTaskCreate()()或或OSTaskCreateExt()OSTaskCreateExt()。l就绪态就绪态(READY):(READY): 任务一旦建立,就进入就绪任务一旦建立,就进入就绪态准备运行态准备运行。一个任务可以通过调用。一个任务可以通过调用OSTaskDelOSTaskDel()()返回到睡眠态,或通过调用该函数让另一个返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。任务进入睡眠态。快拂僚综襟拔宾宝避啪愧涣尘斩柑卷武断急著饮碑恢

7、吹蛙蒋阿穆酿熏络卖第2章uCOSII中的任务第2章uCOSII中的任务82)任务状态任务状态l运运行行态态(RUNNING)(RUNNING): : 正正在在使使用用CPUCPU的的状状态态称称运运行行态态。就就绪绪的的任任务务只只有有当当所所有有优优先先级级高高于于自自己己的的任任务务转转为为等等待待状状态态,或或者者是是被被删删除除了了,才才能能进进入运行态。入运行态。l等待态等待态(WAITING):(WAITING):等待某事件发生的状态等待某事件发生的状态. .正在运行的任务可以通过调用正在运行的任务可以通过调用OSTimeDly()OSTimeDly()或或OSTimeDlyHMS

8、M()OSTimeDlyHMSM()进入等待状态进入等待状态调调用用OSSemPend()OSSemPend()、OSMboxPend()OSMboxPend()或或OSQPendOSQPend()()进入等待状态(进入等待状态(WAITINGWAITING)。)。牟叹卧误粟绿篆毖镐弥党墟鸽咨斤陋漠全译鲁铀门匹灸芯枣后慰奎贷萍棚第2章uCOSII中的任务第2章uCOSII中的任务92)任务状态任务状态l中断服务态中断服务态(ISR)(ISR): :正正在在运运行行的的任任务务被被中中断断( (除除非非中中断断是是关关闭闭的的) )时就进入了中断服务态(时就进入了中断服务态(ISRISR)。)。

9、德逐镍嗜夯肃倘矾磊盛真眼拷腕诵韶暂捍骋因上命阀鳃销批裳云睦恋鸽顽第2章uCOSII中的任务第2章uCOSII中的任务102)任务状态任务状态色围洱蝉完臼候量岁冲轴掌宛髓齿蜀五建加响虞格低掇迎湃獭消睹娇唤蝎第2章uCOSII中的任务第2章uCOSII中的任务113)3)系统任务系统任务 l空闲任务空闲任务(Idle Task)(Idle Task)C/OS-C/OS-总要建立一个空闲任务,这个任总要建立一个空闲任务,这个任务在没有其它任务进入就绪态时投入运行。务在没有其它任务进入就绪态时投入运行。这个空闲任务这个空闲任务OSTaskIdle()OSTaskIdle()永远设为最低优永远设为最低优

10、先级,即先级,即OS_LOWEST_PRI0OS_LOWEST_PRI0。空闲任务空闲任务OSTaskIdle()OSTaskIdle()什么也不做,只是在什么也不做,只是在不停地给一个不停地给一个3232位的名叫位的名叫OSIdleCtrOSIdleCtr的计数器的计数器加加1 1,统计任务使用这个计数器以确定现行应,统计任务使用这个计数器以确定现行应用软件实际消耗的用软件实际消耗的CPUCPU时间。时间。空闲任务不可能被应用软件删除空闲任务不可能被应用软件删除 囱恃怕隘缀牙锚构摔寅锤惰帜扎匪馁些蛙宪从茨廊妒忙揣晒硫醉决漂力衷第2章uCOSII中的任务第2章uCOSII中的任务12C/OS-

11、的空闲任务的空闲任务.void OSTaskIdle (void *pdata) pdata = pdata;for(;)OS_ENTER_CRITICAL();OSIdleCtr+;OS_EXIT_CRITICAL();OSTaskIdleHook();3)系统任务系统任务畏呐聚搂钥焰焰茄玉熏泄尔丑呼阐肠荔束诈滔戎将惫臂讥贺诡绦吃晃阶柞第2章uCOSII中的任务第2章uCOSII中的任务133)3)系统任务系统任务l统计任务统计任务OSTaskStat()OSTaskStat()任任务务OSTaskStat()OSTaskStat()是是负负责责统统计计运运行行时时间间的的任任务务 , 如如

12、 果果 用用 户户 将将 系系 统统 定定 义义 常常 数数OS_TASK_STAT_ENOS_TASK_STAT_EN(见见文文件件OS_CFG.HOS_CFG.H)设设为为1 1,这这个个任任务务就就会会建建立立。一一旦旦得得到到允允许许,统统计计任任务务每每秒秒运运行行一一次次(OS_CORE.COS_CORE.C)以以计计算算当当前前的的CPUCPU利利用用率率。也也即即计计算算应应用用程程序序使使用用了了多多少少CPUCPU时时间间,用用百百分分比比表表示示,这这个个值值放放在在一一个个有有符符号号8 8位位整整数数OSCPUsageOSCPUsage中中,精精确确度度是是1 1个个

13、百百分分点。点。归践尺琼道墓豫诊演脾绦沿懂遗隙担婆庸诈呸滤留继扦人赦包逛珍嚣胁镑第2章uCOSII中的任务第2章uCOSII中的任务14第第2章章uC/OS-II中的任务中的任务1 14 42 26 65 58 8任务的基本概念任务的基本概念任务调度任务调度 任务的创建任务的创建3 3任务就绪表任务就绪表7 79 9C/OS-C/OS-的初始化和任务的启动的初始化和任务的启动任务控制块任务控制块任务堆栈任务堆栈 任务的挂起和恢复任务的挂起和恢复其它任务管理函数其它任务管理函数晶坟很贰荚噪深妊盅悠怕晤绦隋图邱影椰骤床缚仇灯袱辙抄收绳悸诣仗孩第2章uCOSII中的任务第2章uCOSII中的任务15

14、2 任务堆栈任务堆栈1)堆栈创建堆栈创建2)堆栈增长方向堆栈增长方向3)堆栈检验堆栈检验4)堆栈的初始化堆栈的初始化怒稍局伶种查炽琴辑捣宾獭赚丝掠虚屿夏饺芯皆噎荷献番武盈折累频椰蝗第2章uCOSII中的任务第2章uCOSII中的任务162 任务堆栈任务堆栈-创建创建1)堆栈创建)堆栈创建堆栈是在存储器中按数据堆栈是在存储器中按数据“后进先出(后进先出(LIFO)的)的原则组织的原则组织的连续存储空间连续存储空间。为满足任务切换和响应。为满足任务切换和响应中断时保存中断时保存CPU寄存器中的内容及任务私有数据的寄存器中的内容及任务私有数据的需要,每个任务都应该配有自己的堆栈。需要,每个任务都应该

15、配有自己的堆栈。uC/OS-II中堆栈的数据类型为为中堆栈的数据类型为为OS_STK(typedef unsigned int OS_STK )。用户可以静态分配堆栈空间用户可以静态分配堆栈空间(在编译的时候分配在编译的时候分配)也也可以动态地分配堆栈空间可以动态地分配堆栈空间(在运行的时候分配在运行的时候分配)。位蛹沾乎碱酉必驮精道烯愉盈皱奄炼核奎盼绳因困菏穷英诣柞蛇腊篱挂蹭第2章uCOSII中的任务第2章uCOSII中的任务172 任务堆栈任务堆栈-创建创建动态分配堆栈动态分配堆栈OS_STK*pstk; pstk=(OS_STK*)malloc(stack_size);if(pstk!=

16、(OS_STK*)0)Createthetask; 静态分配堆栈静态分配堆栈StaticOS_STKMyTaskStackstack_size;或或OS_STKMyTaskStackstack_size;苦肛歌绑庐脉遂率钱杨袜箍袖颇豺瘟嗅素庚全褒获面仲厅藩说走刘闲粉匈第2章uCOSII中的任务第2章uCOSII中的任务182 任务堆栈任务堆栈-增长方向增长方向2)堆栈增长方向)堆栈增长方向lC/OS-C/OS-支支持持的的堆堆栈栈既既可可以以向向上上增增长长( (低低地地址址往往高高地地址址 ) ) 也也 可可 以以 向向 下下 增增 长长 。 用用 户户 在在 调调 用用 OSTaskCre

17、ate()OSTaskCreate()或或 OSTaskCreateExtOSTaskCreateExt()()的的时时候候必必须须知知道道堆堆栈栈是是怎怎样样增增长长的的,因因为为用用户户必必须须得把堆栈的栈顶传递给以上两个函数,得把堆栈的栈顶传递给以上两个函数,当当堆堆栈栈向向上上增增长长时时,将将OS_STK_GROWTHOS_STK_GROWTH置置为为0 0,需需将将堆堆栈栈的的最低内存地址传递给任务创建函数。最低内存地址传递给任务创建函数。堆栈向上增长(堆栈向上增长(OS_STK_GROWTH=0OS_STK_GROWTH=0)OS_STKTaskStackTASK_STACK_S

18、IZE;OSTaskCreate(task,pdata,&TaskStack0,prio);楷楚打官沛戌磕穴忘湿兽寿听毒藩耘粪侣牲灭唾迄蓝鸡层蔚浙斟挛画迢可第2章uCOSII中的任务第2章uCOSII中的任务192 任务堆栈任务堆栈-增长方向增长方向当堆栈向下增长时,置当堆栈向下增长时,置OS_STK_GROWTHOS_STK_GROWTH为为1 1,需要将,需要将堆栈的最高内存地址传递给任务创建函数,堆栈的最高内存地址传递给任务创建函数,堆栈向下增长堆栈向下增长(OS_STK_GROWTH=1OS_STK_GROWTH=1)OS_STKTaskStackTASK_STACK_SIZE;OST

19、askCreate(task,pdata,&TaskStackTASK_STACK_SIZE-1,prio);腥其晕凌蔑晶冲吠霜合解镣玩园寺碉腑逮守抵箕同抉慑柬纶肾超知直乒抄第2章uCOSII中的任务第2章uCOSII中的任务20对两个方向增长的堆栈都提供支持的代码对两个方向增长的堆栈都提供支持的代码OS_STKTaskStackTASK_STACK_SIZE;#ifOS_STK_GROWTH=0OSTaskCreate(task,pdata,&TaskStack0,prio);#elseOSTaskCreate(task,pdata,&TaskStackTASK_STACK_SIZE-1,p

20、rio);#endif2 任务堆栈任务堆栈-增长方向增长方向搜饮炔楔轴噶挚呆幢因右芳炳霸牲阿再鲤总传琢墅绥遁拽才赖拱阶召逗慢第2章uCOSII中的任务第2章uCOSII中的任务212 任务堆栈任务堆栈-检验检验3)堆栈检验,)堆栈检验,OSTaskStkChk()有时候确定任务实际所需的堆栈空间大小是有时候确定任务实际所需的堆栈空间大小是很有必要的。因为这样用户就可以避免为任很有必要的。因为这样用户就可以避免为任务分配过多的堆栈空间,从而减少自己的应务分配过多的堆栈空间,从而减少自己的应用程序代码所需的用程序代码所需的RAM(RAM(内存内存) )数量。数量。C/OS-C/OS-提供的提供的O

21、STaskStkChk()OSTaskStkChk()函数可以为函数可以为用户提供这种有价值的信息。用户提供这种有价值的信息。 顺撩怨允茬乙叶羌涯圃在茹靖那脱斟赃恍茧湾钝睫姐华踪坞迢敞清稗拖逃第2章uCOSII中的任务第2章uCOSII中的任务22StackcheckingOSTaskStkChk()OSTaskStkChk()顺着堆顺着堆栈的栈底开始计算空闲的栈的栈底开始计算空闲的堆栈空间大小。任务所用堆栈空间大小。任务所用的堆栈的空间大小等于的堆栈的空间大小等于OSTaskCreateExtOSTaskCreateExt()()中定义的堆栈尺寸减去中定义的堆栈尺寸减去储存值为储存值为0 0

22、的连续堆栈入的连续堆栈入口数目。口数目。2 任务堆栈任务堆栈-检检验验挟却诈证深炕胡巨智廓萎啊浅肇烯纵造掖畅鄂输扼烹雄玖死弛限蹿社赌乖第2章uCOSII中的任务第2章uCOSII中的任务232 任务堆栈任务堆栈-检验检验l用用户户应应该该使使自自己己的的应应用用程程序序运运行行足足够够长长的的时时间间,并并且且经经历历最最坏坏的的堆堆栈栈使使用用情情况况,这这样样才才能能得得到到正正确确的的数数值值。一一旦旦OSTaskStkChk()OSTaskStkChk()提提供供给给用用户户最最坏坏情情况况下下堆堆栈栈的的需需求求,用用户户就就可可以以重重新新设设置置堆堆栈栈的的最最后后容容量量了了。

23、为为了了适适应应系系统统以以后后的的升升级级和和扩扩展展,用用户户应应该该多多分分配配1010100100的的堆堆栈栈空空间间。在在堆堆栈栈检检验验中中,用用户户所所得得到到的的只只是是一一个个大大致致的的堆堆栈栈使使用用情情况况,并并不不能能说说明明堆堆栈栈使使用用的的全部实际情况。全部实际情况。砚刻朝乞貉沥篆码拷顾枯羌背惩虑突泌憋懒诺晤舱锋庶碉抉峨冻川刘勃礼第2章uCOSII中的任务第2章uCOSII中的任务242 任务堆栈任务堆栈-初始化初始化4)任务堆栈的初始化)任务堆栈的初始化l当处理器启动一个任务时,处理器的各寄存器总是需当处理器启动一个任务时,处理器的各寄存器总是需要预置一些与待

24、运行任务相关的初始数据,如要预置一些与待运行任务相关的初始数据,如指向任指向任务代码的指针、指向任务堆栈的指针、程序状态字务代码的指针、指向任务堆栈的指针、程序状态字PSW等,这些初始数据从何而来等,这些初始数据从何而来?l系统在创建一个新任务时,应该把启动该任务所需的系统在创建一个新任务时,应该把启动该任务所需的初始数据(初始数据(指向任务代码的指针、指向任务堆栈的指指向任务代码的指针、指向任务堆栈的指针、程序状态字针、程序状态字PSW等等)事先存放到这个任务的堆栈)事先存放到这个任务的堆栈中。中。l任务堆栈初始化函数任务堆栈初始化函数OSTaskStkInit()完成上述工作完成上述工作(

25、其在(其在OSTaskCreate()创建任务时被调用)。创建任务时被调用)。席婆窜茎微苏皮椿奴价斌滇溜屠攒颠赖希坊倚戮钞促骚织钧想絮绑蘸预诞第2章uCOSII中的任务第2章uCOSII中的任务252 任务堆栈任务堆栈-初始化初始化 #if OS_VERSION = 251OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)#elsevoid *OSTaskStkInit (void (*task)(void *pd), void *pdata, void *ptos, INT

26、16U opt)#endif unsigned int *stk ; opt = opt; /* opt is not used, prevent warning */ stk = (unsigned int *)ptos; /* Load stack pointer */OSTaskStkInit ()尧德供锤鬼靛淆丘皋剧翰盂吏熬劫仁耳哗潞畜搏望扫搐哗哺逝余囱章畴攒第2章uCOSII中的任务第2章uCOSII中的任务262 任务堆栈任务堆栈-初始化初始化/* build a context for the new task */ *-stk = (unsigned int) task; /*

27、 pc */ *-stk = (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 */ 搞骑涛盔严水馒拙消案怕详操柱教瞎俯网暮柬坍腊隋覆炮乾限绸贞潍氖敲第2章uCOSII中的任务第2章uCOSII中的任务272 任务堆栈任务堆栈-初始化初始化 *-stk = 0; /* r5 */ *-stk = 0; /*

28、r4 */ *-stk = 0; /* r3 */ *-stk = 0; /* r2 */ *-stk = 0; /* r1 */ *-stk = (unsigned int) pdata; /* r0 */ *-stk = (SVC32MODE|0x0); /* cpsr IRQ, FIQ disable*/ *-stk = (SVC32MODE|0x0); /* spsr IRQ, FIQ disable */ return (void *)stk);躺彰伐行沙排折忱筷厘舆迷尊揍么脊扭凉橡拔惜米淬跃松湾彬忙制净博吧第2章uCOSII中的任务第2章uCOSII中的任务28第第2章章uC/OS

29、-II中的任务中的任务1 14 42 26 65 58 8任务的基本概念任务的基本概念任务调度任务调度 任务的创建任务的创建3 3任务就绪表任务就绪表7 79 9C/OS-C/OS-的初始化和任务的启动的初始化和任务的启动任务控制块任务控制块任务堆栈任务堆栈 任务的挂起和恢复任务的挂起和恢复其它任务管理函数其它任务管理函数枝酝治拼裤反忽司惠歇肥防朋汹恿硅波莹逆呈臭望咳推收媒拾幸诱炸戍讥第2章uCOSII中的任务第2章uCOSII中的任务293 任务控制块任务控制块1)任务控制块结构)任务控制块结构2)任务控制块链表)任务控制块链表3)任务控制块初始化)任务控制块初始化氯挡辟杏坡准痰肢等绽银初毫

30、根息委漆铭挥晶往渭堆堰蕊展褒酚椒蔗矿陀第2章uCOSII中的任务第2章uCOSII中的任务301) 任务控制块结构任务控制块结构l任任务务控控制制块块(Task Task Control Control Blocks, Blocks, OS_TCBsOS_TCBs)是是C/OS-C/OS-用用来来存存储储任任务务堆堆栈栈指指针针、当当前前状状态态、优优先先级级及及任任务务链链表表指指针针等等一一些些与与任任务务管管理理有有关关的的属属性性的的结构类型数据。结构类型数据。l任任务务控控制制块块是是任任务务的的身身份份证证,每每个个任任务务都都有有一一个个属属于于自自已已的的任任务务控控制制块块,

31、当当任任务务的的CPUCPU使使用用权权被被剥剥夺夺时时,任任务务的的属属性性/ /环环境境被被保保存存在在任任务务控控制制块块中中,而而当当任任务务重重新新得得到到CPUCPU使使用用权权时时,任任务务控控制制块块能能确确保保任任务务从从当当时被中断的那一点丝毫不差地继续执行。时被中断的那一点丝毫不差地继续执行。lOS_TCBsOS_TCBs全部驻留在全部驻留在RAMRAM中。中。lOS_TCBs OS_TCBs 在任务建立的时候被初始化在任务建立的时候被初始化. .废艘哆隅傣聘铲汇祈卫撬柏蛋蕉钾鸦烈添桅愈启仟窿漱哩傀类芥锚傀睫裂第2章uCOSII中的任务第2章uCOSII中的任务31任务控

32、制块结构任务控制块结构typedefstructos_tcbOS_STK*OSTCBStkPtr;#ifOS_TASK_CREATE_EXT_EN0void*OSTCBExtPtr;OS_STK*OSTCBStkBottom;INT32UOSTCBStkSize;INT16UOSTCBOpt;INT16UOSTCBId;#endifstructos_tcb*OSTCBNext;structos_tcb*OSTCBPrev;#if(OS_Q_EN&(OS_MAX_QS=2)|OS_MBOX_EN|OS_SEM_ENOS_EVENT*OSTCBEventPtr;#endif埠杏雇障疹吴姻动睦隙格诣

33、伏竭唆洒搂悲番嘻吊藏暂抑斩谩业嫉捆焦祷啸第2章uCOSII中的任务第2章uCOSII中的任务32#if(OS_Q_EN&(OS_MAX_QS=2)|OS_MBOX_ENvoid*OSTCBMsg;#endifINT16UOSTCBDly;INT8UOSTCBStat;INT8UOSTCBPrio;INT8UOSTCBX;INT8UOSTCBY;INT8UOSTCBBitX;INT8UOSTCBBitY;#ifOS_TASK_DEL_ENBOOLEANOSTCBDelReq;#endifOS_TCB;葛闺印峙骑尘谢言磋趟磊卜雾维舷疡楚晶卡锁邯粒逮垃鸽赌坡哨稀抱厚颧第2章uCOSII中的任务第2章

34、uCOSII中的任务33任务控制块结构成员任务控制块结构成员OSTCBStkPtrOSTCBStkPtr:指向当前任务堆栈栈顶的指针指向当前任务堆栈栈顶的指针。OSTCBExtPtrOSTCBExtPtr:指向用户定义的任务控制块扩展的指向用户定义的任务控制块扩展的指针指针。用户可以扩展任务控制块而不必修改。用户可以扩展任务控制块而不必修改C/OS-C/OS-的源代码的源代码, ,只在函数只在函数OstaskCreateExt()OstaskCreateExt()中使用中使用, ,使用时将使用时将OS_TASK_CREAT_ENOS_TASK_CREAT_EN设为设为1.1.OSTCBStkB

35、ottomOSTCBStkBottom:指向任务堆栈栈底的指针指向任务堆栈栈底的指针。递减。递减栈指针指向任务使用的栈空间的最低地址;递增型栈指针指向任务使用的栈空间的最低地址;递增型栈则指向栈空间的最高地址。栈则指向栈空间的最高地址。OSTaskStkChk()OSTaskStkChk()可用可用其检验栈空间的使用情况以确定任务实际需要的栈其检验栈空间的使用情况以确定任务实际需要的栈空间。在空间。在OSTaskCreateExt()OSTaskCreateExt()函数中使用,即需将函数中使用,即需将OS_TASK_CREATE_EXT_ENOS_TASK_CREATE_EXT_EN设为设为

36、1 1。岸轨蚤盯搽肪筏撮寇札剿煎捐慌槽是寐濒乌甘僧艰独羚庸售舟驮招廉瞄炙第2章uCOSII中的任务第2章uCOSII中的任务34任务控制块结构成员任务控制块结构成员OSTCBStkSizeOSTCBStkSize:堆栈尺寸。堆栈尺寸。 栈中可容纳的栈中可容纳的指针元数目指针元数目/ /入口地址,不是用字节表示的入口地址,不是用字节表示的栈容量总数。例栈容量总数。例 设栈中可以保存设栈中可以保存1,0001,000个入个入口地址,则:口地址,则:若每个地址宽度为若每个地址宽度为3232位,实际栈容量是位,实际栈容量是4,0004,000字节。字节。若每个地址宽度为若每个地址宽度为1616位,总栈

37、容量是位,总栈容量是2,0002,000字节。字节。在在OSStakChk()OSStakChk()中调用,须将中调用,须将OS_TASK_CREAT_EXT_ENOS_TASK_CREAT_EXT_EN设为设为1 1。搓蓄暗祖捞匠翟脾揭秒榨埋韧趾锭镇恶膳内袜呼赶挥琅丈悬槐抹见芬哄攘第2章uCOSII中的任务第2章uCOSII中的任务35任务控制块结构成员任务控制块结构成员OSTCBOpt OSTCBOpt :OSTaskCreateExt()OSTaskCreateExt()中的选项,中的选项,C/OS-C/OS-目前只支持目前只支持3 3个选择项个选择项:OS_TASK_OTP_STK_C

38、HK- OS_TASK_OTP_STK_CHK- STKSTK检查检查OS_TASK_OPT_STK_CLR-OS_TASK_OPT_STK_CLR-清零清零OS_TASK_OPT_SAVE_FP-OS_TASK_OPT_SAVE_FP-浮点运算浮点运算奈被园腻项纽邀签沧兼狐渠菊苍赖烙吼诅默藐渊匪墒姑揩箩荔秤樱粤雏颊第2章uCOSII中的任务第2章uCOSII中的任务36任务控制块结构成员任务控制块结构成员OSTCBId:存储任务的识别码。存储任务的识别码。OSTCBNextOSTCBNext和和 OSTCBPrevOSTCBPrev: 任任 务务 控控 制制 块块OS_TCBsOS_TCBs

39、双双向向链链接接,将将任任务务控控制制块块链链接接起起来来。该该链链表表在在时时钟钟节节拍拍函函数数OSTimeTick()OSTimeTick()中中使使用用,用用于于刷刷新新各各个个任任务务的的任任务务延延迟迟变变量量OSTCBDlyOSTCBDly,每每个个任任务务的的任任务务控控制制块块OS_TCBOS_TCB在在任任务务建建立立的的时时候候被被链链接接到到链链表表中中,在在任任务务删删除除的的时时候候从从链链表表中中被被删删除除。双双向向连连接接的的链链表表使使得得任任一一成员都能被快速插入或删除成员都能被快速插入或删除例晓诅蛆秤斜檄谨姐督五灯问游腑塌诬策识抠叛求馋伍塔芭孝朽遗褂营忘

40、第2章uCOSII中的任务第2章uCOSII中的任务37任务控制块结构成员任务控制块结构成员OSTCBEventPtr :指向事件控制块的指针。指向事件控制块的指针。OSTCBMsg:指向传给任务的消息的指针。指向传给任务的消息的指针。OSTCBDly:任务延时的时钟节拍数。任务延时的时钟节拍数。当需当需要把任务延时若干时钟节拍时,或者需要把要把任务延时若干时钟节拍时,或者需要把任务挂起一段时间以等待某事件的发生时需任务挂起一段时间以等待某事件的发生时需要用到这个变量。如果这个变量为要用到这个变量。如果这个变量为0,表示,表示任务不延时,或者表示等待事件发生的时间任务不延时,或者表示等待事件发

41、生的时间没有限制没有限制 .羊蜡翅邯颊畏陡今爽洗唇电涯瞎嘴躺馅背觅塔亡卜拐内材谚家矣剔笺誉次第2章uCOSII中的任务第2章uCOSII中的任务38任务控制块结构成员任务控制块结构成员OSTCBStat:任务状态字任务状态字, ,可取下列值:可取下列值:OS_STAT_RDY: 处于就绪状态处于就绪状态OS_STAT_SEM: 处于等待信号量状态处于等待信号量状态OS_STAT_MBOX:处于等待邮箱状态:处于等待邮箱状态OS_STAT_Q: 处于等待消息队列状态处于等待消息队列状态OS_STAT_SUSPEND:处于被挂起状态:处于被挂起状态OS_STAT_MUTEX:处于等待互斥信号:处于

42、等待互斥信号量状态量状态依掠府京领鲁辊暮也岗佐蹈涡吗积存凶亏除厉辫较厕豁顶砚舷明傅香恃兴第2章uCOSII中的任务第2章uCOSII中的任务39任务控制块结构成员任务控制块结构成员OSTCBPrioOSTCBPrio:任任务务优优先先级级。高高优优先先级级任任务务的的OSTCBPrioOSTCBPrio值值小小,低低优优先先级级任任务务的的 OSTCBPrioOSTCBPrio值大值大OSTCBXOSTCBX、OSTCBYOSTCBY、OSTCBBitXOSTCBBitX与与OSTCBBitYOSTCBBitY: 与优先级有关的量,用于加速任务进入就绪与优先级有关的量,用于加速任务进入就绪态的

43、过程或进入等待事件发生状态的过程态的过程或进入等待事件发生状态的过程。这些值是在任务建立时算好的,或者是在改这些值是在任务建立时算好的,或者是在改变任务优先级时算出的变任务优先级时算出的 。体哭呢敷霞欠溶藩皋硕灯志程腆羔寡烛侠狠徽尹韵愿贾编蘑凶冀惟痞咏施第2章uCOSII中的任务第2章uCOSII中的任务40OSTCBXOSTCBX、OSTCBYOSTCBY、OSTCBBitXOSTCBBitX与与OSTCBBitY OSTCBBitY 的计算的计算OSTCBY=priority3;OSTCBBitY=OSMapTblpriority3;OSTCBX=priority&0x07;OSTCBBi

44、tX=OSMapTblpriority&0x07;任务控制块结构成员任务控制块结构成员报绘疡颜粳景锰鲤懂延范嗣葡票撤酥碱嘛种桶样殊府芯算渔颅皂况仿秽毛第2章uCOSII中的任务第2章uCOSII中的任务41任务控制块结构成员任务控制块结构成员OSTCBDelReqOSTCBDelReq:一一个个布布尔尔量量,用用于于表表示示该该任任务是否需要删除。务是否需要删除。岭疫爸迂类谈渠肚朔媚靳窗暂隶磕爷略喝化极芯疥吝古侮甩珐蜗蒜蚊达袱第2章uCOSII中的任务第2章uCOSII中的任务42 2) 2)任务控制块链表任务控制块链表l任任务务控控制制块块空空闲闲链链表表:用用于于管管理理空空闲闲任任务务的

45、的控控制块的链表。制块的链表。l系系统统初初始始化化时时,初初始始化化函函数数OSInit()将将创创建建一一个个任任务务控控制制块块空空闲闲缓缓冲冲池池,其其中中有有一一定定数数量量的的空空任任务务控控制制块块,并并将将其其链链接接成成一一个个单单向向链链表表,即空闲链表,并用即空闲链表,并用OSTCBFreeList指向表头。指向表头。l当当建建立立一一个个任任务务时时,即即将将空空闲闲链链表表表表头头指指针针OSTCBFreeList指指向向的的空空任任务务控控制制块块赋赋给给该该任任务务,然然后后将将OSTCBFreeList指指向向链链表表中中的的下下一一个空任务控制块个空任务控制块

46、性希湾匆漳皮壤透捆回添茁翔拓岿坐臣煮哟桑石挫佩勇中枝袍浸魄过仔叠第2章uCOSII中的任务第2章uCOSII中的任务432)2)任务控制块链表任务控制块链表任务控制块空闲链表任务控制块空闲链表(ListoffreeOS_TCBs)孔湛抉境拦赵吮靴幽婶佐镣铸纪诌爆艾历显砖佃苫岁黄瞥篡苑笆堤灸鹏圭第2章uCOSII中的任务第2章uCOSII中的任务442)2)任务控制块链表任务控制块链表l任务控制块使用链表任务控制块使用链表(双向双向)使用链表用于管理已建立任务的控制块鬼抛王豪坑蔚化媳琐澡魄龟待锌粉鸥孽搀逛蔬臻姑渺洱瞬溯姿讽晴妈厨佃第2章uCOSII中的任务第2章uCOSII中的任务453)任务控

47、制块初始化任务控制块初始化l任务控制块初始化函数任务控制块初始化函数OSTCBInit()做三件事:做三件事:1、从空任务控制块链表中获取一个任务控、从空任务控制块链表中获取一个任务控制块;制块;2、用任务的属性值对任务控制块各个成员、用任务的属性值对任务控制块各个成员进行赋值;进行赋值;3、把这个任务控制块链入到任务控制块使、把这个任务控制块链入到任务控制块使用链表的头部。用链表的头部。漓劲傣烦单种凌顷宙燃墅枯靶维茶角箩迈昨饰践疽票蛇垒泥敲彼冷摆胆得第2章uCOSII中的任务第2章uCOSII中的任务463)任务控制块初始化任务控制块初始化-OSTCBInit()INT8UOSTCBInit

48、(INT8Uprio,OS_STK*ptos,OS_STK*pbos,INT16Uid,INT16Ustk_size,void*pext,INT16Uopt)OS_TCB*ptcb;OS_ENTER_CRITICAL();ptcb=OSTCBFreeList;(1)/从空闲的OS_TCB缓冲池中获得一个OS_TCB嗽存尖肖铂揍球筹药躺亨些省霉驭椒小选蝉句淹俏拷矣砂庭锯储停尘吩储第2章uCOSII中的任务第2章uCOSII中的任务47if(ptcb!=(OS_TCB*)0)(2)OSTCBFreeList=ptcb-OSTCBNext;OS_EXIT_CRITICAL();ptcb-OSTCBS

49、tkPtr=ptos;(3)ptcb-OSTCBPrio=(INT8U)prio;ptcb-OSTCBStat=OS_STAT_RDY;ptcb-OSTCBDly=0;/如果OS_TCB池中有空闲的OS_TCB,它就被初始化了 /一旦OS_TCB被分配,该任务的创建者就已经完全拥有它了,不担心被同时建立的另一个任务夺取,故可以重新开中断,并继续初始化OS_TCB的数据单元。3)任务控制块初始化任务控制块初始化-OSTCBInit()湘宰报消妄请忱堂蝶社技椰禹氦靴偶阶梯炕谜侩寄晨掌笺范悦涛与硕墟碘第2章uCOSII中的任务第2章uCOSII中的任务48#ifOS_TASK_CREATE_EXT_

50、ENptcb-OSTCBExtPtr=pext;ptcb-OSTCBStkSize=stk_size;ptcb-OSTCBStkBottom=pbos;ptcb-OSTCBOpt=opt;ptcb-OSTCBId=id;3)任务控制块初始化任务控制块初始化-OSTCBInit()戮料搔醉篓狙滋爸因太壹魁业呜呛洼售噪铀喂涂物俺呐维绝雹寻仗汕荒撼第2章uCOSII中的任务第2章uCOSII中的任务49#elsepext=pext;stk_size=stk_size;pbos=pbos;opt=opt;id=id;#endif#ifOS_TASK_DEL_ENptcb-OSTCBDelReq=OS_

51、NO_ERR;#endif3)任务控制块初始化任务控制块初始化-OSTCBInit()戒衣贫巳乘吭旁纵棠烟皂容乡胰新致仓募蒋延六炎苫膳铭眺旗谎车旗竞擎第2章uCOSII中的任务第2章uCOSII中的任务50ptcb-OSTCBY=prio3;ptcb-OSTCBBitY=OSMapTblptcb-OSTCBY;ptcb-OSTCBX=prio&0x07;ptcb-OSTCBBitX=OSMapTblptcb-OSTCBX;#ifOS_MBOX_EN|(OS_Q_EN&(OS_MAX_QS=2)|OS_SEM_ENptcb-OSTCBEventPtr=(OS_EVENT*)0;#endif3)任

52、务控制块初始化任务控制块初始化-OSTCBInit()茫铭贬皆呕丙证把赐阵圣细积帆牵栋姜促厢届券竞暇纽弗缩戒成狗师枚忠第2章uCOSII中的任务第2章uCOSII中的任务51#ifOS_MBOX_EN|(OS_Q_EN&(OS_MAX_QS=2)ptcb-OSTCBMsg=(void*)0;#endifOS_ENTER_CRITICAL();(4)OSTCBPrioTblprio=ptcb;(5)ptcb-OSTCBNext=OSTCBList;ptcb-OSTCBPrev=(OS_TCB*)0;if(OSTCBList!=(OS_TCB*)0)OSTCBList-OSTCBPrev=ptcb

53、;/将OS_TCB插入到已建立任务的OS_TCB的双向链表中,该双向链表开始于OSTCBList,而一个新任务的OS_TCB常常被插入到链表的表头3)任务控制块初始化任务控制块初始化-OSTCBInit()OSTCBList=ptcb瘩润涨倘淡盒艘曼廉栽胶眼班驹被济佛恩诉挫胶纬林弯吴闪角佛剥夜北狂第2章uCOSII中的任务第2章uCOSII中的任务52OSRdyGrp|=ptcb-OSTCBBitY;(6)OSRdyTblptcb-OSTCBY|=ptcb-OSTCBBitX;OS_EXIT_CRITICAL();return(OS_NO_ERR);elseOS_EXIT_CRITICAL()

54、;return(OS_NO_MORE_TCB);/使任务进入就绪态/返回一个代码表明OS_TCB已经被分配和初始化了 3)任务控制块初始化任务控制块初始化-OSTCBInit()氧碱驹洪蔼甫妮匪辙卫墅标示鱼旭委喻驹瑚蕉礼嫉樊脚星狡喀夫乙鼎芍职第2章uCOSII中的任务第2章uCOSII中的任务53第第2章章uC/OS-II中的任务中的任务1 14 42 26 65 58 8任务的基本概念任务的基本概念任务调度任务调度 任务的创建任务的创建3 3任务就绪表任务就绪表7 79 9C/OS-C/OS-的初始化和任务的启动的初始化和任务的启动任务控制块任务控制块任务堆栈任务堆栈 任务的挂起和恢复任务的

55、挂起和恢复其它任务管理函数其它任务管理函数丘汀挞奄豺区缝玩脑禁逞底柠嗓揉蓑反叹项肇拙府栏疽某娥砰篓摊描快茁第2章uCOSII中的任务第2章uCOSII中的任务54 4 任务就绪表任务就绪表1)任务就绪表结构)任务就绪表结构2)任务就绪表操作)任务就绪表操作使任务进入就绪态使任务进入就绪态使任务脱离就绪态使任务脱离就绪态找出进入就绪态的优先级最高的任务找出进入就绪态的优先级最高的任务淄似傣拯悍须恶痪杨绳睁亥谭幌刽恰任奎寸予轰垮势叔炉蘸化穴馆蓑壬吐第2章uCOSII中的任务第2章uCOSII中的任务551)任务就绪表结构就绪表是保存任务就绪标志的表就绪表是保存任务就绪标志的表, ,表中的每一位对应

56、一个任表中的每一位对应一个任务务, ,某任务处于就绪态时某任务处于就绪态时, ,表中相应位置表中相应位置1.1.就绪表有两个变就绪表有两个变量:量:OSRdyGrpOSRdyGrp和和OSRdyTblOSRdyTblOSRdyGrp1207654300XXXYYY任务优先级20176543108915 1413 1212 1118161723 222121 20 1926242531 3029 28 2734323339 3837 36 3542404147 4645 44 4350484955 5453 52 5158565763 6261 60 5901234567OSRdyTbl7XY优

57、先级最低任务(空闲任务)优先级最高任务任务优先级号暑夺镁抚阵偷挠拷侵暴志掏式吞并殿祝诧裹巩竹角磊漆蛊互枯懒粹氨奇镑第2章uCOSII中的任务第2章uCOSII中的任务562)任务就绪态表操作任务就绪态表操作 OSMapTbl的值的值000000001100000010200000100300001000400010000500100000601000000IndexBit Mask (Binary)710000000OSRdyGrp|=OSMapTblprio3;OSRdyTblprio3|=OSMapTblprio&0x07;使使任务进入就绪态任务进入就绪态亡刮轮糙减旦准播挺高桐亮射陀乍频亚

58、市卡膏竭托慕倦升裂牧份敏宴岩矢第2章uCOSII中的任务第2章uCOSII中的任务572)任务就绪态表操作任务就绪态表操作l例例 1 使优先级为使优先级为12的任务进入就绪状态,的任务进入就绪状态,12=1100b, OSRdyGrp|= OSMapTblprio 3 |= OSMapTbl1b |= 00000010OSRdyTblprio 3|= OSMapTblprio & 0x07 |= OSMapTbl100b |= OSMapTbl4 |= 00010000即即OSRdyGrp的第的第1位置位置1,OSRdyTbl1的第的第4位置位置1谨棺稍兽延溅绝芽绝欲搔讼福蔽固秧姿顿碴丢茧数碍

59、徽惨况摄珊哥沮谋滥第2章uCOSII中的任务第2章uCOSII中的任务582)任务就绪态表操作任务就绪态表操作l例例2 使优先级为使优先级为21的任务进入就绪态的任务进入就绪态,21=10 101b,OSRdyGrp|= OSMapTblprio 3 |= OSMapTbl10b= OSMapTbl2 |= 00000100OSRdyTblprio 3|= OSMapTblprio & 0x07 |= OSMapTbl101b |= OSMapTbl5 |= 00100000即即OSRdyGrp的第的第2位置位置1,OSRdyTbl2的第的第5位置位置1萄掺味鹤想娠裤猫屯零缠芳仰窘涝黔炯幌才蓄

60、喉达搽有杭谣毋奸介别饮斗第2章uCOSII中的任务第2章uCOSII中的任务592)任务就绪态表操作任务就绪态表操作使任务脱离就绪态使任务脱离就绪态将就绪任务表数组将就绪任务表数组OSRdyTblprio3中相应元中相应元素的相应位清零,且当素的相应位清零,且当OSRdyTblprio3中的中的所有位都为零时,即全组任务中没有一个进入就所有位都为零时,即全组任务中没有一个进入就绪态时,绪态时,OSRdyGrp的相应位才为零。的相应位才为零。例例 使优先级为使优先级为12的任务脱离就绪表的任务脱离就绪表 If(OSRdyTbl1&= 0x10=0) OSRdyGrp&= 0x02;If(OSRd

61、yTblprio3&= OSMapTblprio&0x07)=0)OSRdyGrp&= OSMapTblprio3;OSRdyTblprio3|=OSMapTblprio&0x07OSRdyGrp|= OSMapTblprio 3秆漏笼奥寿粮新功膀爆擞窟孜督菌纸属稍诫臣恍刊亥铸琵瑶预凄挫橱锈颁第2章uCOSII中的任务第2章uCOSII中的任务60找出进入就绪态的优先级最高的任务找出进入就绪态的优先级最高的任务y=OSUnMapTblOSRdyGrp;x=OSUnMapTblOSRdyTbly;prio=(y3)+x;2) 任务就绪态表操作任务就绪态表操作20176543108915 1413

62、 12 1118161723 2221 20 1926242531 3029 28 2734323339 3837 36 3542404147 4645 44 4350484955 5453 52 5158565763 6261 60 5901234567XYy=1,x=4,prio=12y=2,x=4,prio=20例莎趋歪投乡驯抖砾疟蚊袋扣晋酪睡仑霓奴陇吼嘿副概聂腊枯蛰寝吸情捍跑第2章uCOSII中的任务第2章uCOSII中的任务61INT8U const OSUnMapTbl = 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x00

63、to 0x0F 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x10 to 0x1F 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x20 to 0x2F 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x30 to 0x3F 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x40 to 0x4F 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1,

64、 0, /0x50 to 0x5F 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x60 to 0x6F 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x70 to 0x7F 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x80 to 0x8F 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x90 to 0x9F 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0

65、, 2, 0, 1, 0, /0xA0 to 0xAF 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0xB0 to 0xBF 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0xC0 to 0xCF 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0xD0 to 0xDF 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0xE0 to 0xEF 4, 0, 1, 0, 2, 0, 1, 0,

66、3, 0, 1, 0, 2, 0, 1, 0 /0xF0 to 0xFF;优先级判定表环市碳眯憎匆纬砾烈从晤黍搀轿廖铅仓渣獭帆蓑獭脓幼妻芥楚宜旗令筑彩第2章uCOSII中的任务第2章uCOSII中的任务622)任务就绪态表操作任务就绪态表操作l例例1 1 已知已知OSRdyGrp=01101000b, OSRdyGrp=01101000b, OSRdyTbl3=11100100b,OSRdyTbl3=11100100b,找出进入就绪态找出进入就绪态的优先级最高的任务的优先级最高的任务OSRdyGrp=01101000b=0x68,OSRdyGrp=01101000b=0x68,查查OSUnMa

67、pTbl0x68OSUnMapTbl0x68得到的值是得到的值是3 3,y=3y=3。OSRdyTbl3=11100100b=0xE4OSRdyTbl3=11100100b=0xE4,则,则OSUnMapTbl0xE4OSUnMapTbl0xE4的值是的值是2 2,x=2x=2。Prio=Prio= (y 3) + x=3*8+2=3*8+2=2626。查任务控制块优先级表数组查任务控制块优先级表数组OSTCBPrioTbl26OSTCBPrioTbl26,即可得到指向该,即可得到指向该任务的任务控制块任务的任务控制块OS_TCBOS_TCB的指针的指针. .渐鲁皇股舰姻催浸卒噪娥支趟丽坡夺匣

68、饰揉滑栗咖碟仅盟殉不幌撑灭笨引第2章uCOSII中的任务第2章uCOSII中的任务632)任务就绪态表操作任务就绪态表操作l例例2 2 已知已知OSRdyGrp=00100100b, OSRdyTbl2=00010010b,OSRdyGrp=00100100b, OSRdyTbl2=00010010b,找找出进入就绪态的优先级最高的任务出进入就绪态的优先级最高的任务y=OSUnMapTblOSRdyGrp=OSUnMapTbl100100b=OSUnMapTbl0x24=2x=OSUnMapTblOSRdyTbly=OSUnMapTblOSRdyTbl2=OSUnMapTbl00010010b

69、=OSUnMapTbl0x12=1prio=(y3)+x=(23)+1=17野搭嘴揪渺靖迈早聪莲批妊庄蓝飞唱鼻庚研攒逞毯裕北骆驮隅脉咆扬廉郸第2章uCOSII中的任务第2章uCOSII中的任务64第第2章章uC/OS-II中的任务中的任务1 14 42 26 65 58 8任务的基本概念任务的基本概念任务调度任务调度 任务的创建任务的创建3 3任务就绪表任务就绪表7 79 9C/OS-C/OS-的初始化和任务的启动的初始化和任务的启动任务控制块任务控制块任务堆栈任务堆栈 任务的挂起和恢复任务的挂起和恢复其它任务管理函数其它任务管理函数蜂忘橙肘如昼肌饭泉徘娘饺污熔疾赋斤轴哪哩雇闺秀毋址痘贺衣烤竿

70、辛救第2章uCOSII中的任务第2章uCOSII中的任务655 任务调度任务调度1)任务调度器任务调度器2)任务切换任务切换3)给调度器上锁和开锁给调度器上锁和开锁凸袱所再请雹沽躯炊嗡艘富纸粮栓幅哭呸小靡循肢淌食最檀距敬缠撑倪招第2章uCOSII中的任务第2章uCOSII中的任务661)任务调度器任务调度器l任务调度(任务调度(Task SchedulingTask Scheduling)C/OS-C/OS-总是运行进入就绪态任务中优先总是运行进入就绪态任务中优先级最高的任务级最高的任务; ;调度器的工作是确定哪个任务优先级最高以调度器的工作是确定哪个任务优先级最高以及下面该哪个任务运行了及下

71、面该哪个任务运行了; ;任务级的调度由函数任务级的调度由函数OSSched()OSSched()完成完成, ,中断级中断级的调度由另一个函数的调度由另一个函数OSIntExt()OSIntExt()完成的。完成的。 仟韶轩东头戎譬茄煞红峻沏焕求冤鞍竿内效骏藤卢搽墅局喂垃蒂砒嘉竞忿第2章uCOSII中的任务第2章uCOSII中的任务67voidOSSched(void)INT8Uy;OS_ENTER_CRITICAL();if(OSLockNesting|OSIntNesting)=0)(1)y=OSUnMapTblOSRdyGrp;(2)OSPrioHighRdy=(INT8U)(yOSTCB

72、StkPtr = SP;/SP-OSTCBStkPtr = SP;/SP入控制块入控制块 OSTCBCur = OSTCBHighRdy; OSTCBCur = OSTCBHighRdy; SP = OSTCBHighRdy -OSTCBSTKPtr; SP = OSTCBHighRdy -OSTCBSTKPtr; 将将R4,R3,R2R4,R3,R2及及R1R1从新堆栈中弹出;从新堆栈中弹出; 保保存存当当前前恢恢复复即即将将注:设处理器只有4个寄存器商象堰招晾盖忙咐缄裕载涎缺婪刺淀例尊靖蛔医闽缮宾囚卫肮钎嘶亨贯葵第2章uCOSII中的任务第2章uCOSII中的任务70调用OS_TASK_S

73、W()前的数据结构低优先级任务OS_TCBOSTCBCur存贮器低地址OSTCBHighRdy存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSWCPU存贮器低地址存贮器高地址高优先级任务OS_TCBPSWPCR1R2R3R4菲靶簿拽每钝打也敌识遂席窥阀鬃讲匝谭劣夜遭雁雏枕捆佩隘慌瑞椽傣丑第2章uCOSII中的任务第2章uCOSII中的任务71保存当前CPU寄存器的值PSWPCR1R2R3R4存贮器低地址存贮器高地址高优先级任务OS_TCBOSTCBHighRdy低优先级任务OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向(2)CPU(1)S

74、PR1R2R3R4PCPSW(3)作素盾呜势件蜘彩澳束操惰咕韶羚叠塞太郝赎贱弛鸦列线虫函心续金庄鄂第2章uCOSII中的任务第2章uCOSII中的任务72重新装入要运行的任务低优先级任务OS_TCBPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存贮器低地址存贮器高地址高优先级任务OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(3)(4)嚎俊均哆腕全脑扎蝇祥势吞读伎办袭胁疽匀叼萌芭裴夜芭烛九格泅眩绅束第2章uCOSII中的任务第2章uCOSII中的任务73重新装入要运行的任务低优先级任

75、务OS_TCBPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSW存贮器低地址存贮器高地址高优先级任务OS_TCBOSTCBCur(1)(2)CPU(4)OSTCBHighRdy惩剂菲碧柞汗苛胀氓价仰锨中铡谦皋唯互拘槽较尤袋路帜咆牛巢条酷楼芋第2章uCOSII中的任务第2章uCOSII中的任务74OSCtxSw;SAVECURRENTTASKSCONTEXTSTMFDSP!,LR;PushreturnaddressSTMFDSP!,LRSTMFDSP!,R0-R12;PushregistersMRSR4,CPSR;PushcurrentCPSRTST

76、LR,#1;SeeifcalledfromThumbmodeORRNER4,R4,#0x20;Ifyes,SettheT-bitSTMFDSP!,R4;OSTCBCur-OSTCBStkPtr=SP;LDRR4,addr_OS_TCBCur;R4addr_OS_TCBCurLDRR5,R4;R5OSTCBCurSTRSP,R5;OSTCBCur-OSTCBStkPtr=SPOSCtxSw挖镁掺除肘涣甭积扁背勤垫转咎茨都取诵茂法辉蕊玩读绕书搬滑描践跑屹第2章uCOSII中的任务第2章uCOSII中的任务75LDRR0,addr_OS_TaskSwHook;OSTaskSwHook();MOVLR

77、,PCBXR0LDRR4,addr_OS_PrioCur;OSPrioCur=OSPrioHighRdyLDRR5,addr_OS_PrioHighRdyLDRBR6,R5STRBR6,R4LDRR4,addr_OS_TCBCur;OSTCBCur=OSTCBHighRdy;LDRR6,addr_OS_TCBHighRdyLDRR6,R6STRR6,R4OSCtxSw高优先级任务OS_TCBOSTCBCurOSTCBHighRdy毗廷穗聂涅预谆赘帧忆团忽淘颁逊泡耍荤赚薯予骇喂党违紫萎爷填辑想焙第2章uCOSII中的任务第2章uCOSII中的任务76LDRSP,R6;SP=OSTCBHighRd

78、y-OSTCBStkPtr;RESTORENEWTASKSCONTEXTLDMFDSP!,R4;PopnewtasksCPSRMSRSPSR_cxsf,R4LDMFDSP!,R0-R12,LR,PC;PopnewtaskscontextOSCtxSw亢军案侯渐邀荡堤理蛛孩佑董卑延豹听氏辕费习蜂减把损帖迅澳宽序釜组第2章uCOSII中的任务第2章uCOSII中的任务773)给调度器上锁与开锁给调度器上锁与开锁上上锁锁OSSchedlock()OSSchedlock()与与开开锁锁OSSchedUnlock()OSSchedUnlock()函函数数用用于于禁禁止止与与允允许许任任务务调调度度。调调

79、用用上上锁锁函函数数的的任任务务可可一一直直保保持持对对CPUCPU的的控控制制权权(无无论论是是否否有有优优先先级级更更高高的的任任务务进进入入了了就就绪绪态态),直直到到调调用用开开锁锁函函数数后后,任任务务调度才得到允许。上锁和开锁函数必须成对使用调度才得到允许。上锁和开锁函数必须成对使用上锁函数不影响中断响应。上锁函数不影响中断响应。OSLockNestingOSLockNesting跟跟踪踪OSSchedLock()OSSchedLock()函函数数被被调调用用的的次次数数 , C/OS-C/OS-允允 许许 嵌嵌 套套 深深 度度 达达 255255层层 。 当当OSLockNes

80、tingOSLockNesting等等 于于 零零 时时 , 调调 度度 重重 新新 得得 到到 允允 许许 , OSSchedUnlockOSSchedUnlock()()调用调用OSSchedOSSched。版汞呸乒墒癌询垢葱谬笑和纸畅娇会睹讨黍祝凰狡郭欧钦弯取做麻范铺越第2章uCOSII中的任务第2章uCOSII中的任务783)给调度器上锁与开锁给调度器上锁与开锁l调用调用OSSchedLock()OSSchedLock()以后,用户的应用程序不以后,用户的应用程序不得使用任何能将现行任务挂起的系统调用。即得使用任何能将现行任务挂起的系统调用。即用户程序不得调用用户程序不得调用OSMbo

81、xPend()OSMboxPend()、OSQPend()OSQPend()、OSSemPend()OSSemPend()、OSTaskSuspend(OS_PR1O_SELF)OSTaskSuspend(OS_PR1O_SELF)、OSTimeDly()OSTimeDly()或或OSTimeDlyHMSM(),OSTimeDlyHMSM(),直到直到OSLockNestingOSLockNesting回零回零为止。因为调度器上了锁,用户就锁住了系统,为止。因为调度器上了锁,用户就锁住了系统,任何其它任务都不能运任何其它任务都不能运 。道酝逻歉乃嗣舔耿务年亲舶挎臭疏骂扭辊哀削窒钒价官挪裸窄驼虹

82、充其晴第2章uCOSII中的任务第2章uCOSII中的任务79voidOSSchedLock(void)if(OSRunning=TRUE)OS_ENTER_CRITICAL();if(OSLockNesting0)OSLockNesting-;if(OSLockNesting=0)&(OSIntNesting=0)OS_EXIT_CRITICAL();OSSched();elseOS_EXIT_CRITICAL();elseOS_EXIT_CRITICAL();拐儿腿助漠灰涤策幕扣一禹柞晾乏耐避宠枚赏竟频绪乘俱廊姜蝶事株周嗡第2章uCOSII中的任务第2章uCOSII中的任务81第第2章章u

83、C/OS-II中的任务中的任务1 14 42 26 65 58 8任务的基本概念任务的基本概念任务调度任务调度 任务的创建任务的创建3 3任务就绪表任务就绪表7 79 9C/OS-C/OS-的初始化和任务的启动的初始化和任务的启动任务控制块任务控制块任务堆栈任务堆栈 任务的挂起和恢复任务的挂起和恢复其它任务管理函数其它任务管理函数抨劳毙蔚仕筏怯去姻施摈早仲怀尔呼愁海患释螟阮李务吮弱嘶扣亦氖刚蹭第2章uCOSII中的任务第2章uCOSII中的任务826 任务的创建任务的创建1)OSTaskCreate()-建立任务函数建立任务函数(调用调用OSTaskStkInit ()与与 OSTCBInit

84、()2)OSTaskCreateExt()-建立任务扩展函数建立任务扩展函数3)创建任务的一般方法创建任务的一般方法深眯两坊肾嘿锑哀摇滞扫跌矛超火逆锚讫临爪沫紊以哈紧拯式姓苏翱甫办第2章uCOSII中的任务第2章uCOSII中的任务83 1)OSTaskCreate()INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio)void*psp;INT8Uerr;if(prioOS_LOWEST_PRIO)(1)return(OS_PRIO_INVALID);OS_ENTER_CRITICAL();/检测分配给

85、任务的优先级是否有效检测分配给任务的优先级是否有效Task:指向任务代码的指针Pdata:传递给任务的参数的指针Ptos:指向任务堆栈栈顶指针Prio:任务优先权姥篡矗筛磅招笺厨营闻砸巢弧或青姨迭袄鳞涌亨骤揪糊茅莲慧芋柳僵烷丝第2章uCOSII中的任务第2章uCOSII中的任务84if(OSTCBPrioTblprio=(OS_TCB*)0)(2)OSTCBPrioTblprio=(OS_TCB*)1;(3)OS_EXIT_CRITICAL();(4)psp=(void*)OSTaskStkInit(task,pdata,ptos,0);(5)err=OSTCBInit(prio,psp,(v

86、oid*)0,0,0,(void*)0,0);(6)/确保在规定的优先级上还没有建立任务。确保在规定的优先级上还没有建立任务。/如果拟分配的优先级是空闲的,则放置一个非空指针来保留该优先级如果拟分配的优先级是空闲的,则放置一个非空指针来保留该优先级/建立任务堆栈建立任务堆栈,返回新堆栈返回新堆栈栈栈顶顶(psp),并保存在任务的并保存在任务的0S_TCB中中,/从空闲的从空闲的OS_TCB池中获得并初始化一个池中获得并初始化一个OS_TCB,在在0S_CORE.C文件中文件中1)OSTaskCreate()蔽纠随煤杆捣凭邀谓肯规缎钞孕混俏拜舔征兼前燥棉极衬缴坎尘简河妖啄第2章uCOSII中的任

87、务第2章uCOSII中的任务85OSTaskCtr+;(8)OSTaskCreateHook(OSTCBPrioTblprio);(9)OS_EXIT_CRITICAL();if(OSRunning)OSSched();(10)OS_ENTER_CRITICAL();/如果函数是在某任务的执行中被调用如果函数是在某任务的执行中被调用,应调用调度函数以判断新建立的任务是应调用调度函数以判断新建立的任务是否比原来的任务有更高的优先级否比原来的任务有更高的优先级,若是若是,内核作任务切换内核作任务切换1)OSTaskCreate()if(err=OS_NO_ERR)(7)/检验返回代码,如果成功,给

88、检验返回代码,如果成功,给OSTaskCtr加加1,OSTaskCtr用于用于保存产生的任务数目保存产生的任务数目逸棍塞帮拜渊欣笆央丽掳搭魄屁疏再费嘴琅漠拘伶弧命秧胎迁这徘境励斗第2章uCOSII中的任务第2章uCOSII中的任务86elseOS_ENTER_CRITICAL();OSTCBPrioTblprio=(OS_TCB*)0;(12)OS_EXIT_CRITICAL();return(err);elseOS_EXIT_CRITICAL();return(OS_PRIO_EXIST);1)OSTaskCreate()徒咏景吧缓汽兔耪宰桂彬矮腔肌本腿讲包床揉匣尉狞直译活丝夫魂通尧葵第2章

89、uCOSII中的任务第2章uCOSII中的任务87voidmain(void)OSInit();/*初始化初始化uC/OS-II (1)*/OSTaskCreate(TaskStart,)(2)OSStart();/*开始多任务调度开始多任务调度 (3)*/3)3)创建任务的一般方法创建任务的一般方法伴睡蓑悬钥试影鸡猛幸浦矩散纱紊猖龟傲找娃勉怒靳汀择贫歹趟括培冠肝第2章uCOSII中的任务第2章uCOSII中的任务88voidTaskStart(void*pdata)/*安装并启动安装并启动uC/OS-II的时钟节拍的时钟节拍(4)*/OSStatInit();/*初始化统计任务初始化统计任务

90、 (5)*/*创建用户应用程序任务创建用户应用程序任务*/for(;)/*这里是这里是TaskStart()的代码的代码!*/3)3)创建任务的一般方法创建任务的一般方法亨极耳贷桶彬暗横卉货茵永持振爪荔忙愚绍邀挖鸣绎链佯口季惹宵必备诌第2章uCOSII中的任务第2章uCOSII中的任务89第第2章章uC/OS-II中的任务中的任务1 14 42 26 65 58 8任务的基本概念任务的基本概念任务调度任务调度 任务的创建任务的创建3 3任务就绪表任务就绪表7 79 9C/OS-C/OS-的初始化和任务的启动的初始化和任务的启动任务控制块任务控制块任务堆栈任务堆栈 任务的挂起和恢复任务的挂起和恢

91、复其它任务管理函数其它任务管理函数芳臻回握翰泉吉疆焉谬侥讽鳞钝系壶阴色誉仟昆尚嘶肩铰汝钵眷超睫镰韦第2章uCOSII中的任务第2章uCOSII中的任务907 挂起和恢复任务求挂起和恢复任务求l挂起任务,挂起任务,OSTaskSuspend(INT8U prio)挂起自已;挂起自已;参数参数prio=OS_PRIO_SELF;从就绪表中清除;从就绪表中清除;OSTCBStat |= OS_STAT_SUSPEND调用调度函数调用调度函数OSSched()。挂起其它任务挂起其它任务参数参数prio=待挂起任务的优先级待挂起任务的优先级从就绪表中清除从就绪表中清除OSTCBStat |= OS_ST

92、AT_SUSPEND踊仰讹乓削枕孵粱纵抱伦膏婆计娩菱播孙摇凋哟汁锗应蜘幻铲志舶诫暖拨第2章uCOSII中的任务第2章uCOSII中的任务917 挂起和恢复任务求挂起和恢复任务求被挂起的任务只能通过调用被挂起的任务只能通过调用OSTaskResume()OSTaskResume()函数来恢复。函数来恢复。若被挂起的任务同时也在等待若被挂起的任务同时也在等待(OSTCBDlyOSTCBDly0),在对任务做取消挂起操作,在对任务做取消挂起操作时,只能将其恢复为非挂起态,不能将其置时,只能将其恢复为非挂起态,不能将其置为就绪态,要继续等待延时期满时,才能转为就绪态,要继续等待延时期满时,才能转入就绪

93、状态。入就绪状态。敲勺官焊磨腔豪识汕池跟溉吮岳迅膘全伸肋瞄赃菠篡松慕侍隆密兜驭锁篮第2章uCOSII中的任务第2章uCOSII中的任务92 INT8UOSTaskSuspend(INT8Uprio)BOOLEANself;OS_TCB*ptcb;if(prio=OS_IDLE_PRIO)return(OS_TASK_SUSPEND_IDLE);if(prio=OS_LOWEST_PRIO&prio!=OS_PRIO_SELF)return(OS_PRIO_INVALID);OSTaskSuspend()酶苇肛例虐饭嫂汪母僚捆涩衬镶事芥鄂舍早衙示阳毋它捞缓踢扇溶憋绣讲第2章uCOSII中的任务第

94、2章uCOSII中的任务93OS_ENTER_CRITICAL();if(prio=OS_PRIO_SELF)prio=OSTCBCur-OSTCBPrio;self=TRUE;elseif(prio=OSTCBCur-OSTCBPrio)self=TRUE;elseself=FALSE;if(ptcb=OSTCBPrioTblprio)=(OS_TCB*)0)OS_EXIT_CRITICAL();return(OS_TASK_SUSPEND_PRIO);/检验用户是否通过指定OS_PRIO_SELF来挂起调用本函数的任务本身/用户也可以通过指定优先级来挂起调用本函数的任务 /检验要挂起的任务

95、是否存在 OSTaskSuspend()咽村力骤捆太圭灸遂撼肠跋旱布恕气踪部塞穆醚肄找夫贿耽颅撮磊露纵财第2章uCOSII中的任务第2章uCOSII中的任务94elseif(OSRdyTblptcb-OSTCBY&=ptcb-OSTCBBitX)=0)OSRdyGrp&=ptcb-OSTCBBitY;ptcb-OSTCBStat|=OS_STAT_SUSPEND;OS_EXIT_CRITICAL();if(self=TRUE)OSSched();return(OS_NO_ERR);OSTaskSuspend()/就绪表中被移除/在任务的OS_TCB中设置OS_STAT_SUSPEND标志以表明

96、任务正在被挂起/OSTaskSuspend()只有在被挂起的任务是调用本函数的任务本身的情况下才调用任务调度程序。年地耍襄祸陶仿沛贝挨以民幕札眉卷峦栋控豆尤驮琳铅蹭烽剩披己睬措过第2章uCOSII中的任务第2章uCOSII中的任务957 挂起和恢复任务求挂起和恢复任务求l恢复任务,恢复任务,OSTaskResume()被挂起的任务只有通过调用被挂起的任务只有通过调用OSTaskResume()OSTaskResume()才能恢复才能恢复。鹏翠概缴辩瞪续咙恬蚤迟等粘椰拈旦风坝榴裔捐亡营得血斯宜御歪稀哦院第2章uCOSII中的任务第2章uCOSII中的任务96 INT8UOSTaskResume(

97、INT8Uprio)OS_TCB*ptcb;If(prio=OS_LOWEST_PRIO)(1)return(OS_PRIO_INVALID);OS_ENTER_CRITICAL();If(ptcb=OSTCBPrioTblprio)=(OS_TCB*)0)(2)OS_EXIT_CRITICAL();return(OS_TASK_RESUME_PRIO);/要恢复的任务必须是存在的,因为需要操作它的任务控制块OS_TCB(2) OSTaskResume().圈恭挣酿锥坷叶蓬参喝掺告姚翔拆诞姨碱舀龙邱很苍逞蝶枝窒稿严阁磋席第2章uCOSII中的任务第2章uCOSII中的任务97elseif(pt

98、cb-OSTCBStat&OS_STAT_SUSPEND)(3)if(ptcb-OSTCBStat&=OS_STAT_SUSPEND)=OS_STAT_RDY)&(4)(ptcb-OSTCBDly=0)(5)OSRdyGrp|=ptcb-OSTCBBitY;(6)OSRdyTblptcb-OSTCBY|=ptcb-OSTCBBitX;OS_EXIT_CRITICAL();OSSched();(7)OSTaskResume()./该任务必须是被挂起的(3)/通过清除OSTCBStat域中的OS_STAT_SUSPEND位取消挂起(4)/要使任务处于就绪状态,OS_TCBDly域必须为0(5)掣闷

99、珍贮笨训韶司趾全萤仿鹤琢诱秧倡澎册巧坐败绳撤恤燥颠湖铂盗特澄第2章uCOSII中的任务第2章uCOSII中的任务98elseOS_EXIT_CRITICAL();return(OS_NO_ERR);elseOS_EXIT_CRITICAL();return(OS_TASK_NOT_SUSPENDED);OSTaskResume().盲笛搀够瞬傣痴毯苗琵省是延旺品糖右囤易幅售尔坡韵礼饮豹淹惧恃导躺第2章uCOSII中的任务第2章uCOSII中的任务99第第2章章uC/OS-II中的任务中的任务1 14 42 26 65 58 8任务的基本概念任务的基本概念任务调度任务调度 任务的创建任务的创建3

100、 3任务就绪表任务就绪表7 79 9C/OS-C/OS-的初始化和任务的启动的初始化和任务的启动任务控制块任务控制块任务堆栈任务堆栈 任务的挂起和恢复任务的挂起和恢复其它任务管理函数其它任务管理函数锗骨露吼移萍题弹记皇韧异硼拌树驶悔恰宾华宠辙魔称装舰铱捞猩亿赶辐第2章uCOSII中的任务第2章uCOSII中的任务1008 其它任务管理函数其它任务管理函数1)删除任务)删除任务2)改变任务的优先级)改变任务的优先级3)获取任务的信息)获取任务的信息勉罢廓栗瀑饯砚蚁雀赔挎娟提弓赃忻愉灭铰辰聋渴坞冗也芋停插椒忆壹遵第2章uCOSII中的任务第2章uCOSII中的任务1011)删除任务)删除任务l删除

101、任务,删除任务,OSTaskDel()删删除除任任务务, ,是是将将任任务务返返回回并并处处于于休休眠眠状状态态,并并不不是是说说任任务务的的代代码码被被删删除除了了,只只是是任任务务的的代码不再被代码不再被C/OS-C/OS-调用。调用。调用调用OSTaskDel()OSTaskDel()删除任务。删除任务。OSTaskDel()OSTaskDel()不能删除空闲任务不能删除空闲任务, ,也不能在也不能在ISRISR中被调用中被调用; ;OSTaskDel()OSTaskDel()首首先先判判断断优优先先级级是是否否有有效效;从从使使用用链链表表中中删删除除控控制制块块;从从就就绪绪表表或或

102、等等待待事事件件表表中中清清除除;将将控控制制块块放放回空闲链表。回空闲链表。宵惮福豆斗喝谨蚌沧哄矽闰淑锚哪怜治孰氏嘛败滔屋可根驶昂叼竟绿纽侮第2章uCOSII中的任务第2章uCOSII中的任务102 INT8UOSTaskDel(INT8Uprio)OS_TCB*ptcb;OS_EVENT*pevent;if(prio=OS_IDLE_PRIO)return(OS_TASK_DEL_IDLE);if(prio=OS_LOWEST_PRIO&prio!=OS_PRIO_SELF)(2)return(OS_PRIO_INVALID);/要删除的任务不能是空闲任务,因为删除空闲任务是不允许OSTa

103、skDel ()歇埋旱褐瞪汰脯常睛又贪碘届僚炳见御肃芬二栓敦脾啥渡程繁曹骤奶向怒第2章uCOSII中的任务第2章uCOSII中的任务103OS_ENTER_CRITICAL();if(OSIntNesting0)OS_EXIT_CRITICAL();return(OS_TASK_DEL_ISR);if(prio=OS_PRIO_SELF)(4)Prio=OSTCBCur-OSTCBPrio;if(ptcb=OSTCBPrioTblprio)!=(OS_TCB*)0)(5)if(OSRdyTblptcb-OSTCBY&=ptcb-OSTCBBitX)=0)(6)OSRdyGrp&=ptcb-OS

104、TCBBitY;/不能在ISR例程中删除一个任务,因为这也是不被允许的/调用此函数的任务可以通过指定OS_PRIO_SELF参数来删除自已OSTaskDel ()寸够廊扬郁榆霸道兜纲羽香姚躺般疙泞骂温戌歉萍簧缮杀徽声够钟缆糖殉第2章uCOSII中的任务第2章uCOSII中的任务104if(pevent=ptcb-OSTCBEventPtr)!=(OS_EVENT*)0)(7)if(pevent-OSEventTblptcb-OSTCBY&=ptcb-OSTCBBitX)=0)pevent-OSEventGrp&=ptcb-OSTCBBitY;Ptcb-OSTCBDly=0;(8)Ptcb-OS

105、TCBStat=OS_STAT_RDY;(9)OSLockNesting+;(10)OS_EXIT_CRITICAL();OSDummy();(12)/将时钟延迟数清零,以确保自己重新允许中断的时候,ISR不会使该任务就绪 /置任务标志以阻止其它任务或ISR让该任务重新开始执行。/阻止任务调度程序在删除过程中切换到其它的任务中去;OSTaskDel ()/重新允许中断以减少中断的响应时间。这样,就能处理中断服务了,但由于它增加了OSLockNesting,ISR执行完后会返回到被中断任务,从而继续任务的删除工作失楚辰祈劳宗何浪粱酗擂顿喜业质背聊傻杰究任栋肇拔碟帐叁息酉隔亮饮第2章uCOSII中

106、的任务第2章uCOSII中的任务105OS_ENTER_CRITICAL();OSLockNesting-;(13)OSTaskDelHook(ptcb);(14)OSTaskCtr-;OSTCBPrioTblprio=(OS_TCB*)0;(15)if(ptcb-OSTCBPrev=(OS_TCB*)0)(16)ptcb-OSTCBNext-OSTCBPrev=(OS_TCB*)0;OSTCBList=ptcb-OSTCBNext;elseptcb-OSTCBPrev-OSTCBNext=ptcb-OSTCBNext;ptcb-OSTCBNext-OSTCBPrev=ptcb-OSTCBPr

107、ev;/重新关中断后,它通过锁定嵌套计数器减一以重新允许任务调度,用户可以在这里删除或释放自定义的TCB附加数据域 / 将指向被删除的任务的OS_TCB的指针指向NULL,就从优先级数组中将OS_TCB去除。再接着将被删除的任务的OS_TCB从OS_TCB双向链表中移除/被删除的任务位于表头/被删除的任务位于表中间OSTaskDel ()蚂隔也措胀给谩食纺楚淖巧勤金撂庸瘸汰精腮循沫务聂癣抬候硫戈桓液咎第2章uCOSII中的任务第2章uCOSII中的任务106ptcb-OSTCBNext=OSTCBFreeList;(17)OSTCBFreeList=ptcb;OS_EXIT_CRITICAL(

108、);OSSched();(18)return(OS_NO_ERR);elseOS_EXIT_CRITICAL();return(OS_TASK_DEL_ERR);OS_TCB返回到空闲OS_TCB表中,允许其它任务的建立,最后调用任务调度程序来查看在OSTaskDel()重新允许中断的时候 (11),中断服务子程序是否曾使更高优先级的任务处于就绪状态(18)。OSTaskDel ()曲冀灰笑委杜蔡舒呈扒雾拌务载忻仓违彭诺墙忿吉苔乡凑渡胡涕赵剖嵌古第2章uCOSII中的任务第2章uCOSII中的任务1071) 删除任务删除任务l请求删除任务,请求删除任务,OSTaskDelReq()有有时时候候

109、,任任务务会会占占用用一一些些内内存存缓缓冲冲区区或或信信号号量量一一类类的的资资源源,这这时时假假如如另另一一个个任任务务试试图图删删除除该该任任务务,这这些些被被占占用用的的资资源源就就会会因因为为没没被被释释放放而而丢丢失失,导导致致存存储储器器漏漏洞洞, ,这这是是任任何何嵌嵌入入式式系系统统都都无无法法接接受受的的。在在这这种种情情况况下下,用用户户可可以以想想法法子子让让拥拥有有这这些些资资源源的的任任务务在在使使用用完完资资源源后后,先先释释放放资资源源,再再删删除除自自己己。可可以以通通过过OSTaskDelReq()OSTaskDelReq()函数来完成该功能。函数来完成该功

110、能。池娶择敷雁釜镊贬脖煤篙柬介隐拾厅厉艾灵压净钦挖海民可吸妒混水撞膏第2章uCOSII中的任务第2章uCOSII中的任务108程序清程序清单 L 4.12请求求删除其它任除其它任务的任的任务(任任务B)voidRequestorTask(void*pdata)INT8Uerr;pdata=pdata;for(;)/*应应用程序代用程序代码码*/if(TaskToBeDeleted()需要被需要被删删除除)(1)while(OSTaskDelReq(TASK_TO_DEL_PRIO)!=OS_TASK_NOT_EXIST)(2)OSTimeDly(1);(3)/*应应用程序代用程序代码码*/(4

111、)案俗憎够酱赠茬冲酿撵匣甘巫演斥化馋葡葬粗泉秤卜恳望森饲渝备芽弛份第2章uCOSII中的任务第2章uCOSII中的任务109需要删除自己的任务需要删除自己的任务(任务任务A)voidTaskToBeDeleted(void*pdata)/此此为为用用户户函数函数INT8Uerr;pdata=pdata;for(;)/*应用程序代码应用程序代码*/If(OSTaskDelReq(OS_PRIO_SELF)=OS_TASK_DEL_REQ)(1)释放所有占用的资源释放所有占用的资源;(2)释放所有动态内存释放所有动态内存;OSTaskDel(OS_PRIO_SELF);(3)else/*应用程序代

112、码应用程序代码*/甄耶坟蓄跳粪粪垦肪原伯罗邦逻央谩运染痉江鹅篱傅帕泳甸甩顷坏疵喘左第2章uCOSII中的任务第2章uCOSII中的任务110 INT8UOSTaskDelReq(INT8Uprio)BOOLEANstat;INT8Uerr;OS_TCB*ptcb;if(prio=OS_IDLE_PRIO)(1)return(OS_TASK_DEL_IDLE);if(prio=OS_LOWEST_PRIO&prio!=OS_PRIO_SELF)(2)return(OS_PRIO_INVALID);OSTaskDelReq().敛五钵耳祖指外岭猾弦输简语碍贷埃盐剑马豁侗削晨辟峡场剿轰郁逊雹癣第2章

113、uCOSII中的任务第2章uCOSII中的任务111if(prio=OS_PRIO_SELF)(3)OS_ENTER_CRITICAL();stat=OSTCBCur-OSTCBDelReq;OS_EXIT_CRITICAL();return(stat);elseOS_ENTER_CRITICAL();if(ptcb=OSTCBPrioTblprio)!=(OS_TCB*)0)(4)ptcb-OSTCBDelReq=OS_TASK_DEL_REQ;(5)err=OS_NO_ERR;elseerr=OS_TASK_NOT_EXIST;(6)OS_EXIT_CRITICAL();return(er

114、r);矽粮酒教腰疚张显先诫摇四岗抵芝萎介懂与古棕睹酬闲醇鳞胜佃亥辨鸿秒第2章uCOSII中的任务第2章uCOSII中的任务1122) 改变任务的优先级改变任务的优先级l改变任务的优先级,改变任务的优先级,OSTaskChangePrio()在在用用户户建建立立任任务务的的时时候候会会分分配配给给任任务务一一个个优优先先 级级 。 在在 程程 序序 运运 行行 期期 间间 , 用用 户户 可可 以以 通通 过过 调调 用用 OSTaskChangePrioOSTaskChangePrio()()来来改改变变任任务务的的优优先先级级。换换句句话话说说,就就是是C/OS-C/OS-允许用户动态的改变

115、任务的优先级。允许用户动态的改变任务的优先级。OSTaskChangePrio()可以改变调用本函数的任务(当前任务)的优先级或其它任务的优先级.付弹馆数符懈丫忌演锣钱陆绕荫蜗捣茨恶售和商零辊怔唾在活阀皖蓬戊糕第2章uCOSII中的任务第2章uCOSII中的任务113 INT8UOSTaskChangePrio(INT8Uoldprio,INT8Unewprio)OS_TCB*ptcb;OS_EVENT*pevent;INT8Ux;INT8Uy;INT8Ubitx;INT8Ubity;if(oldprio=OS_LOWEST_PRIO&oldprio!=OS_PRIO_SELF)|newpri

116、o=OS_LOWEST_PRIO)return(OS_PRIO_INVALID);/不能改变空闲任务的优先级,只能改变调用本函数的任务或者其它任务的优先级OSTaskChangePrio()阎此端洗君杯惕插瞒窗茄战珐搭呈甜圭余瓮霞秀咕夕君雾攫甩淳深害晋戴第2章uCOSII中的任务第2章uCOSII中的任务114OS_ENTER_CRITICAL();if(OSTCBPrioTblnewprio!=(OS_TCB*)0)(2)OS_EXIT_CRITICAL();return(OS_PRIO_EXIST);elseOSTCBPrioTblnewprio=(OS_TCB*)1;(3)OS_EXIT

117、_CRITICAL();y=newprio3;(4)bity=OSMapTbly;x=newprio&0x07;bitx=OSMapTblx;OS_ENTER_CRITICAL();/检验新优先级是否是合法的/如果新优先级是合法的,则保留这个优先级OSTaskChangePrio()徊欲悠筑搭津痕铆瞳不绸恫芍冰告镇强壁杜疵颐恬谭病浆级语讶颁骄尽闻第2章uCOSII中的任务第2章uCOSII中的任务115if(oldprio=OS_PRIO_SELF)(5)oldprio=OSTCBCur-OSTCBPrio;if(ptcb=OSTCBPrioTbloldprio)!=(OS_TCB*)0)(6

118、)OSTCBPrioTbloldprio=(OS_TCB*)0;(7)if(OSRdyTblptcb-OSTCBY&ptcb-OSTCBBitX)(8)if(OSRdyTblptcb-OSTCBY&=ptcb-OSTCBBitX)=0)(9)OSRdyGrp&=ptcb-OSTCBBitY;OSRdyGrp|=bity;(10)OSRdyTbly|=bitx;/检验当前任务是否想改变它的优先级。然后检查想要改变优先级的任务是否存在(6)。/插入NULL指针将指向当前任务OS_TCB的指针从优先级数组中移除(7) /检验想要改变优先级的任务是否就绪 (8) /如果该任务处于就绪状态,必须在当前的

119、优先级下从就绪表中移除 (9),/将任务插入就绪表OSTaskChangePrio()游葫囚卓扳冷到门膜醛楞骤蜜鞘碴榜抢值肢朗迭覆阔讳郭芯苦装男聋灰欢第2章uCOSII中的任务第2章uCOSII中的任务116elseif(pevent=ptcb-OSTCBEventPtr)!=(OS_EVENT*)0)(11)if(pevent-OSEventTblptcb-OSTCBY&=ptcb-OSTCBBitX)=0)pevent-OSEventGrp&=ptcb-OSTCBBitY;pevent-OSEventGrp|=bity;(12)pevent-OSEventTbly|=bitx;/如任务在等

120、待某一事件的发生,必须将任务从事件控制块(在旧的优先级下)中移除。并在新的优先级下将事件插入到等待队列中 (12) OSTaskChangePrio()苏挫焦榔缺丈藐侥襟脯邹瞒倦烫侍钝塔民姿奎钠檀陀隋定惹及哈炒劣弃童第2章uCOSII中的任务第2章uCOSII中的任务117OSTCBPrioTblnewprio=ptcb;(13)ptcb-OSTCBPrio=newprio;(14)ptcb-OSTCBY=y;(15)ptcb-OSTCBX=x;ptcb-OSTCBBitY=bity;ptcb-OSTCBBitX=bitx;OS_EXIT_CRITICAL();OSSched();(16)re

121、turn(OS_NO_ERR);/将 指 向 任 务 OS_TCB的 指 针 存 到 OSTCBPrioTbl中 (13)。新的优先级被保存在OS_TCB中(14),重新计算的值也被保 存 在 OS_TCB中 (15)。 OSTaskChangePrio()完成了关键性的步骤后,在新的优先级高于旧的优先级或新的优先级高于调用本函数的任务的优先级情况下,任务调度程序就会被调用(16)。OSTaskChangePrio()笨拖幌框梅茸赘讽袋钾焰挥托侮别乐试非谐吝髓冤七邦佰磷石技贝完唾修第2章uCOSII中的任务第2章uCOSII中的任务118elseOSTCBPrioTblnewprio=(OS_

122、TCB*)0;(17)OS_EXIT_CRITICAL();return(OS_PRIO_ERR);OSTaskChangePrio()肖允酬蚌能缨写专螟吻里匝刽举吝摘蘸貉握头妊并焊骂惯混亚过灯赋廊埋第2章uCOSII中的任务第2章uCOSII中的任务1193)获取任务的信息)获取任务的信息l获得有关任务的信息,获得有关任务的信息,OSTaskQuery()应应用用程程序序可可以以通通过过调调用用OSTaskQuery()函函数数来来获获得得自自身身或或其其它它任任务务的的信信息息。该该函函数数获获得得的的只只是是指指定任务的任务控制块定任务的任务控制块OS_TCBOS_TCB中内容的拷贝。中

123、内容的拷贝。要要调调用用该该函函数数, ,应用用程程序序必必须为OS_TCBOS_TCB分分配配存存储空空间。这个个OS_TCBOS_TCB的的数数据据空空间间与与C/OS-C/OS-分分配配给给任任务务控控制制块块OS_TCBOS_TCB的的数数据据空空间完完全全不不同同。在在调用用了了该该函函数数后后,这个个OS_TCBOS_TCB包包含含了了指指定定任任务的的OS_TCBOS_TCB的的副副本本. .不要改不要改变OSTCBNextOSTCBNext与与OSTCBPrevOSTCBPrev的指向的指向. . 本本函函数数只只用用来来了了解解任任务正正在在干干什什么么-本本函函数数是是一一

124、个个有用的有用的调试工具工具 . .屉翟账靳芬絮硝糊涝娟凯阂奔柯皆殉贝继戴娱搅冉壤付刀务扁轮炮妮阐擒第2章uCOSII中的任务第2章uCOSII中的任务120得到任务的信息得到任务的信息OS_TCBMyTaskData;voidMyTask(void*pdata)pdata=pdata;for(;)/*用户代码用户代码*/err=OSTaskQuery(10,&MyTaskData);/*Examineerrorcode.*/*用户代码用户代码*/3)获取任务的信息获取任务的信息粟阎庆有守隶柠遭嘲脯宵德玩障婪棠吸叁密世竟匪喝敝祟契吞忆孪扬夷瓷第2章uCOSII中的任务第2章uCOSII中的任务

125、121INT8UOSTaskQuery(INT8Uprio,OS_TCB*pdata)OS_TCB*ptcb;if(prioOS_LOWEST_PRIO&prio!=OS_PRIO_SELF)return(OS_PRIO_INVALID);OS_ENTER_CRITICAL();if(prio=OS_PRIO_SELF)(2)prio=OSTCBCur-OSTCBPrio;if(ptcb=OSTCBPrioTblprio)=(OS_TCB*)0)(3)OS_EXIT_CRITICAL();return(OS_PRIO_ERR);*pdata=*ptcb;(4)OS_EXIT_CRITICAL(

126、);return(OS_NO_ERR);OSTaskQuery ()应辉进杆捏窝厢晨寺凶隧杉呆宁享曼惰瞥聪歌全框死贞啃敌蒲艇痢撂来殊第2章uCOSII中的任务第2章uCOSII中的任务122第第2章章uC/OS-II中的任务中的任务1 14 42 26 65 58 8任务的基本概念任务的基本概念任务调度任务调度 任务的创建任务的创建3 3任务就绪表任务就绪表7 79 9C/OS-C/OS-的初始化和任务的启动的初始化和任务的启动任务控制块任务控制块任务堆栈任务堆栈 任务的挂起和恢复任务的挂起和恢复其它任务管理函数其它任务管理函数袒矮喘雌床今糯惶乌挝沁聋帆汾编迂啤盏阐或铲舆子载登奄外溅谣浴障臼第

127、2章uCOSII中的任务第2章uCOSII中的任务1239 C/OS-9 C/OS-的初始化和任务的启动的初始化和任务的启动lC/OS-C/OS-初始化初始化 OSIint()OSIint()初初始始化化函函数数负负责责初初始始化化C/OS-C/OS-所所有有的的变变量量和和数据结构(见数据结构(见OS_CORE.COS_CORE.C)。)。 OSInit()OSInit()先后做以下事情先后做以下事情: :初始化全局初始化全局变量量初始化就初始化就绪表表建建空空闲数数据据缓冲冲池池(空空任任务控控制制块、空空事事件件控控制制块、空空消消息息队列控制列控制块、空存、空存储器管理控制器管理控制块

128、)建立空闲任务建立空闲任务OSTaskIdleOSTaskIdle()(优先级为()(优先级为S_LOWEST_PRIOS_LOWEST_PRIO)建建立立统统计计任任务务OSTaskStat()OSTaskStat()(如如果果统统计计任任务务允允许许位位和和任任务务建建立扩展允许位都设为立扩展允许位都设为1 1,优先级为,优先级为OS_LOWEST_PRIO-1OS_LOWEST_PRIO-1)。)。寒猴鸣概皂淮荷憾柱焦滇吭逾庞景况嫁慢蜂摊泉洋股号驼岭脓弥弯针类扮第2章uCOSII中的任务第2章uCOSII中的任务124初始化全局变量初始化全局变量0委窥劫厕侠豆晋梅典悲熟票撂疫枪障娠枫峦叶

129、乡旋得诧秒两疙柞浅捏推惨第2章uCOSII中的任务第2章uCOSII中的任务125初始化就绪表初始化就绪表000苦刃舞线异诀渍报浚俄熊活讯倒铸呐私峭驼插瓣燎搂筑渡免狗涕侩视裳腆第2章uCOSII中的任务第2章uCOSII中的任务126空闲缓冲池空任务控制块空闲缓冲池空任务控制块空闲缓冲池键贯霸斤质校夫鹃涵骋撵端琼锄佑澄仓赐鸭棕齿碗拎且吏恍敛拘虚吵履杖第2章uCOSII中的任务第2章uCOSII中的任务127空闲缓冲池空事件、空消息队列与空存储器管理控制块空事件、空消息队列与空存储器管理控制块空闲缓冲池空闲缓冲池骄众熙拯短礼裁蚌刚泞贺搀坟失逢朵炭连厅我纸钧窝了尾昨痒惰酣辣柜厦第2章uCOSII中

130、的任务第2章uCOSII中的任务128建空闲任务与统计任务建空闲任务与统计任务笺舵贼犯息阐供瘁荡肌蟹谊夺臆曝哗琵搔俱膨租达页陌皱埃砰僻涯品霸舜第2章uCOSII中的任务第2章uCOSII中的任务129帖凉力际耸哀搐喳躲孙乒盆雷过导咽宾歹喂条镭姜蜗针沦部玉商类羊牙荒第2章uCOSII中的任务第2章uCOSII中的任务130void Main(void)/int argc, char *argvchar Id0 = 4;ARMTargetInit();/* needed by uC/OS */OSInit();OSTimeSet(0);/* create the start task */OSTa

131、skCreate(TaskStart,(void *)0, &StackMainSTACKSIZE - 1, 0);/* start the operating system */OSStart(); 荤灰花漓仅儡舞棕焚萝鸭因鼠尽被罩撬慷慌鸡抓侯汇哗步欣板叁尤移唐桅第2章uCOSII中的任务第2章uCOSII中的任务131void OSInit (void) INT16U i; OSTime = 0L; /* Clear the 32-bit system clock */ OSIntNesting = 0; /* Clear the interrupt nesting counter */

132、OSLockNesting = 0; /* Clear the scheduling lock counter */#if OS_TASK_CREATE_EN | OS_TASK_CREATE_EXT_EN | OS_TASK_DEL_EN OSTaskCtr = 0; /* Clear the number of tasks */#endif OSRunning = FALSE; /* Indicate that multitasking not started */ OSIdleCtr = 0L; /* Clear the 32-bit idle counter */#if OS_TASK

133、_STAT_EN & OS_TASK_CREATE_EXT_EN OSIdleCtrRun = 0L; OSIdleCtrMax = 0L; OSStatRdy = FALSE; /* Statistic task is not ready */#endif 逐簿胯届蝗申堡曲呛甄沦篷雅津镊截淮疑庶叹帧辟愁竹仰刑隆悄汲漫劳幻第2章uCOSII中的任务第2章uCOSII中的任务132 OSCtxSwCtr = 0; /* Clear the context switch counter */ OSRdyGrp = 0; /* Clear the ready list */ for (i = 0;

134、i OS_RDY_TBL_SIZE; i+) OSRdyTbli = 0; OSPrioCur = 0; OSPrioHighRdy = 0; OSTCBHighRdy = (OS_TCB *)0; /* TCB Initialization */ OSTCBCur = (OS_TCB *)0; OSTCBList = (OS_TCB *)0; for (i = 0; i (OS_LOWEST_PRIO + 1); i+) OSTCBPrioTbli = (OS_TCB *)0; for (i = 0; i = 2 for (i = 0; i = 2) OSQInit(); /* Initia

135、lize the message queue structures */#endif图万龄驶新罪只残设唉蝶抱兰诞整书处戴葵斟霞旦誓管碘补绚涕哼镰且金第2章uCOSII中的任务第2章uCOSII中的任务134#if OS_MEM_EN & OS_MAX_MEM_PART = 2 OSMemInit(); /* Initialize the memory manager */#endif #if OS_STK_GROWTH = 1 #if OS_TASK_CREATE_EXT_EN OSTaskCreateExt(OSTaskIdle, (void *)0, &OSTaskIdleStkOS_TA

136、SK_IDLE_STK_SIZE - 1, OS_IDLE_PRIO, /* Lowest priority level */ OS_TASK_IDLE_ID, &OSTaskIdleStk0, /* Set Bottom-Of-Stack */ OS_TASK_IDLE_STK_SIZE, (void *)0, /* No TCB extension */ OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); #else OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStkOS_TASK_IDLE_STK_SI

137、ZE - 1, OS_IDLE_PRIO); #endif说析樊瘁鸭吼漾郡毕案耘炸纠叔撵蹈栈克壤慢敲劣务战黄畅末战横起履叮第2章uCOSII中的任务第2章uCOSII中的任务135#else #if OS_TASK_CREATE_EXT_EN OSTaskCreateExt(OSTaskIdle, (void *)0, /* No arguments passed to OSTaskIdle() */ &OSTaskIdleStk0, /* Set Top-Of-Stack */ OS_IDLE_PRIO, /* Lowest priority level */ OS_TASK_IDLE_ID

138、, &OSTaskIdleStkOS_TASK_IDLE_STK_SIZE - 1, OS_TASK_IDLE_STK_SIZE, (void *)0, /* No TCB extension */ OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); #else OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk0, OS_IDLE_PRIO); #endif#endif#if OS_TASK_STAT_EN #if OS_TASK_CREATE_EXT_EN 叮釉迄楞堡视智枷棵卢胎婉京辐馅拇钙跨制屠茁蔡僚津

139、睛陋榨极互吠蜗杖第2章uCOSII中的任务第2章uCOSII中的任务136 #if OS_STK_GROWTH = 1 OSTaskCreateExt(OSTaskStat, (void *)0, /* No args passed to OSTaskStat() */ &OSTaskStatStkOS_TASK_STAT_STK_SIZE - 1, OS_STAT_PRIO, /* One higher than the idle task */ OS_TASK_STAT_ID, &OSTaskStatStk0, /* Set Bottom-Of-Stack */ OS_TASK_STAT_

140、STK_SIZE, (void *)0, /* No TCB extension */ OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); #else OSTaskCreateExt(OSTaskStat, (void *)0, /* No args passed to OSTaskStat() */ &OSTaskStatStk0, /* Set Top-Of-Stack */ OS_STAT_PRIO, /* One higher than the idle task */ OS_TASK_STAT_ID, &OSTaskStatStkOS_TASK_S

141、TAT_STK_SIZE - 1, OS_TASK_STAT_STK_SIZE, 潘秸敝毗色道坠利途棋肚喊澈脉负俏萝拯碴鸯奶马札逮榷褪粘含繁苗驰下第2章uCOSII中的任务第2章uCOSII中的任务137 (void *)0, /* No TCB extension */ OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); #endif #else #if OS_STK_GROWTH = 1 OSTaskCreate(OSTaskStat, (void *)0, /* No args passed to OSTaskStat() */ &OSTaskStat

142、StkOS_TASK_STAT_STK_SIZE - 1, OS_STAT_PRIO); /* One higher than the idle task */ #else OSTaskCreate(OSTaskStat, (void *)0, /* No args passed to OSTaskStat() */ &OSTaskStatStk0, /* Set Top-Of-Stack */ OS_STAT_PRIO); /* One higher than the idle task */ #endif #endif#endif呸勇绞扎苗糕账邯锻稽怒聘卷象缉挑诗环抽时奸直子峰悦芹筋星窜仔

143、嗓膳第2章uCOSII中的任务第2章uCOSII中的任务1389 C/OS-9 C/OS-的初始化和任务的启动的初始化和任务的启动 lC/OS-C/OS-的启动的启动C/OS-C/OS-的启动的启动( (任务启动任务启动) )是通过调用是通过调用OSStart()函数函数实现的。实现的。 OSStart()从任务就绪表中找出优先级最高的从任务就绪表中找出优先级最高的任务的任务控制块,然后调用任务的任务控制块,然后调用OSStartHighRdy()启动就绪表中优先级最高的任务。启动就绪表中优先级最高的任务。聊淤只备贡胜岩继廉响妥糠遏雇霄往畅榴呸浪牟屏浪潭客竞业榜综璃敝驴第2章uCOSII中的任

144、务第2章uCOSII中的任务139void Main(void)/int argc, char *argvchar Id0 = 4;ARMTargetInit();/* needed by uC/OS */OSInit();OSTimeSet(0);/* create the start task */OSTaskCreate(TaskStart,(void *)0, &StackMainSTACKSIZE - 1, 0);/* start the operating system */OSStart(); 笨鳖发芭蝎书赌红颧柱猫起惑堤犀呕底颠琶碰敬械鼎瑰静宰炽喳纬沤以肉第2章uCOSII中的

145、任务第2章uCOSII中的任务140启动多任务启动多任务OSStart ()void OSStart (void) INT8U y; INT8U x; if (OSRunning = FALSE) y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly; OSPrioHighRdy = (INT8U)(y 3) + x); OSPrioCur = OSPrioHighRdy; OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; OSTCBCur = OSTCBHighRdy; OSStartHighRdy(); 获昂斗勉精

146、牟樟椰濒亏琢仲坍罪大苍挝愧演舍宿昂见认支币烂霄悠脾冠俏第2章uCOSII中的任务第2章uCOSII中的任务141关于关于OSStartHighRdyOSStartHighRdyLDRr4,addr_OSTCBCur;GetcurrenttaskTCBaddressLDRr5,addr_OSTCBHighRdy ;GethighestprioritytaskTCB;addressLDRr5,r5;getstackpointerLDRsp,r5;switchtothenewstackSTRr5,r4;setnewcurrenttaskTCBaddressLDMFDsp!,r4;YYYMSRSPSR

147、_cxsf,r4LDMFDsp!,r4;getnewstatefromtopofthestackMSRCPSR_cxsf,r4;CPSRshouldbeSVC32ModeLDMFDsp!,r0-r12,lr,pc;startthenewtask龄骤程贞塘辉堡唁盯步仆柴沧殷嘎历谭遭您爹抛乓胀漾袖樱冒晰瑟诵千泼第2章uCOSII中的任务第2章uCOSII中的任务142调用OSStart()之后的数据结构 阐捞择黄光沽锯荤畔驭延登搜瞪槽哩惨嘎女谦诬讳堤挪错描搜裳小锨婉价第2章uCOSII中的任务第2章uCOSII中的任务143第第2章章uC/OS-II中的任务中的任务小结小结1 14 42 26 6

148、5 58 8任务的基本概念任务的基本概念任务调度任务调度 任务的创建任务的创建3 3任务就绪表任务就绪表7 79 9C/OS-C/OS-的初始化和任务的启动的初始化和任务的启动任务控制块任务控制块任务堆栈任务堆栈 任务的挂起和恢复任务的挂起和恢复其它任务管理函数其它任务管理函数捻帝汛调彝拼禾趟奉亨慈套黄唆渺咆忌茅巳榆厢梨炉笆屎氰让姜持缴欧力第2章uCOSII中的任务第2章uCOSII中的任务144第第2章章uC/OS-II中的任务中的任务小结小结l1.任务创建任务创建任务代码任务代码任务堆栈任务堆栈任务控制块任务控制块任务就绪表任务就绪表任务创建函数任务创建函数茸按闸铬祖傈允镑缮庞挂瞥恨茅鲤钵

149、畸谋骆沂辣姜吝琵树蛊需定邦栈奴铆第2章uCOSII中的任务第2章uCOSII中的任务145第第2章章uC/OS-II中的任务中的任务小结小结l2.任务调度度任务调度度任务调度器任务调度器OSSched()任务切换任务切换OS_TASK_SW();搪塌诊留屁郸诽钨聪佬冗河猩掇县约顺卡渍憋侣彦泉佑擦钉它钮朝笛熟除第2章uCOSII中的任务第2章uCOSII中的任务146第第2章章 uC/OS-II中的任务中的任务小结小结l3.uCOS-II初始化:初始化:OSInit() :OSInit() :初始化全局初始化全局变量量初始化就初始化就绪表表建建空空闲数数据据缓冲冲池池(空空任任务控控制制块、空空

150、事事件件控控制制块、空消息、空消息队列控制列控制块、空存、空存储器管理控制器管理控制块)建建 立立 空空 闲闲 任任 务务 OSTaskIdleOSTaskIdle( ) ( 优优 先先 级级 为为S_LOWEST_PRIOS_LOWEST_PRIO)建建立立统统计计任任务务OSTaskStat()OSTaskStat()(如如果果统统计计任任务务允允许许位位和和 任任 务务 建建 立立 扩扩 展展 允允 许许 位位 都都 设设 为为 1 1, 优优 先先 级级 为为OS_LOWEST_PRIO-1OS_LOWEST_PRIO-1)。)。佛君翅刃仑惫延糟袍撬莉儒柿钻乱多吼抨王履踢仟蘸刚股驻杠凭管兼穗谗第2章uCOSII中的任务第2章uCOSII中的任务147第第2章章uC/OS-II中的任务中的任务小结小结l4.uCOS-II 启动(多任务启动)启动(多任务启动)OSStart()从任务就绪表中找出优先级最高的任务的从任务就绪表中找出优先级最高的任务的任务控制块任务控制块OSStartHighRdy()启动就绪表中优先级最高的任务。启动就绪表中优先级最高的任务。缆剥赚周洞顽谎掀瞪牵骗论憾弄卿索绒俗旱偏铝摇灶变仰群福净幽惕球笔第2章uCOSII中的任务第2章uCOSII中的任务

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号