uC/OS-II是如何生成任務控制塊的實體的呢?答案很簡單,uC/OS-II是以結構體數組的形式生成了任務控制塊的實體。任務控制塊實體的聲明如下:
該代碼在ucos_ii.h中,OS_MAX_TASKS為最多的用戶任務數,OS_N_SYS_TASKS為系統任務數,一般情況下為2。因此,在內存中分配了OS_MAX_TASKS+OS_N_SYS_TASKS個任務控制塊,這些任務控制塊占用了(OS_MAX_TASKS+OS_N_SYS_TASKS)*SizeOf(OS_TCB)個內存空間。
宏OS_MAX_TASKS在OS_CFG.h中定義,OS_CFG.h是整個操作系統的配置文件。宏OS_N_SYS_TASKS在ucos_ii.h中定義,它的值與另一個宏OS_TASK_STAT_EN有關,代碼如下所示:
OS_TASK_STAT_EN>0表示系統具有統計任務的時候,OS_N_SYS_TASKS的值應為2,否則應為1.
OS_TASK_STAT_EN在OS_CFG.h中定義,意義為系統是否具有統計任務,OS_TASK_STAT_EN的默認值是1,表示有統計任務,如果確實不需要統計任務,可以把OS_TASK_STAT_EN的值設置為0,這時候系統任務只有空閑任務,因此OS_N_SYS_TASKS的值就是1.反之,系統如果有統計任務,再加上空閑任務,那么系統任務的數量就是2,OS_N_SYS_TASKS的值就是2.
于是,系統任務總數=OS_MAX_TASKS+OS_N_SYS_TASKS,那么上面程序中的代碼定義的任務控制塊的數量就等于系統的任務總數。
uC/OS-II最多可以管理64個任務,因此,在有統計任務的情況下,OS_MAX_TASKS不能超過62。通常,為節省內存,提高運行效率 ,在實際情況下,如果用戶只有5個任務,完全可以把OS_MAX_TASKS的值設置為5,這樣既節省了大量的內存資源,又提高了運行效率。
任務控制塊實體的聲明的程序代碼定義了系統任務總數個任務控制塊數組,于是這些任務控制塊序號分別是0,1,2,……,OS_MAX_TASKS+OS_N_SYS_TASKS-1,對應的數組元素為OSTCBTbl[0]~OSTCBTbl[OS_MAX_TASKS+OS_N_SYS_TASKS-1],他們占用連續的內存空間。
如下圖所示,列出了系統初始化后實際的任務控制塊,其中第一個任務控制塊的內容被展示出來。
如上圖所示是系統實際運行時,內存中的實際信息。可見,第一個任務控制塊即OSTCBTbl[0]是從地址0x00433300開始的,包含了前面講到的所有任務控制塊成員。該任務控制塊的優先級是0x3f,對應十進制的63,所以是優先級最低的空閑任務,任務名稱OSTCBTaskName的內容是“uC/OS-II Idle”。
|