操作系統初始化函數OS_Init是操作系統在開始運行時,對全局變量、任務控制塊、就緒表、事件及消息隊列等重要數據結構進行的初始化操作,并創建空閑任務、統計任務等系統任務。該函數必須在創建用戶對象及調用OSStart()啟動實時任務調度之前運行。
內核初始化函數采用模塊化編程,該函數又分為若干子塊,每個子塊實現一定的功能。操作系統初始化函數OS_Init聲明代碼如下所示:
50.png (35.22 KB, 下載次數: 66)
下載附件
2013-7-16 02:16 上傳
如上面的程序所示,OS_InitMisc實現對操作系統一些混雜的全局變量的初始化(Misc是單詞miscellaneous的前4個字母,是雜項的意思),這些混雜的全局變量是初始化過程或運行過程中需要使用的,因此在第一步完成,非常重要。
51.png (26.6 KB, 下載次數: 63)
下載附件
2013-7-16 02:16 上傳
這些全局變量在ucos_ii.h中聲明,在這里進行了初始化。接下來的OS_InitRdyList對就緒表進行初始化的工作,程序代碼如下所示:
52.png (12.18 KB, 下載次數: 57)
下載附件
2013-7-16 02:16 上傳
可見,該函數首先對就緒表和就緒組全部清零,然后對4個重要的任務相關的全局變量進行了初始化。前兩個是當前任務的優先級和最高任務的優先級,后兩個是對應的兩個任務控制塊的指針。
下面該輪到任務控制塊了,由于沒有任務,任務控制塊的兩個鏈表應該初始化為什么樣子呢?
在有用戶任務運行之前,因為沒有用戶任務就緒,就緒鏈表該是個空鏈表。而空閑鏈表這個時候應該是最長的,它的長度是操作系統能容納的任務數。代碼如下所示:
53.png (36.22 KB, 下載次數: 64)
下載附件
2013-7-16 02:16 上傳
54.png (5.85 KB, 下載次數: 78)
下載附件
2013-7-16 02:16 上傳
到這里,全局變量、就緒表、就緒組、任務優先級指針表、空閑鏈表、就緒鏈表等重要數據結構都已經完成了初始化的操作。
接下來OS_InitEventList對時間所用數據結構進行初始化,OS_FlagInit對事件標志數據結構進行初始化,OS_MemInit對內存進行初始化,OS_QInit對消息隊列進行初始化。
OS_InitTaskIdle將創建和初始化操作系統的第一個任務——空閑任務,該部分內容個如下所示:
55.png (53.39 KB, 下載次數: 73)
下載附件
2013-7-16 02:16 上傳
這部分代碼主要是根據配置信息調用創建任務的函數創建空閑任務,其中,無論是OSTaskCreateExt還是OSTaskCreate的第一個參數,都是OS_TaskIdle,OS_TaskIdle是空閑任務函數的地址。該任務的優先級是OS_TASK_IDLE_PRIO,這是一個供用戶配置的宏,默認值是63,是最低優先級的任務。
接著,用類似的方法調用OS_InitTaskSta創建統計任務。
56.png (57.96 KB, 下載次數: 70)
下載附件
2013-7-16 02:16 上傳
那么,在創建了這兩個系統任務后,那個任務運行了呢?沒有任務運行,因為還沒有真正啟動多任務。只是為任務分配和設置了它們生存的數據結構。
如果系統配置有定時器模塊,執行OSTmr_Init初始化定時器。
后面的兩個空函數,可以編寫合適的內容及顯示一些自己需要的調試信息。
操作系統初始化是操作系統開始運行時首先執行的函數,對操作系統使用的各種全局變量和重要的數據結構如任務控制塊及其鏈表、就緒表等進行初始化。接著創建兩個系統任務——空閑任務和統計任務。對這個流程的總結如下所示:
57.png (23.32 KB, 下載次數: 65)
下載附件
2013-7-16 02:16 上傳
|