任务状态与变迁 口任务会在不同的状态之间进行转换,即 任务状态的变迁 对于处于就绪状态的任务,获得CPU后,就 处于执行状态 处于执行状态的任务如果被高优先级任务所 抢占,任务又会回到就绪状态。 令处于执行状态的任务如果需要等待资源,任 务会被切换到等待状态。 对处于等待状态的任务,如果需要的资源得 到满足,就会转换为就绪状态,等待被调度 执行。 行态 需要资源 被高优先级任 获得cPU 务抢占或超时 就绪态 获得资源 等待态 任务状态变迁
16 任务状态与变迁 任务会在不同的状态之间进行转换,即 任务状态的变迁 对于处于就绪状态的任务,获得CPU后,就 处于执行状态。 处于执行状态的任务如果被高优先级任务所 抢占,任务又会回到就绪状态。 处于执行状态的任务如果需要等待资源,任 务会被切换到等待状态。 对处于等待状态的任务,如果需要的资源得 到满足,就会转换为就绪状态,等待被调度 执行。 就绪态 运行态 等待态 获得CPU 被高优先级任 务抢占或超时 获得资源 需要资源 任务状态变迁
任务1 任务2 任务3 调度 程序 LLLLLL,LL 行 N等待 三个任务进行状态转换的过程 包含三个任务和一个调度程序。调度程序用来确定下一个需要投入运 行的任务,因此调度程序本身也需要占用一定的处理时 WAITING OSTaskDel() yR参me() oSTineDlyt aakCreateExt assart( DORMAN READY askDel Task is Pree OsTaskDel() Task states and transition of ucos
17 任务1 任务2 任务3 调度 程序 0 5 10 15 20 25 30 35 40 45 50 运行 等待 就绪 三个任务进行状态转换的过程 包含三个任务和一个调度程序。调度程序用来确定下一个需要投入运 行的任务,因此调度程序本身也需要占用一定的处理时间。 Task states and transition of Task states and transition of ucOS
空闲任务 Owhich is executed when none of the other tasks is ready to U The idle task is always set to the lowest p UThe idle task can never be deleted by application software. /* Prevent compiler warning for not using ' pdata*/ pdata pdata; for (:i S ENTER CRITICAL O oSIdlectr++ OS EXIT CRITICAL O; / Call user definable HOOK OSIdle ctr is used by the statistics task to determine how much CPU time (in percentage) is actually being d by the application software. Idel Task of ucos 18
18 空闲任务 which is executed when none of the other tasks is ready to run. The idle task is always set to the lowest priority. The idle task can never be deleted by application software. void OS_TaskIdle (void *pdata) { /* Prevent compiler warning for not using 'pdata‘ */ pdata = pdata; for (;;) { OS_ENTER_CRITICAL(); OSIdleCtr++; OS_EXIT_CRITICAL(); /* Call user definable HOOK */ OSTaskIdleHook(); } } Idel Task of Task of ucOS OSIdleCtr OSIdleCtr is used by the statistics task to determine how is used by the statistics task to determine how much CPU time (in percentage) is actually being tage) is actually being consumed by the application software. consumed by the application software
任务控制块 口任务管理是通过对任务控制块( task control block,TCB)的操作来实现的 口任务控制块是包含任务相关信息的数据结构 包含了任务执行过程中所需要的所有信息 口任务控制块大都包括以下信息 任务的名字 令任务执行的起始地址 任务的优先级 任务的状态 任务的硬件上下文(堆栈指针、PC和寄存器等)、 任务的队列指针等内容 task name task status task priority task context registers and flags of CPU) 任务控制块示意图
19 任务控制块 任务管理是通过对任务控制块(task control block,TCB)的操作来实现的。 任务控制块是包含任务相关信息的数据结构 包含了任务执行过程中所需要的所有信息。 任务控制块大都包括以下信息: 任务的名字 任务执行的起始地址 任务的优先级 任务的状态 任务的硬件上下文(堆栈指针、PC和寄存器等)、 任务的队列指针等内容 task name task ID task status task priority task context(registers and flags of CPU) … task name task ID task status task priority task context(registers and flags of CPU) … 任务控制块示意图
任务控制块 口为节约内存,任务数量通常需要进行预先 配置 ◆按照配置的任务数量初始化任务控制块, 个任务对应一个初始的任务控制块,形成一个 空闲任务控制块链。 口在任务创建时,实时内核从空闲任务控制 块链中为任务分配一个任务控制块。 心随后对任务的操作,都是基于对应的任务控 制块来进行的 今当任务被删除后,对应的任务控制块又会被 实时内核回收到空闲任务控制块链 TCB of ucOS typedef struct os tcb i sTCBStkPtr, / Pointer to current top ofstack ⊥ E Os TASK CREATE EXT EN>0 B extension stkB。ttom; of task stack (in number of stack elaments) s Task options as passed by oSTaskcreateExt () INT16U OSTCBId s tcb *OsTCBNext:/* Pointer to naxt TCB in the TcB list ev:/* Pointer to previous TCB Wif ((os Q EN>)&6(OS MAX Qs>0))1 1(Os MBOx EN>O)II (OS SEM EN>O)I I(OS MUTEX EN>O) Wif ((os Q EN 0)45 (os MAX Qs >0))II (os MBOx EN>o) ved from osMboxPosto or osQPosto*/
20 任务控制块 为节约内存,任务数量通常需要进行预先 配置 按照配置的任务数量初始化任务控制块,一 个任务对应一个初始的任务控制块,形成一个 空闲任务控制块链。 在任务创建时,实时内核从空闲任务控制 块链中为任务分配一个任务控制块。 随后对任务的操作,都是基于对应的任务控 制块来进行的。 当任务被删除后,对应的任务控制块又会被 实时内核回收到空闲任务控制块链。 typedef struct os_tcb { OS_STK *OSTCBStkPtr; /* Pointer to current top of stack */ #if OS_TASK_CREATE_EXT_EN > 0 void *OSTCBExtPtr; /* Pointer to user definable data for TCB extension */ OS_STK *OSTCBStkBottom; /* Pointer to bottom of stack */ INT32U OSTCBStkSize; /* Size of task stack (in number of stack elements) */ INT16U OSTCBOpt; /* Task options as passed by OSTaskCreateExt() */ INT16U OSTCBId; /* Task ID (0..65535) */ #endif struct os_tcb *OSTCBNext;/* Pointer to next TCB in the TCB list */ struct os_tcb *OSTCBPrev;/* Pointer to previous TCB in the TCB list */ #if ((OS_Q_EN>0)&&(OS_MAX_QS>0))||(OS_MBOX_EN>0)||(OS_SEM_EN>0)||(OS_MUTEX_EN>0) OS_EVENT *OSTCBEventPtr; /* Pointer to event control block */ #endif #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) void *OSTCBMsg; /* Message received from OSMboxPost() or OSQPost()*/ #endif TCB of ucOS