空任务列表 所有的任务控制块都被放置在任务控制块列表数 组OSTCBTbI中 系统初始化时,所有任务控制块被链接成空任务控制 块的单向链表 任务建立后,.空任务控制块指针OSTCBFreeList指向 的任务控制块就赋给了该任务,然后OSTCBFreeList 的值调整为指向链表中的下一个空任务控制块。 OSTCBTbI[OS_MAX_TASKS+OS_N_SYS_TASK OSTCBTbI[O] OSTCBTbI[1] OSTCBTbI[2] OSTCBFreeList-OSTCBNext OSTCBNext OSTCBNext -0 Figure 3-2,List of free OS_TCBs llxx@ustc.edu.cn 11/90
llxx@ustc.edu.cn 11/90 空任务列表 • 所有的任务控制块都被放置在任务控制块列表数 组OSTCBTbl[]中 – 系统初始化时,所有任务控制块被链接成空任务控制 块的单向链表 – 任务建立后,空任务控制块指针OSTCBFreeList指向 的任务控制块就赋给了该任务,然后OSTCBFreeList 的值调整为指向链表中的下一个空任务控制块。 UnRegistered
uC/0S-I川任务控制块 typedef struct os tcb OS STK *OSTCBStkPtr; 指向当前任务栈顶的指针 #if OS TASK CREATE EXT EN>0 void *OSTCBExtPtr; 指向用户定义的任务控制块扩展 OS STK *OSTCBStkBottom; 指向任务栈底的指针 INT32U OSTCBStkSize; 栈中可容纳的指针元数 INT16U OSTCBOpt; 把选择项传给0 STaskCreateExt() INT16U OSTCBId; 任务的识别码,保留未用 #endif struct os tcb *OSTCBNext; 任务控制块OS_TCBs的双向链接 struct os tcb *OSTCBPrev; #if OS EVENT EN OS EVENT *OSTCBEventPtr; /*指向事件控制块*/ #endif llxx(@ustc.eau.cn 12I9U
llxx@ustc.edu.cn 12/90 typedef struct os_tcb { OS_STK *OSTCBStkPtr; 指向当前任务栈顶的指针 #if OS_TASK_CREATE_EXT_EN>0 void *OSTCBExtPtr; 指向用户定义的任务控制块扩展 OS_STK *OSTCBStkBottom; 指向任务栈底的指针 INT32U OSTCBStkSize; 栈中可容纳的指针元数 INT16U OSTCBOpt; 把“选择项”传给OSTaskCreateExt() INT16U OSTCBId; 任务的识别码,保留未用 #endif struct os_tcb *OSTCBNext; 任务控制块OS_TCBs的双向链接 struct os_tcb *OSTCBPrev; #if OS_EVENT_EN OS_EVENT *OSTCBEventPtr; /* 指向事件控制块*/ #endif µC/OS-II任务控制块 UnRegistered
#if ((OS Q EN>0)&&(OS MAX QS 0))I (OS MBOX EN >0) void *OSTCBMsg; 指向传给任务的消息的指针 #endif INT16U OSTCBDly; 任务延时若干时钟节拍 INT8U OSTCBStat; 任务的状态字。0,就绪 INT8U OSTCBPrio; 任务优先级 INT8U OSTCBX; 用于加速任务进入就绪态的过程 INT8U OSTCBY; 或进入等待事件发生状态的过程 INT8U OSTCBBitX; INT8U OSTCBBitY; #if OS TASK DEL EN BOOLEAN OSTCBDelReq; 表示该任务是否需要删除自身 #endif }OS TCB; llxx@ustc.edu.cn 13/90
llxx@ustc.edu.cn 13/90 #if ((OS_Q_EN>0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN >0) void *OSTCBMsg; 指向传给任务的消息的指针 #endif INT16U OSTCBDly; 任务延时若干时钟节拍 INT8U OSTCBStat; 任务的状态字。0,就绪 INT8U OSTCBPrio; 任务优先级 INT8U OSTCBX; 用于加速任务进入就绪态的过程 INT8U OSTCBY; 或进入等待事件发生状态的过程 INT8U OSTCBBitX; INT8U OSTCBBitY; #if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq; 表示该任务是否需要删除自身 #endif } OS_TCB; UnRegistered
任务控制块初始化函数OS TCBInit() STC 函数0 staskCreate()、OstaskCreateExt()中调用 INT8U OS TCBInit INT8U prio,OS STK *ptos,OS STK *pbos, INT16U id, INT32U stk size,void *pext, INT16U opt) OS ENTER CRITICALO; ptcb=OSTCBFreeList; *Get a free TCB from the free TCB list * if(ptcb!=(OS TCB *)0){ OSTCBFreeList ptcb->OSTCBNext;j /Update pointer to free TCB list */ OS EXIT_CRITICALO; ptcb->OSTCBStkPtr ptos; /Load Stack pointer in TCB */ ptcb->OSTCBPrio =(INT8U)prio; /Load task priority into TCB */ ptcb->OSTCBStat =OS STAT RDY; /Task is ready to run */ ptcb->OSTCBDly =0; } llxx@ustc.edu.cn 14/90
llxx@ustc.edu.cn 14/90 任务控制块初始化函数OS_TCBInit() INT8U OS_TCBInit ( INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt ) { OS_ENTER_CRITICAL(); ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */ if (ptcb != (OS_TCB *)0) { OSTCBFreeList = ptcb->OSTCBNext; } /* Update pointer to free TCB list */ OS_EXIT_CRITICAL(); ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */ ptcb->OSTCBPrio = (INT8U)prio; /* Load task priority into TCB */ ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */ ptcb->OSTCBDly = 0; …… } 函数OstaskCreate OstaskCreate()、OstaskCreateExt OstaskCreateExt()中调用 UnRegistered
uC/OS中的任务(编程模型 STC uC/0S-II2.5版本支持64个任务,每个任务一个 特定的优先级。优先级越高,数字越小。 -系统占用了8个任务,保留优先级为0、1、2、3 OS-L0WEST-PRI0-3、OS_L0WES-PRI0-2、 OS_LOWEST_PRIO-1 OS_LOWEST_PRIO-0 典型的任务是一个无限循环。 void mytask (void *pdata) { for (;; do something; waiting;:◇/挂起,os调度器将调度其他任务执行! do something; } llxx@ustc.edu.cn 15/90
llxx@ustc.edu.cn 15/90 mC/OS中的任务(编程模型) • mC/OS –II 2.5版本支持64个任务,每个任务一个 特定的优先级。优先级越高,数字越小。 – 系统占用了8个任务,保留优先级为0、1、2、3 – OS_LOWEST_PRIO-3、 OS_LOWEST_PRIO-2、 OS_LOWEST_PRIO-1、 OS_LOWEST_PRIO-0。 • 典型的任务是一个无限循环。 void mytask(void *pdata) { for (;;) { do something; waiting; //挂起,os调度器将调度其他任务执行! do something; } } UnRegistered