版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第第2章章 uC/OS-II中的义务中的义务义务的根本概念义务的根本概念义务调度义务调度 义务的创建义务的创建义务就绪表义务就绪表C/OS-C/OS-的初始化和义务的启动的初始化和义务的启动义务控制块义务控制块义务堆栈义务堆栈 义务的挂起和恢复义务的挂起和恢复其它义务管理函数其它义务管理函数21 义务的根本概念义务的根本概念l义务概述义务概述l义务形状义务形状l系统义务系统义务31义务概述义务概述从程序设计角度看,从程序设计角度看,uC/OS-II中的义务是一个中的义务是一个线程,其代码通常是一个无限循环构造线程,其代码通常是一个无限循环构造/超循环超循环构造,看起来像其它构造,看起来像其它
2、C函数一样。函数一样。void mytask(void *pdata) for (;) do something; waiting; do something; 4从义务的存储构造看,义务由三个部分组成:义务控制块、义务代码与义务堆栈义务堆栈void mytask () . for(;) . 义务代码义务控制块指向前一个义务控制块的指针指向后一个义务控制块的指针指向义务的指针指向义务堆栈的指针义务的优先级别义务义务的存储构造1义务概述义务概述5义务控制块义务代码义务堆栈义务1义务控制块义务代码义务堆栈义务2义务控制块义务代码义务堆栈义务n义务控制块链表1义务概述义务概述61义务概述义务概述 C
3、/OS II 支持支持64个义务,每个义务有一个特定的个义务,每个义务有一个特定的优先级。优先级。义务的优先级别用数字表示,义务的优先级别用数字表示,0表示的义务的优先表示的义务的优先级最高,数字越大表示的优先级越低。级最高,数字越大表示的优先级越低。经过常数经过常数OS_LOWEST_PRIO 在在OS_CFG.H中中定义系统的最低优先级别,同时限定系统能包容定义系统的最低优先级别,同时限定系统能包容的最多义务数量。的最多义务数量。建议用户不要运用优先级为建议用户不要运用优先级为0、1、2、3、OS_LOWEST_PRIO-3、 OS_LOWEST_PRIO-2、 OS_LOWEST_PRI
4、O-1、 OS_LOWEST_PRIO-0的义务。最低的两个已被目的义务。最低的两个已被目前版本的系统占用,未来版本能够会用到其它的。前版本的系统占用,未来版本能够会用到其它的。72)义务形状义务形状l睡眠态睡眠态DORMANTDORMANT: : 义务驻留在程序空间,义务驻留在程序空间,还没有交给还没有交给C/OS-C/OS-管理管理, ,还没有配备义务控还没有配备义务控制块制块, ,还没有创建。把义务交给还没有创建。把义务交给C/OS-C/OS-是经是经过调用下述两个函数之一来完成的:过调用下述两个函数之一来完成的:OSTaskCreate()OSTaskCreate()或或OSTaskC
5、reateExt()OSTaskCreateExt()。l就绪态就绪态(READY): (READY): 义务一旦建立,就进入就绪义务一旦建立,就进入就绪态预备运转。一个义务可以经过调用态预备运转。一个义务可以经过调用OSTaskDel()OSTaskDel()前往到睡眠态,或经过调用该函前往到睡眠态,或经过调用该函数让另一个义务进入睡眠态。数让另一个义务进入睡眠态。82)义务形状义务形状运转态运转态(RUNNING): (RUNNING): 正在运用正在运用CPUCPU的形状称运转的形状称运转态。就绪的义务只需当一切优先级高于本人的态。就绪的义务只需当一切优先级高于本人的义务转为等待形状,或
6、者是被删除了,才干进义务转为等待形状,或者是被删除了,才干进入运转态。入运转态。等待态等待态(WAITING):(WAITING):等待某事件发生的形状等待某事件发生的形状. .正在运转的义务可以经过调用正在运转的义务可以经过调用OSTimeDly()OSTimeDly()或或OSTimeDlyHMSM()OSTimeDlyHMSM()进入等待形状进入等待形状调用调用OSSemPend()OSSemPend()、OSMboxPend()OSMboxPend()或或OSQPend()OSQPend()进入等待形状进入等待形状WAITINGWAITING。92)义务形状义务形状中断效力态中断效力态
7、(ISR):(ISR):正在运转的义务被中断正在运转的义务被中断( (除非中断是封锁的除非中断是封锁的) )时时就进入了中断效力态就进入了中断效力态ISRISR。102)义务形状义务形状113)3)系统义务系统义务 l空闲义务空闲义务(Idle Task)(Idle Task)lC/OS-C/OS-总要建立一个空闲义务,这个义务总要建立一个空闲义务,这个义务在没有其它义务进入就绪态时投入运转。这个在没有其它义务进入就绪态时投入运转。这个空闲义务空闲义务OSTaskIdle()OSTaskIdle()永远设为最低优先级,永远设为最低优先级,即即OS_LOWEST_PRI0OS_LOWEST_PR
8、I0。l空闲义务空闲义务OSTaskIdle()OSTaskIdle()什么也不做,只是在不什么也不做,只是在不停地给一个停地给一个3232位的名叫位的名叫OSIdleCtrOSIdleCtr的计数器加的计数器加1 1,统计义务运用这个计数器以确定现行运用软,统计义务运用这个计数器以确定现行运用软件实践耗费的件实践耗费的CPUCPU时间。时间。l空闲义务不能够被运用软件删除空闲义务不能够被运用软件删除 12C/OS-的空闲义务的空闲义务.void OSTaskIdle (void *pdata) pdata = pdata; for (;) OS_ENTER_CRITICAL(); OSIdl
9、eCtr+; OS_EXIT_CRITICAL(); OSTaskIdleHook(); 3)系统义务系统义务133)3)系统义务系统义务统计义务统计义务OSTaskStat()OSTaskStat()义务义务OSTaskStat()OSTaskStat()是担任统计运转时间的义务是担任统计运转时间的义务,假设用户将系统定义常数,假设用户将系统定义常数OS_TASK_STAT_ENOS_TASK_STAT_EN见文件见文件OS_CFG.HOS_CFG.H设为设为1 1,这个义务就会建,这个义务就会建立。一旦得到允许,统计义务每秒运转一次立。一旦得到允许,统计义务每秒运转一次OS_CORE.CO
10、S_CORE.C以计算当前的以计算当前的CPUCPU利用率。也即计利用率。也即计算运用程序运用了多少算运用程序运用了多少CPUCPU时间,用百分比表时间,用百分比表示,这个值放在一个有符号示,这个值放在一个有符号8 8位整数位整数OSCPUsageOSCPUsage中,准确度是中,准确度是1 1个百分点。个百分点。14第第2章章 uC/OS-II中的义务中的义务义务的根本概念义务的根本概念义务调度义务调度 义务的创建义务的创建义务就绪表义务就绪表C/OS-C/OS-的初始化和义务的启动的初始化和义务的启动义务控制块义务控制块义务堆栈义务堆栈 义务的挂起和恢复义务的挂起和恢复其它义务管理函数其它
11、义务管理函数152 义务堆栈义务堆栈l堆栈创建堆栈创建l堆栈增长方向堆栈增长方向l堆栈检验堆栈检验l堆栈的初始化堆栈的初始化162 义务堆栈义务堆栈-创建创建1堆栈创建堆栈创建堆栈是在存储器中按数据堆栈是在存储器中按数据“后进先出后进先出LIFO的的原那么组织的延续存储空间。为满足义务切换原那么组织的延续存储空间。为满足义务切换和呼应中断时保管和呼应中断时保管CPU存放器中的内容及义务存放器中的内容及义务私有数据的需求,每个义务都应该配有本人的私有数据的需求,每个义务都应该配有本人的堆栈。堆栈。uC/OS-II中堆栈的数据类型为为中堆栈的数据类型为为OS_STKtypedef unsigned
12、 int OS_STK )。用户可以静态分配堆栈空间用户可以静态分配堆栈空间(在编译的时候分配在编译的时候分配)也可以动态地分配堆栈空间也可以动态地分配堆栈空间(在运转的时候分在运转的时候分配配)。172 义务堆栈义务堆栈-创建创建动态分配堆栈动态分配堆栈OS_STK *pstk; pstk = (OS_STK *)malloc(stack_size);if (pstk != (OS_STK *)0) Create the task; 静态分配堆栈静态分配堆栈Static OS_STK MyTaskStackstack_size;或或OS_STK MyTaskStackstack_size;1
13、82 义务堆栈义务堆栈-增长方向增长方向2堆栈增长方向堆栈增长方向C/OS-支持的堆栈既可以向上增长支持的堆栈既可以向上增长(低地址往高地址低地址往高地址) 也可以向下增长。用户在调用也可以向下增长。用户在调用OSTaskCreate()或或OSTaskCreateExt()的时候必需知道堆栈是怎样增长的时候必需知道堆栈是怎样增长的,由于用户必需得把堆栈的栈顶传送给以上两个函的,由于用户必需得把堆栈的栈顶传送给以上两个函数,数,当堆栈向上增长时,将当堆栈向上增长时,将OS_STK_GROWTH置为置为0,需,需将堆栈的最低内存地址传送给义务创建函数。将堆栈的最低内存地址传送给义务创建函数。堆栈
14、向上增长堆栈向上增长OS_STK_GROWTH=0OS_STK TaskStackTASK_STACK_SIZE; OSTaskCreate(task, pdata, &TaskStack0, prio);192 义务堆栈义务堆栈-增长方向增长方向当堆栈向下增长时,置当堆栈向下增长时,置OS_STK_GROWTHOS_STK_GROWTH为为1 1,需求,需求将堆栈的最高内存地址传送给义务创建函数,将堆栈的最高内存地址传送给义务创建函数,堆栈向下增长堆栈向下增长OS_STK_GROWTH=1OS_STK TaskStackTASK_STACK_SIZE;OSTaskCreate(tas
15、k, pdata, &TaskStackTASK_STACK_SIZE-1, prio);20对两个方向增长的堆栈都提供支持的代码对两个方向增长的堆栈都提供支持的代码OS_STK TaskStackTASK_STACK_SIZE;#if OS_STK_GROWTH = 0 OSTaskCreate(task, pdata, &TaskStack0, prio);#elseOSTaskCreate(task, pdata, &TaskStackTASK_STACK_SIZE-1, prio);#endif2 义务堆栈义务堆栈-增长方向增长方向212 义务堆栈义务堆栈-检验
16、检验3堆栈检验,堆栈检验,OSTaskStkChk()有时候确定义务虚际所需的堆栈空间大小是很有时候确定义务虚际所需的堆栈空间大小是很有必要的。由于这样用户就可以防止为义务分有必要的。由于这样用户就可以防止为义务分配过多的堆栈空间,从而减少本人的运用程序配过多的堆栈空间,从而减少本人的运用程序代码所需的代码所需的RAM(内存内存)数量。数量。C/OS-提供的提供的OSTaskStkChk()函数可以为函数可以为用户提供这种有价值的信息。用户提供这种有价值的信息。 22Stack checkingOSTaskStkChk()OSTaskStkChk()顺着堆顺着堆栈的栈底开场计算空闲的栈的栈底开
17、场计算空闲的堆栈空间大小。义务所用堆栈空间大小。义务所用的堆栈的空间大小等于的堆栈的空间大小等于OSTaskCreateExt()OSTaskCreateExt()中定中定义的堆栈尺寸减去储存值义的堆栈尺寸减去储存值为为0 0的延续堆栈入口数目。的延续堆栈入口数目。 2 义务堆栈义务堆栈-检验检验232 义务堆栈义务堆栈-检验检验用户应该使本人的运用程序运转足够长的时间用户应该使本人的运用程序运转足够长的时间,并且阅历最坏的堆栈运用情况,这样才干得,并且阅历最坏的堆栈运用情况,这样才干得到正确的数值。一旦到正确的数值。一旦OSTaskStkChk()OSTaskStkChk()提供应用提供应用
18、户最坏情况下堆栈的需求,用户就可以重新设户最坏情况下堆栈的需求,用户就可以重新设置堆栈的最后容量了。为了顺应系统以后的晋置堆栈的最后容量了。为了顺应系统以后的晋级和扩展,用户应该多分配级和扩展,用户应该多分配1010100100的堆的堆栈空间。在堆栈检验中,用户所得到的只是一栈空间。在堆栈检验中,用户所得到的只是一个大致的堆栈运用情况,并不能阐明堆栈运用个大致的堆栈运用情况,并不能阐明堆栈运用的全部实践情况。的全部实践情况。242 义务堆栈义务堆栈-初始化初始化4义务堆栈的初始化义务堆栈的初始化当处置器启动一个义务时,处置器的各存放器总是需当处置器启动一个义务时,处置器的各存放器总是需求预置一
19、些与待运转义务相关的初始数据,如指向义求预置一些与待运转义务相关的初始数据,如指向义务代码的指针、指向义务堆栈的指针、程序形状字务代码的指针、指向义务堆栈的指针、程序形状字PSW等,这些初始数据从何而来?等,这些初始数据从何而来?系统在创建一个新义务时,应该把启动该义务所需的系统在创建一个新义务时,应该把启动该义务所需的初始数据指向义务代码的指针、指向义务堆栈的指初始数据指向义务代码的指针、指向义务堆栈的指针、程序形状字针、程序形状字PSW等事先存放到这个义务的堆等事先存放到这个义务的堆栈中。栈中。义务堆栈初始化函数义务堆栈初始化函数OSTaskStkInit()完成上述任务完成上述任务其在其
20、在OSTaskCreate()创建义务时被调用。创建义务时被调用。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, INT16U opt)#endif unsigned int *stk ; opt = opt; /* opt is not used
21、, prevent warning */ stk = (unsigned int *)ptos; /* Load stack pointer */OSTaskStkInit ()262 义务堆栈义务堆栈-初始化初始化/* build a context for the new task */ *-stk = (unsigned int) task; /* pc */ *-stk = (unsigned int) task; /* lr */ *-stk = 0; /* r12 */ *-stk = 0; /* r11 */ *-stk = 0; /* r10 */ *-stk = 0; /*
22、r9 */ *-stk = 0; /* r8 */ *-stk = 0; /* r7 */ *-stk = 0; /* r6 */ 272 义务堆栈义务堆栈-初始化初始化 *-stk = 0; /* r5 */ *-stk = 0; /* r4 */ *-stk = 0; /* r3 */ *-stk = 0; /* r2 */ *-stk = 0; /* r1 */ *-stk = (unsigned int) pdata; /* r0 */ *-stk = (SVC32MODE|0 x0); /* cpsr IRQ, FIQ disable*/ *-stk = (SVC32MODE|0 x
23、0); /* spsr IRQ, FIQ disable */ return (void *)stk);28第第2章章 uC/OS-II中的义务中的义务义务的根本概念义务的根本概念义务调度义务调度 义务的创建义务的创建义务就绪表义务就绪表C/OS-C/OS-的初始化和义务的启动的初始化和义务的启动义务控制块义务控制块义务堆栈义务堆栈 义务的挂起和恢复义务的挂起和恢复其它义务管理函数其它义务管理函数293 义务控制块义务控制块1义务控制块构造义务控制块构造2义务控制块链表义务控制块链表3义务控制块初始化义务控制块初始化301 义务控制块构造义务控制块构造l义务控制块义务控制块Task Contr
24、ol Blocks, OS_TCBsTask Control Blocks, OS_TCBs是是C/OS-C/OS-用来存储义务堆栈指针、当前形状、优先用来存储义务堆栈指针、当前形状、优先级及义务链表指针等一些与义务管理有关的属性的级及义务链表指针等一些与义务管理有关的属性的构造类型数据。构造类型数据。l义务控制块是义务的身份证,每个义务都有一个属义务控制块是义务的身份证,每个义务都有一个属于自已的义务控制块,当义务的于自已的义务控制块,当义务的CPUCPU运用权被剥夺时运用权被剥夺时,义务的属性,义务的属性/ /环境被保管在义务控制块中,而当义环境被保管在义务控制块中,而当义务重新得到务重新
25、得到CPUCPU运用权时,义务控制块能确保义务从运用权时,义务控制块能确保义务从当时被中断的那一点丝毫不差地继续执行。当时被中断的那一点丝毫不差地继续执行。lOS_TCBsOS_TCBs全部驻留在全部驻留在RAMRAM中。中。lOS_TCBs OS_TCBs 在义务建立的时候被初始化在义务建立的时候被初始化. .31任务控制块结构任务控制块结构typedef struct os_tcb OS_STK *OSTCBStkPtr;#if OS_TASK_CREATE_EXT_EN0 void *OSTCBExtPtr; OS_STK *OSTCBStkBottom; INT32U OSTCBStk
26、Size; INT16U OSTCBOpt; INT16U OSTCBId;#endif struct os_tcb *OSTCBNext; struct os_tcb *OSTCBPrev;#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN | OS_SEM_EN OS_EVENT *OSTCBEventPtr;#endif32#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN void *OSTCBMsg;#endif INT16U OSTCBDly; INT8U OSTCBStat; INT8U OS
27、TCBPrio; INT8U OSTCBX; INT8U OSTCBY; INT8U OSTCBBitX; INT8U OSTCBBitY;#if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq;#endif OS_TCB;33义务控制块构呵斥员义务控制块构呵斥员OSTCBStkPtrOSTCBStkPtr:指向当前义务堆栈栈顶的指针。:指向当前义务堆栈栈顶的指针。OSTCBExtPtrOSTCBExtPtr:指向用户定义的义务控制块扩展的:指向用户定义的义务控制块扩展的指针。用户可以扩展义务控制块而不用修正指针。用户可以扩展义务控制块而不用修正C/OS-C/OS-的源代
28、码的源代码, ,只在函数只在函数OstaskCreateExt()OstaskCreateExt()中运用中运用, ,运用时将运用时将OS_TASK_CREAT_ENOS_TASK_CREAT_EN设为设为1.1.OSTCBStkBottomOSTCBStkBottom:指向义务堆栈栈底的指针。递:指向义务堆栈栈底的指针。递减栈指针指向义务运用的栈空间的最低地址;递增减栈指针指向义务运用的栈空间的最低地址;递增型栈那么指向栈空间的最高地址。型栈那么指向栈空间的最高地址。OSTaskStkChk()OSTaskStkChk()可用其检验栈空间的运用情况以确定义务虚际需求可用其检验栈空间的运用情况
29、以确定义务虚际需求的栈空间。在的栈空间。在OSTaskCreateExt()OSTaskCreateExt()函数中运用,即函数中运用,即需将需将OS_TASK_CREATE_EXT_ENOS_TASK_CREATE_EXT_EN设为设为1 1。34义务控制块构呵斥员义务控制块构呵斥员OSTCBStkSizeOSTCBStkSize:堆栈尺寸。:堆栈尺寸。 栈中可包容的栈中可包容的指针元数目指针元数目/ /入口地址,不是用字节表示的入口地址,不是用字节表示的栈容量总数。例栈容量总数。例 设栈中可以保管设栈中可以保管1,0001,000个入个入口地址,那么:口地址,那么:假设每个地址宽度为假设每
30、个地址宽度为3232位,实践栈容量是位,实践栈容量是4,0004,000字节。字节。假设每个地址宽度为假设每个地址宽度为1616位,总栈容量是位,总栈容量是2,0002,000字节。字节。在在OSStakChk()OSStakChk()中调用,须将中调用,须将OS_TASK_CREAT_EXT_ENOS_TASK_CREAT_EXT_EN设为设为1 1。35义务控制块构呵斥员义务控制块构呵斥员OSTCBOpt OSTCBOpt :OSTaskCreateExt()OSTaskCreateExt()中的选项,中的选项,C/OS-C/OS-目前只支持目前只支持3 3个选择项:个选择项:OS_TAS
31、K_OTP_STK_CHK- STKOS_TASK_OTP_STK_CHK- STK检查检查OS_TASK_OPT_STK_CLR-OS_TASK_OPT_STK_CLR-清零清零OS_TASK_OPT_SAVE_FP-OS_TASK_OPT_SAVE_FP-浮点运算浮点运算36义务控制块构呵斥员义务控制块构呵斥员OSTCBId:存储义务的识别码。:存储义务的识别码。OSTCBNext和和OSTCBPrev:义务控制块:义务控制块OS_TCBs双向链接,将义务控制块链接起双向链接,将义务控制块链接起来。该链表在时钟节拍函数来。该链表在时钟节拍函数OSTimeTick()中中运用,用于刷新各个义
32、务的义务延迟变量运用,用于刷新各个义务的义务延迟变量OSTCBDly,每个义务的义务控制块,每个义务的义务控制块OS_TCB在义务建立的时候被链接到链表中在义务建立的时候被链接到链表中,在义务删除的时候从链表中被删除。双向,在义务删除的时候从链表中被删除。双向衔接的链表使得任一成员都能被快速插入或衔接的链表使得任一成员都能被快速插入或删除删除 37义务控制块构呵斥员义务控制块构呵斥员OSTCBEventPtr :指向事件控制块的指针:指向事件控制块的指针。OSTCBMsg:指向传给义务的音讯的指针:指向传给义务的音讯的指针。OSTCBDly:义务延时的时钟节拍数。当需:义务延时的时钟节拍数。当
33、需求把义务延时假设干时钟节拍时,或者需求求把义务延时假设干时钟节拍时,或者需求把义务挂起一段时间以等待某事件的发生时把义务挂起一段时间以等待某事件的发生时需求用到这个变量。假设这个变量为需求用到这个变量。假设这个变量为0,表,表示义务不延时,或者表示等待事件发生的时示义务不延时,或者表示等待事件发生的时间没有限制间没有限制 .38义务控制块构呵斥员义务控制块构呵斥员OSTCBStat:义务形状字:义务形状字,可取以下值:可取以下值:OS_STAT_RDY: 处于就绪形状处于就绪形状OS_STAT_SEM: 处于等待信号量形状处于等待信号量形状OS_STAT_MBOX:处于等待邮箱形状:处于等待
34、邮箱形状OS_STAT_Q: 处于等待音讯队列形状处于等待音讯队列形状OS_STAT_SUSPEND:处于被挂起形状:处于被挂起形状OS_STAT_MUTEX:处于等待互斥信号量:处于等待互斥信号量形状形状39义务控制块构呵斥员义务控制块构呵斥员OSTCBPrioOSTCBPrio:义务优先级。高优先级义务的:义务优先级。高优先级义务的O S T C B P r i oO S T C B P r i o 值 小 , 低 优 先 级 义 务 的值 小 , 低 优 先 级 义 务 的 OSTCBPrioOSTCBPrio值大值大OSTCBXOSTCBX、OSTCBYOSTCBY、OSTCBBitX
35、OSTCBBitX与与OSTCBBitYOSTCBBitY: 与优先级有关的量,用于加速义务进入就绪与优先级有关的量,用于加速义务进入就绪态的过程或进入等待事件发生形状的过程。态的过程或进入等待事件发生形状的过程。这些值是在义务建立时算好的,或者是在改这些值是在义务建立时算好的,或者是在改动义务优先级时算出的动义务优先级时算出的 。40OSTCBXOSTCBX、OSTCBYOSTCBY、OSTCBBitXOSTCBBitX与与OSTCBBitY OSTCBBitY 的计算的计算OSTCBYOSTCBY= priority 3;OSTCBBitY= OSMapTblpriority 3;OSTC
36、BX= priority & 0 x07;OSTCBBitX= OSMapTblpriority & 0 x07;义务控制块构呵斥员义务控制块构呵斥员41义务控制块构呵斥员义务控制块构呵斥员OSTCBDelReqOSTCBDelReq:一个布尔量,用于表示该义:一个布尔量,用于表示该义务能否需求删除。务能否需求删除。42 2) 2)义务控制块链表义务控制块链表义务控制块空闲链表:用于管理空闲义务的控义务控制块空闲链表:用于管理空闲义务的控制块的链表。制块的链表。系统初始化时,初始化函数系统初始化时,初始化函数OSInit()OSInit()将创建一将创建一个义务控制块空闲缓冲池
37、,其中有一定数量的个义务控制块空闲缓冲池,其中有一定数量的空义务控制块,并将其链接成一个单向链表,空义务控制块,并将其链接成一个单向链表,即空闲链表,并用即空闲链表,并用OSTCBFreeList OSTCBFreeList 指向表头。指向表头。当建立一个义务时,即将空闲链表表头指针当建立一个义务时,即将空闲链表表头指针OSTCBFreeListOSTCBFreeList指向的空义务控制块赋给该义指向的空义务控制块赋给该义务,然后将务,然后将OSTCBFreeListOSTCBFreeList指向链表中的下一指向链表中的下一个空义务控制块个空义务控制块432)2)义务控制块链表义务控制块链表义
38、务控制块空闲链表义务控制块空闲链表(List of free OS_TCBs)442)2)义务控制块链表义务控制块链表义务控制块运用链表义务控制块运用链表(双向双向)运用链表用于管理已建立义务的控制块453)义务控制块初始化义务控制块初始化义务控制块初始化函数义务控制块初始化函数OSTCBInit()做三件事做三件事:1、从空义务控制块链表中获取一个义务控制、从空义务控制块链表中获取一个义务控制块;块;2、用义务的属性值对义务控制块各个成员进、用义务的属性值对义务控制块各个成员进展赋值;展赋值;3、把这个义务控制块链入到义务控制块运用、把这个义务控制块链入到义务控制块运用链表的头部。链表的头部
39、。463)义务控制块初始化义务控制块初始化-OSTCBInit()INT8U OSTCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT16U stk_size, void *pext, INT16U opt) OS_TCB *ptcb; OS_ENTER_CRITICAL(); ptcb = OSTCBFreeList; (1)/从空闲的OS_TCB缓冲池中获得一个OS_TCB ptcbptcb = OSTCBFreeListOSTCBFreeList= ptcb-OSTCBNextptcb47 if (ptcb !=
40、(OS_TCB *)0) (2) OSTCBFreeList = ptcb-OSTCBNext; OS_EXIT_CRITICAL(); ptcb-OSTCBStkPtr = ptos; (3) ptcb-OSTCBPrio = (INT8U)prio; ptcb-OSTCBStat = OS_STAT_RDY; ptcb-OSTCBDly = 0;/假设OS_TCB池中有空闲的OS_TCB,它就被初始化了 /一旦OS_TCB被分配,该义务的创建者就曾经完全拥有它了,不担忧被同时建立的另一个义务夺取,故可以重新开中断,并继续初始化OS_TCB的数据单元。3)义务控制块初始化义务控制块初始化-O
41、STCBInit()48#if OS_TASK_CREATE_EXT_EN ptcb-OSTCBExtPtr = pext; ptcb-OSTCBStkSize = stk_size; ptcb-OSTCBStkBottom = pbos; ptcb-OSTCBOpt = opt; ptcb-OSTCBId = id;3)义务控制块初始化义务控制块初始化-OSTCBInit()49#else pext = pext; stk_size = stk_size; pbos = pbos; opt = opt; id = id;#endif #if OS_TASK_DEL_EN ptcb-OSTCB
42、DelReq = OS_NO_ERR;#endif 3)义务控制块初始化义务控制块初始化-OSTCBInit()50 ptcb-OSTCBY = prio 3; ptcb-OSTCBBitY = OSMapTblptcb-OSTCBY; ptcb-OSTCBX = prio & 0 x07; ptcb-OSTCBBitX = OSMapTblptcb-OSTCBX; #if OS_MBOX_EN |(OS_Q_EN & (OS_MAX_QS = 2)| OS_SEM_EN ptcb-OSTCBEventPtr = (OS_EVENT *)0;#endif3)义务控制块初始化义务
43、控制块初始化-OSTCBInit()51#if OS_MBOX_EN | (OS_Q_EN & (OS_MAX_QS = 2) ptcb-OSTCBMsg = (void *)0;#endif OS_ENTER_CRITICAL(); (4) OSTCBPrioTblprio = ptcb; (5) ptcb-OSTCBNext = OSTCBList; ptcb-OSTCBPrev = (OS_TCB *)0; if (OSTCBList != (OS_TCB *)0) OSTCBList-OSTCBPrev = ptcb; /将OS_TCB插入到已建立义务的OS_TCB的双向链表中
44、,该双向链表开场于OSTCBList,而一个新义务的OS_TCB经常被插入到链表的表头 3)义务控制块初始化义务控制块初始化-OSTCBInit()OSTCBList = ptcb52 OSRdyGrp |= ptcb-OSTCBBitY; (6) OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; OS_EXIT_CRITICAL(); return (OS_NO_ERR); else OS_EXIT_CRITICAL(); return (OS_NO_MORE_TCB); /使义务进入就绪态/前往一个代码阐明OS_TCB曾经被分配和初始化了 3)义务控制块初始化义
45、务控制块初始化-OSTCBInit()53第第2章章 uC/OS-II中的义务中的义务义务的根本概念义务的根本概念义务调度义务调度 义务的创建义务的创建义务就绪表义务就绪表C/OS-C/OS-的初始化和义务的启动的初始化和义务的启动义务控制块义务控制块义务堆栈义务堆栈 义务的挂起和恢复义务的挂起和恢复其它义务管理函数其它义务管理函数54 4 义务就绪表义务就绪表1义务就绪表构造义务就绪表构造2义务就绪表操作义务就绪表操作使义务进入就绪态使义务进入就绪态使义务脱离就绪态使义务脱离就绪态找出进入就绪态的优先级最高的义务找出进入就绪态的优先级最高的义务551义务就绪表构造就绪表是保管义务就绪标志的表
46、就绪表是保管义务就绪标志的表, ,表中的每一位对应一个义表中的每一位对应一个义务务, ,某义务处于就绪态时某义务处于就绪态时, ,表中相应位置表中相应位置1.1.就绪表有两个变就绪表有两个变量:量:OSRdyGrpOSRdyGrp和和OSRdyTblOSRdyTblOSRdyGrp1207654300XXXYYY义务优先级20176543108915 1413 1212 1118161723 222121 20 1926242531 3029 28 2734323339 3837 36 3542404147 4645 44 4350484955 5453 52 5158565763 6261
47、60 5901234567OSRdyTbl7XY优先级最低义务空闲义务优先级最高义务义务优先级号562 义务就绪态表操作义务就绪态表操作 OSMapTbl的值的值 000000001100000010200000100300001000400010000500100000601000000IndexBit Mask (Binary)710000000OSRdyGrp|= OSMapTblprio 3;OSRdyTblprio3|=OSMapTblprio&0 x07; 使使 义务进入就绪态义务进入就绪态572 义务就绪态表操作义务就绪态表操作l例 1 使优先级为12的义务进入就绪形状,
48、12=1100b, lOSRdyGrp|= OSMapTblprio 3l |= OSMapTbl1bl |= 00000010lOSRdyTblprio 3|= OSMapTblprio & 0 x07l |= OSMapTbl100bl |= OSMapTbl4l |= 00010000l即OSRdyGrp的第1位置1,OSRdyTbl1的第4位置1OSMapTbl的的值值000000001100000010200000100300001000400010000500100000601000000IndexBit Mask (Binary)710000000582 义务就绪态表操作
49、义务就绪态表操作l例2 使优先级为21的义务进入就绪态,21=10 101b,lOSRdyGrp|= OSMapTblprio 3l |= OSMapTbl10b= OSMapTbl2l |= 00000100lOSRdyTblprio 3|= OSMapTblprio & 0 x07l |= OSMapTbl101bl |= OSMapTbl5l |= 00100000l即OSRdyGrp的第2位置1,OSRdyTbl2的第5位置1OSMapTbl的值的值000000001100000010200000100300001000400010000500100000601000000In
50、dexBit Mask (Binary)710000000592 义务就绪态表操作义务就绪态表操作使义务脱离就绪态使义务脱离就绪态将就绪义务表数组将就绪义务表数组OSRdyTblprio3中中相应元素的相应位清零,且当相应元素的相应位清零,且当OSRdyTblprio3中的一切位都为零时中的一切位都为零时,即全组义务中没有一个进入就绪态时,即全组义务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。的相应位才为零。例例 使优先级为使优先级为12的义务脱离就绪表的义务脱离就绪表 If(OSRdyTbl1&= 0 x10=0) OSRdyGrp&= 0 x02;If(OSRd
51、yTblprio3&= OSMapTblprio & 0 x07)=0) OSRdyGrp&= OSMapTblprio3;OSRdyTblprio3|=OSMapTblprio&0 x07OSRdyGrp|= OSMapTblprio 360找出进入就绪态的优先级最高的义务找出进入就绪态的优先级最高的义务y= OSUnMapTblOSRdyGrp;x= OSUnMapTblOSRdyTbly;prio=(y 3)+ x;2 义务就绪态表操作义务就绪态表操作20176543108915 1413 12 1118161723 2221 20 1926242531
52、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例61INT8U const OSUnMapTbl = 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0 x00 to 0 x0F 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0 x10 to 0 x1F 5, 0, 1, 0, 2, 0,
53、1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0 x20 to 0 x2F 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0 x30 to 0 x3F 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0 x40 to 0 x4F 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0 x50 to 0 x5F 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0 x60 to 0 x6
54、F 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0 x70 to 0 x7F 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0 x80 to 0 x8F 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0 x90 to 0 x9F 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0 xA0 to 0 xAF 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0,
55、1, 0, /0 xB0 to 0 xBF 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0 xC0 to 0 xCF 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0 xD0 to 0 xDF 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0 xE0 to 0 xEF 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 /0 xF0 to 0 xFF;优先级断定表622 义务就绪态表操作义务就绪态
56、表操作l例1 知OSRdyGrp=01101000b, OSRdyTbl3=11100100b,找出进入就绪态的优先级最高的义务lOSRdyGrp=01101000b=0 x68,查OSUnMapTbl0 x68得到的值是3,y=3。lOSRdyTbl3=11100100b=0 xE4,那么OSUnMapTbl0 xE4的值是2,x=2。lPrio= (y 3) + x=3*8+2=26。l查义务控制块优先级表数组OSTCBPrioTbl26,即可得到指向该义务的义务控制块OS_TCB的指针.632 义务就绪态表操作义务就绪态表操作l例2 知OSRdyGrp=00100100b, OSRdyT
57、bl2=00010010b,找出进入就绪态的优先级最高的义务ly = OSUnMapTblOSRdyGrp= OSUnMapTbl100100b = OSUnMapTbl0 x24=2lx = OSUnMapTblOSRdyTbly= OSUnMapTblOSRdyTbl2l =OSUnMapTbl00010010b l =OSUnMapTbl0 x12=1lprio = (y 3) + x =(23)+1=17 64第第2章章 uC/OS-II中的义务中的义务义务的根本概念义务的根本概念义务调度义务调度 义务的创建义务的创建义务就绪表义务就绪表C/OS-C/OS-的初始化和义务的启动的初始化
58、和义务的启动义务控制块义务控制块义务堆栈义务堆栈 义务的挂起和恢复义务的挂起和恢复其它义务管理函数其它义务管理函数655 义务调度义务调度l义务调度器义务调度器l义务切换义务切换l给调度器上锁和开锁给调度器上锁和开锁661)义务调度器义务调度器l 义务调度Task SchedulinglC/OS-总是运转进入就绪态义务中优先级最高的义务;l调度器的任务是确定哪个义务优先级最高以及下面该哪个义务运转了;l义务级的调度由函数OSSched()完成,中断级的调度由另一个函数OSIntExt()完成的。 67void OSSched (void) INT8U y; OS_ENTER_CRITICAL(
59、); if (OSLockNesting | OSIntNesting) = 0) (1) y = OSUnMapTblOSRdyGrp; (2) OSPrioHighRdy = (INT8U)(y OSTCBStkPtr = SP;/SPOSTCBCur-OSTCBStkPtr = SP;/SP入控制块入控制块 OSTCBCur = OSTCBHighRdy;OSTCBCur = OSTCBHighRdy; SP = OSTCBHighRdy -OSTCBSTKPtr; SP = OSTCBHighRdy -OSTCBSTKPtr; 将将R4,R3,R2R4,R3,R2及及R1R1重新堆栈中
60、弹出;重新堆栈中弹出; 保保管管当当前前恢恢复复即即将将注:设处置器只需4个存放器70调用OS_TASK_SW()前的数据构造低优先级义务 OS_TCBOSTCBCur存贮器低地址OSTCBHighRdy存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSWCPU存贮器低地址存贮器高地址高优先级义务 OS_TCBPSWPCR1R2R3R471保管当前CPU存放器的值PSWPCR1R2R3R4存贮器低地址存贮器高地址高优先级义务 OS_TCBOSTCBHighRdy低优先级义务 OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向(2)CPU(1)SPR1R2R3R4PCPSWVoid Void OSCtxSwOSCtxSw(void)(void) 将将R1,R2,R3R1,R2,R3及及R
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中国智能机器人消防机器人行业市场现状供需分析及投资评估规划分析研究报告
- 2026中国矿产资源综合利用技术发展趋势与政策支持报告
- 2026中国冶金行业市场现状供需分析及产能评估规划研究报告
- 2026中国新型建筑材料行业市场现状竞争分析及未来规划分析研究报告
- 2026时尚设计行业市场发展现状与发展趋势及投资前景预测报告
- 2026汽车零部件行业市场分析及新能源车辆配套趋势
- 2026中国自动驾驶感知系统技术突破与商业化进程评估
- 2026中国洗衣粉香气定制化服务商业模式与市场接受度测试报告
- 2026 年世界粮食日珍惜粮食杜绝浪费课件
- 2026天津建行面试题目及答案
- 2026年新疆生产建设兵团事业单位考试真题及答案
- 2024版电网典型设计10kV配电站房分册
- 家畜生态学 绪论 第一章家畜与环境的关系课件
- 耵聍栓塞的护理
- GB/T 45356-2025无压埋地排污、排水用聚丙烯(PP)管道系统
- 《运动治疗技术》课件-pnf技术
- 23J916-1 住宅排气道(一)
- 华润电力招聘测评试题
- DL∕T 2447-2021 水电站防水淹厂房安全检查技术规程
- 中药热奄包疗法操作评分标准
- 电力线路安装合同范本
评论
0/150
提交评论