内核结构
!–[if !supportLists]–>1, !–[endif]–>临界区,OS_ENTER_CRITICAL和OS_EXIT_CRITICAL
为了处理临界区代码,有必要关中止,等处理完毕后,再开中止。关中止能够防止其他使命或中止进入临界区代码。uC/OS-II界说了这两个宏来完成,但留意一条:调用uC/OS-II功用函数时,中止应该总是开着的。
1)当OS_CRITICAL_METHOD= = 1时,简略完成如下:
#defineOS_ENTER_CRITICAL()disable_int()
#defineOS_EXIT_CRITICAL()enable_int()
但这样有一个问题,假如制止中止的情况下调用uC/OS-II功用函数,那么从功用函数回来时,中止或许变成答应的了,而实际上仍是期望是制止的。
2)当OS_CRITICAL_METHOD= = 2时,完成如下:
#defineOS_ENTER_CRITICAL()
asm(“PUSHPSW”);
asm(“DI”);
#defineOS_EXIT_CRITICAL()
asm(“POPPSW”);
履行OS_ENTER_CRITICAL()时,先将中止状况保存到仓库,然后关中止;履行OS_EXIT_CRITICAL()时,再从仓库中康复本来的中止开/关状况。这种办法不会改动中止状况,防止前面的问题。
3)当OS_CRITICAL_METHOD= = 3时,完成如下:
#defineOS_ENTER_CRITICAL()
cpu_sr=get_processor_psw();
disable_interrupts();
#defineOS_EXIT_CRITICAL()
set_processor_psw(cpu_sr);
将处理器状况字保存在局部变量中。
!–[if !supportLists]–>2, !–[endif]–>使命是一个无限循环,回来类型为void,参数void*,用于传数据给使命。使命能够调用OSTaskDel(OS_PRIO_SELF)进行自我删去。使命有5种状况:
!–[if !supportLists]–>1) !–[endif]–>睡觉态。使命驻留在程序空间(ROM或RAM),还未交给uC/OS-II来办理。
!–[if !supportLists]–>2) !–[endif]–>安排妥当态。OSTaskCreate()或OSTaskCreateExt()来创立一个使命后,就进入安排妥当态。使命能够调用OSTaskDel回来到睡觉态,或调用该函数让另一个使命进入睡觉态。
!–[if !supportLists]–>3) !–[endif]–>运转态。OSStart()发动多使命运转。它只在发动时调用一次,运转安排妥当列表中优先级最高的使命。安排妥当的使命只有当所以优先级比其高的使命转为等候状况,或者是被删去了,才干进入运转态。
!–[if !supportLists]–>4) !–[endif]–>等候状况。正在运转的使命能够调用OSTimeDly()或OSTimeDlyHMSM()将本身推迟一段时刻进入等候状况,一直到推迟时刻到来。这两个函数会强制履行使命切换,挑选下一个优先级最高的使命运转。等候时刻曩昔后,体系服务函数OSTimeTick()使推迟了的使命进入安排妥当态。
正在运转的使命也或许需求等候某一事情的产生,能够调用:OSFlagPend(),OSSemPend(),OSMutexPend(),OSMboxPend(),OSQPend()等函数。若某事情未产生,则使命进入等候状况,直到事情产生。当使命因等候事情被挂起时,下一个优先级最高的使命得到CPU。当事情产生了或超时,被挂起的使命进入安排妥当态。事情产生的陈述或许来自另一个使命或中止服务子程序。
!–[if !supportLists]–>5) !–[endif]–>中止服务态 。被中止的使命进入中止服务态,然后被挂起,中止服务子程序得到CPU,后者或许陈述一个或多个事情产生,然后使一个或多个使命进入安排妥当态。因而从中止服务子程序回来前,uC/OS-II要判别被中止的使命的优先级和安排妥当列表中其他使命的优先级凹凸,挑选最高的使命进入运转态。
!–[if !supportLists]–>6) !–[endif]–>当所以使命都在等候事情产生或等候推迟的时刻结束时,uC/OS-II运转OSTaskIdle()使命。
!–[if !supportLists]–>3, !–[endif]–>使命操控块(OS_TCB)
树立一个使命时,一个OS_TCB就被赋值。当使命的CPU被掠夺时,用它来保存使命的状况,当使命重新得到CPU时,它也能确保使命从其时被中止的那一点持续履行。OS_TCB悉数驻留在RAM中。
typedefstructos_tcb
{
OS_STK*OSTCBStkPtr;/*指向当前使命仓库栈顶的指针*/
#ifOS_TASK_CREATE_EXT_EN>0
void*OSTCBExtPtr;/*指向用户界说的使命操控块扩展*/
OS_STK*OSTCBStkBottom;/*指向栈底的指针*/
INT32UOSTCBStkSize;/*栈中可包容的元素数目(
uC/OS-II答应每个使命的仓库容量恣意,)*/
INT16UOSTCBOpt;/*传给OSTaskCreateExt()的使命挑选项*/
INT16UOSTCBId;/*TaskID(0..65535)*/
#endif
structos_tcb*OSTCBNext;/*TCB列表中指向下一个TCB的指针*/
structos_tcb*OSTCBPrev;/*TCB列表中指向上一个TCB的指针*/
#if((OS_Q_EN>0)(OS_MAX_QS>0))||(OS_MBOX_EN>0)||(OS_SEM_EN>0)||(OS_MUTEX_EN>0)
OS_EVENT*OSTCBEventPtr;/*指向事情操控块的指针*/
#endif
#if((OS_Q_EN>0)(OS_MAX_QS>0))||(OS_MBOX_EN>0)
void*OSTCBMsg;/*指向传递给使命的音讯的指针,音讯来自OSMboxPost()orOSQPost()*/
#endif
#if(OS_VERSION>=251)(OS_FLAG_EN>0)(OS_MAX_FLAGS>0)
#ifOS_TASK_DEL_EN>0
OS_FLAG_NODE*OSTCBFlagNode;/*指向事情标志节点的指针*/
#endif
OS_FLAGSOSTCBFlagsRdy;/*使使命进入安排妥当态的事情标志*/
#endif
INT16UOSTCBDly;/*让使命延时若干节拍或把使命挂起一段时刻等候某一事情产生时运用的计时变量*/
INT8UOSTCBStat;/*使命状况*/
INT8UOSTCBPrio;/*使命优先级(0==highest,63==lowest)*/
//下面四个变量用于加快使命进入安排妥当态或进入等候事情产生状况的进程,算法比较奇妙
INT8UOSTCBX;/*Bitpositioningroupcorrespondingtotaskpriority(0..7)*/
INT8UOSTCBY;/*Indexintoreadytablecorrespondingtotaskpriority