http://blog.csdn.net/suiyuan19840208/article/details/15337949
2013
1:ucos任務(wù)的組成
A:任務(wù)處理函數(shù)
B: 任務(wù)堆棧
C:任務(wù)控制塊
其可以使用下面的圖來表示任務(wù)的構(gòu)成,
PC的值總是帶藥執(zhí)行的指令的地址,反映了一個程序的運行進度。
具有私有空間的任務(wù)叫進程,沒有私有空間的任務(wù)叫:線程,ucos中的所有任務(wù)都是線程。
ucos中使用任務(wù)鏈表來記錄系統(tǒng)的創(chuàng)建的任務(wù),其結(jié)構(gòu)如下:
2:ucos中線程的結(jié)構(gòu)
main是一個程序的入口,而ucos中的任務(wù)什么時間運行,合適中斷是由ucos中的任務(wù)調(diào)度程序來完成。ucos應(yīng)用程序的通用結(jié)構(gòu)如下:
其中OSTaskCreate()用來創(chuàng)建ucos中的線程,OSStart()用來啟動線程,現(xiàn)在啟動之后,線程的調(diào)度由操作系統(tǒng)來完成。
3:ucos中的優(yōu)先級
在系統(tǒng)當有多個并發(fā)任務(wù)需要同時運行的時候,操作系統(tǒng)必須從并發(fā)的多個任務(wù)中選取一個運行,在ucos中,使用優(yōu)先級的方式,即對通過OSTaskCreate()創(chuàng)建的每一個task分配一個唯一的優(yōu)先級來標識任務(wù)的重要程度?,F(xiàn)在ucso中支持256的任務(wù),ucos中任務(wù)的優(yōu)先級用一個數(shù)據(jù)來標識,數(shù)字越小表示任務(wù)的優(yōu)先級越高。系統(tǒng)通過
#define OS_LOWEST_PRIO 31 /* Defines the lowest priority that can be assigned ... */定義最小優(yōu)先級。
#define OS_MAX_TASKS 20 /* Max. number of tasks in your application, MUST be >= 2 */定義了系統(tǒng)最多任務(wù)的個數(shù)。
4:ucos任務(wù)堆棧
所謂堆棧就是在寄存器中按照數(shù)據(jù)的“后進先出”的原則組織的連續(xù)存儲空間。用來在任務(wù)進行切換或者中斷的時候保存CPU寄存器中的內(nèi)容。ucso中每一個任務(wù)的任務(wù)控制塊中都有一個指向其任務(wù)堆棧的指針。
ucso中定義了宏變量
typedef unsigned int OS_STK; /* Each stack entry is 32-bit wide */
比如一個任務(wù)為自己定義的堆棧大小為:static OS_STK TcpServerStack[TCPMULTISERVER_STK_SIZE];
此處定義的任務(wù)堆棧數(shù)據(jù)將傳入OSTaskCreate()函數(shù)中,需要注意不同的CPU有不同棧增長方式。
增長方式的不同任務(wù)函數(shù)的創(chuàng)建的時候也不同。
在任務(wù)創(chuàng)建函數(shù)OSTaskCreate()中的OSTaskStkInit()函數(shù)來初始化任務(wù)的堆棧,此函數(shù)將任務(wù)處理函數(shù)的指針放入到PC寄存器。
OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
{
OS_STK *stk;
(void)opt; /* 'opt' is not used, prevent warning */
stk = ptos; /* Load stack pointer */
/* Registers stacked as if auto-saved on exception */
*(stk) = (INT32U)0x01000000L; /* xPSR */
*(--stk) = (INT32U)task; /* Entry Point PC */
*(--stk) = (INT32U)0xFFFFFFFEL; /* R14 (LR) (init value will cause fault if ever used)*/
*(--stk) = (INT32U)0x12121212L; /* R12 */
*(--stk) = (INT32U)0x03030303L; /* R3 */
*(--stk) = (INT32U)0x02020202L; /* R2 */
*(--stk) = (INT32U)0x01010101L; /* R1 */
*(--stk) = (INT32U)p_arg; /* R0 : argument */
/* Remaining registers saved on process stack */
*(--stk) = (INT32U)0x11111111L; /* R11 */
*(--stk) = (INT32U)0x10101010L; /* R10 */
*(--stk) = (INT32U)0x09090909L; /* R9 */
*(--stk) = (INT32U)0x08080808L; /* R8 */
*(--stk) = (INT32U)0x07070707L; /* R7 */
*(--stk) = (INT32U)0x06060606L; /* R6 */
*(--stk) = (INT32U)0x05050505L; /* R5 */
*(--stk) = (INT32U)0x04040404L; /* R4 */
return (stk);
}
函數(shù)體體與下面的寄存器對應(yīng)。
聯(lián)系客服