




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1嵌入式系統設計與實例開發嵌入式系統設計與實例開發第四講第四講 實時操作系統實時操作系統 C/OS-C/OS-分析分析2本節提要本節提要 C/OS-簡介簡介 C/OS-C/OS-內核結構內核結構 C/OS-任務通信與同步任務通信與同步 C/OS-C/OS-任務管理任務管理 C/OS-時間管理時間管理3常見的嵌入式操作系統常見的嵌入式操作系統 實時嵌入式操作系統的種類繁多,大體上可分為兩種實時嵌入式操作系統的種類繁多,大體上可分為兩種: :商用型商用型和免費型。和免費型。l商用型的實操作系統功能穩定、可靠,有完善的技術支持和售商用型的實操作系統功能穩定、可靠,有完善的技術支持和售后服務,但往往價
2、格昂貴后服務,但往往價格昂貴, ,如如VxWorksVxWorks、QNXQNX、WinCEWinCE、Palm OSPalm OS等。等。l免費型的實時操作系統在價格方面具有優勢,目前主要有免費型的實時操作系統在價格方面具有優勢,目前主要有LinuxLinux和和C/OSC/OS,穩定性與服務性存在挑戰。,穩定性與服務性存在挑戰。4學習嵌入式操作系統學習嵌入式操作系統 l學習一種實時操作系統學習一種實時操作系統RTOSRTOS,如,如C/OS,C/OS,掌握實時系統的概念掌握實時系統的概念和設計方法;和設計方法;l嵌入式系統以應用為中心,應用時選擇嵌入式系統以應用為中心,應用時選擇“適用適用
3、”的操作系統;的操作系統;l嵌入式嵌入式LinuxLinux;l自己自己“寫寫”RTOSRTOS一種學習態度一種學習態度. .5RTOSRTOS在嵌入式系統中的位置在嵌入式系統中的位置嵌入式硬件平臺BSPKERNELFSTCP/IP設備驅動設備驅動設備設備I/O調試工具調試工具其他組件其他組件應用RTOSC/C+6RTOSRTOS是是3232位的嵌入式位的嵌入式CPUCPU的軟件基礎的軟件基礎lRTOSRTOS內核提供內核提供CPUCPU的管理:的管理:硬件初始化,硬件初始化,MMUMMU,定時器,中斷;,定時器,中斷;lRTOSRTOS內核提供任務,內存管理;內核提供任務,內存管理;lRTO
4、SRTOS提供設備管理,文件和網絡的支持;提供設備管理,文件和網絡的支持;lRTOSRTOS提供提供C/C+C/C+,JAVAJAVA,圖形模塊等編程接口。,圖形模塊等編程接口。7C/OS簡介1. C/OSMicro Controller O S,微控制器操作系統2 2. C/OSC/OS簡介l美國人美國人Jean LabrosseJean Labrosse 于于19921992年完成;年完成;l應用面覆蓋了諸多領域,如照相機、醫療器械、音響設備、發動機應用面覆蓋了諸多領域,如照相機、醫療器械、音響設備、發動機控制、高速公路電話系統、自動提款機等控制、高速公路電話系統、自動提款機等 ;l199
5、81998年年 C/OSC/OS-II-II,目前的版本,目前的版本 C/OSC/OS -II V2.61 -II V2.61,2.722.72;l20002000年,得到美國航空管理局(年,得到美國航空管理局(FAAFAA)的認證,可用于飛行器中;)的認證,可用于飛行器中;l網站網站www.ucos-II.comwww.ucos-II.com().com)。8公開源代碼公開源代碼可移植性(可移植性(PortablePortable) 絕大部分絕大部分 C/OS-II C/OS-II的源碼是用移植性很強的的源碼是用移植性很強的ANSI CANSI C寫的。和微處寫的。和微處理器硬件相關的那部分
6、是用匯編語言寫的。匯編語言寫的部分已經壓理器硬件相關的那部分是用匯編語言寫的。匯編語言寫的部分已經壓到最低限度,使得到最低限度,使得 C/OS-II C/OS-II便于移植到其他微處理器上。便于移植到其他微處理器上。 C/OS-II C/OS-II可以在絕大多數可以在絕大多數8 8位、位、1616位、位、3232位以至位以至6464位微處理器、微控制器位微處理器、微控制器 、數、數字信號處理器(字信號處理器(DSPDSP)上運行。)上運行。可固化(可固化(ROMableROMable) C/OS-II C/OS-II是為嵌入式應用而設計的,這就意味著,只要讀者有固是為嵌入式應用而設計的,這就意
7、味著,只要讀者有固化手段(化手段(C C編譯、連接、下載和固化),編譯、連接、下載和固化), C/OS-II C/OS-II可以嵌入到讀者的可以嵌入到讀者的產品中成為產品的一部分。產品中成為產品的一部分。可裁剪(可裁剪(ScalableScalable) 可以只使用可以只使用 C/OS-II C/OS-II中應用程序需要的那些系統服務。也就是說中應用程序需要的那些系統服務。也就是說某產品可以只使用很少幾個某產品可以只使用很少幾個 C/OS-II C/OS-II調用,而另一個產品則使用了幾調用,而另一個產品則使用了幾乎所有乎所有 C/OS-II C/OS-II的功能,這樣可以減少產品中的的功能,
8、這樣可以減少產品中的 C/OS-II C/OS-II所需的存所需的存儲器空間(儲器空間(RAMRAM和和ROMROM)。這種可剪裁性是靠條件編譯實現的。)。這種可剪裁性是靠條件編譯實現的。C/OS的性能特點(一)9占先式(占先式(PreemptivePreemptive)多任務多任務 C/OS-IIC/OS-II可以管理可以管理6464個任務,然而,目前這一版本保留個任務,然而,目前這一版本保留8 8個給系統。應用程個給系統。應用程序最多可以有序最多可以有5656個任務。個任務。可確定性可確定性 全部全部 C/OS-II C/OS-II的函數調用與服務的執行時間具有可確定性。的函數調用與服務的
9、執行時間具有可確定性。任務棧任務棧 每個任務有自己單獨的棧,每個任務有自己單獨的棧, C/OS-II C/OS-II允許每個任務有不同的棧空間,以便允許每個任務有不同的棧空間,以便壓低應用程序對壓低應用程序對RAMRAM的需求。的需求。系統服務系統服務 C/OS-IIC/OS-II提供很多系統服務,例如郵箱、消息隊列、信號量、塊大小固定的提供很多系統服務,例如郵箱、消息隊列、信號量、塊大小固定的內存的申請與釋放、時間相關函數等。內存的申請與釋放、時間相關函數等。中斷管理中斷管理 中斷可以使正在執行的任務暫時掛起,如果優先級更高的任務被該中斷喚醒,中斷可以使正在執行的任務暫時掛起,如果優先級更高
10、的任務被該中斷喚醒,則高優先級的任務在中斷嵌套全部退出后立即執行,中斷嵌套層數可達則高優先級的任務在中斷嵌套全部退出后立即執行,中斷嵌套層數可達255255層。層。穩定性與可靠性穩定性與可靠性C/OS的性能特點(二)10 C/OS-IIC/OS-II圖書圖書l描述了描述了 C/OS-IIC/OS-II內部的工作原理;內部的工作原理;l隨書的隨書的CDCD中包含了源代碼;中包含了源代碼;工業界最清晰的源代碼工業界最清晰的源代碼l除英文版外,有中文和韓文版。除英文版外,有中文和韓文版。ChineseKoreanEnglishISBN 1-57820-103-9美國CMP BOOK ISBN 7-8
11、1077-290-2北京航空航天大學出版社ISBN 89-951540-5-511C/OS-II的各種商業應用l全世界有數百種產品在應用全世界有數百種產品在應用: :lAvionicslMedicallCell phoneslRouters and switcheslHigh-end audio equipmentlWashing machines and dryerslUPS (Uninterruptible Power Supplies)lIndustrial controllerslGPS Navigation SystemslMicrowave RadioslInstrumentati
12、onlPoint-of-sale terminalsl更多更多12C/OS-II提供的系統服務l信號量;信號量;l帶互斥機制的信號量;帶互斥機制的信號量;減少優先級倒置的問題減少優先級倒置的問題l事件標志;事件標志;l消息信箱;消息信箱;l消息隊列;消息隊列;l內存管理;內存管理;l時鐘管理;時鐘管理;l任務管理。任務管理。13 C/GUI and C/FSl C/GUIC/GUI嵌入式的用戶界面;嵌入式的用戶界面;用用ANSI CANSI C書寫;書寫;支持任何支持任何8, 16, 32-bits CPU8, 16, 32-bits CPU;彩色,灰度,等級或黑白顯示;彩色,灰度,等級或黑白
13、顯示;代碼尺寸小。代碼尺寸小。l C/FSC/FS嵌入式的文件系統嵌入式的文件系統Written in ANSI CWritten in ANSI C;用用ANSI CANSI C書寫;書寫;支持任何支持任何8, 16, 32-bits CPU8, 16, 32-bits CPU;支持支持SMC, MMC, SD, CF, IDE, Flash, RAMSMC, MMC, SD, CF, IDE, Flash, RAM其他介質。其他介質。14本節提要本節提要 C/OS-簡介簡介 C/OS-內核結構內核結構 C/OS-任務通信與同步任務通信與同步 C/OS-C/OS-任務管理任務管理 C/OS-
14、時間管理時間管理15C/OS-II的文件結構16l內核結構內核結構l任務管理任務管理l時間管理時間管理l任務之間通信與同步任務之間通信與同步l C/OSC/OS的移植的移植C/OS-II的內核結構17l當處理臨界段代碼時,需要關中斷,處理完畢后,再開中斷;當處理臨界段代碼時,需要關中斷,處理完畢后,再開中斷;l關中斷時間是實時內核最重要的指標之一;關中斷時間是實時內核最重要的指標之一;l在實際應用中,關中斷的時間很大程度中取決于微處理器的結構在實際應用中,關中斷的時間很大程度中取決于微處理器的結構和編譯器生成的代碼質量;和編譯器生成的代碼質量;l C/OSC/OS-II-II定義兩個宏開關中斷
15、定義兩個宏開關中斷:OS_ENTER_CRITICAL():OS_ENTER_CRITICAL()和和OS_EXIT_CRITICAL()OS_EXIT_CRITICAL()。C/OS-II中開關中斷的方法18lOS_CRITICAL_METHOD=1OS_CRITICAL_METHOD=1l用處理器指令關中斷,執行用處理器指令關中斷,執行OS_ENTER_CRITICAL()OS_ENTER_CRITICAL(),開中斷執,開中斷執行行OS_EXIT_CRITICAL()OS_EXIT_CRITICAL();lOS_CRITICAL_METHOD=2OS_CRITICAL_METHOD=2l
16、實現實現OS_ENTER_CRITICAL()OS_ENTER_CRITICAL()時,先在堆棧中保存中斷的開時,先在堆棧中保存中斷的開/ /關關狀態,然后再關中斷;實現狀態,然后再關中斷;實現OS_EXIT_CRITICAL()OS_EXIT_CRITICAL()時,從堆棧時,從堆棧中彈出原來中斷的開中彈出原來中斷的開/ /關狀態;關狀態;lOS_CRITICAL_METHOD=3OS_CRITICAL_METHOD=3l把當前處理器的狀態字保存在局部變量中(如把當前處理器的狀態字保存在局部變量中(如OS_CPU_SROS_CPU_SR,關,關中斷時保存,開中斷時恢復。中斷時保存,開中斷時恢
17、復。C/OS-II中采用了3種開關中斷的方法19任務task典型的任務一個無限循環。典型的任務一個無限循環。void mytask(void void mytask(void * *pdatapdata) ) for (;) for (;) do something; do something; waiting; waiting; do something; do something; l C/OSC/OS II 2.5II 2.5版本支持版本支持6464個任務,每個任務一個特定的優先級。優先級個任務,每個任務一個特定的優先級。優先級越高,數字越小。越高,數字越小。l系統占用了系統占用了8 8
18、個任務,保留優先級為個任務,保留優先級為0 0、1 1、2 2、3 3、OS_LOWEST_PRIO-3OS_LOWEST_PRIO-3、 OS_LOWEST_PRIO-2OS_LOWEST_PRIO-2、 OS_LOWEST_PRIO-1OS_LOWEST_PRIO-1、 OS_LOWEST_PRIO-0OS_LOWEST_PRIO-0。20Task StructureTask Structure void YourTask (void *pdata) (1) for (;) (2) /* 用戶代碼用戶代碼 */ 調用調用uC/OS-II的某種系統服務的某種系統服務: OSMboxPend(
19、); OSQPend(); OSSemPend(); OSTaskDel(OS_PRIO_SELF); OSTaskSuspend(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM(); /* 用戶代碼用戶代碼 */ 21Alternate Structure void YourTask (void *pdata) /* 用戶代碼用戶代碼 */ OSTaskDel(OS_PRIO_SELF); 22任務狀態任務狀態23任務控制塊(TCB)l任務控制塊任務控制塊 OS_TCBOS_TCB是一個數據結構,保存該任務的相關參數,包括任是一個數據結構,保存該任務的相關
20、參數,包括任務堆棧指針,狀態,優先級,任務表位置,任務鏈表指針等。務堆棧指針,狀態,優先級,任務表位置,任務鏈表指針等。l所有的任務控制塊分為兩條鏈表,空閑鏈表和使用鏈表。所有的任務控制塊分為兩條鏈表,空閑鏈表和使用鏈表。24 C/OS-IIC/OS-II任務控制塊任務控制塊. .typedef struct os_tcb OS_STK *OSTCBStkPtr;#if OS_TASK_CREATE_EXT_EN0 void *OSTCBExtPtr; OS_STK *OSTCBStkBottom; INT32U OSTCBStkSize; INT16U OSTCBOpt; INT16U OS
21、TCBId;#endif struct os_tcb *OSTCBNext; struct os_tcb *OSTCBPrev;#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN | OS_SEM_EN OS_EVENT *OSTCBEventPtr;#endif25#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN void *OSTCBMsg;#endif INT16U OSTCBDly; INT8U OSTCBStat; INT8U OSTCBPrio; INT8U OSTCBX; INT8U OSTCBY; INT
22、8U OSTCBBitX; INT8U OSTCBBitY;#if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq;#endif OS_TCB;26任務控制塊任務控制塊OS_TCBOS_TCB中幾個成員的算法中幾個成員的算法OSTCBY= priority 3;OSTCBBitY= OSMapTblpriority 3;OSTCBX= priority & 0 x07;OSTCBBitX= OSMapTblpriority & 0 x07;27空任務列表空任務列表 所有的任務控制塊都被放置在任務控制塊列表數組所有的任務控制塊都被放置在任務控制塊列表數組OSTCBTbl中,
23、系統初始化時,所有任務控制塊被鏈接成空任務控制塊的單向中,系統初始化時,所有任務控制塊被鏈接成空任務控制塊的單向鏈表,任務建立后,空任務控制塊指針鏈表,任務建立后,空任務控制塊指針OSTCBFreeList指向的任務指向的任務控制塊就賦給了該任務,然后控制塊就賦給了該任務,然后OSTCBFreeList的值調整為指向鏈表的值調整為指向鏈表中的下一個空任務控制塊。中的下一個空任務控制塊。28任務控制塊初始化函數INT8U OS_TCBInit ( INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *p
24、ext, INT16U opt )29任務級的任務調度-OSSchedl C/OSC/OS是占先式實時多任務內核,優先級最高的任務一旦準備就緒,則是占先式實時多任務內核,優先級最高的任務一旦準備就緒,則擁有擁有CPUCPU的所有權開始投入運行。的所有權開始投入運行。l C/OSC/OS中不支持時間片輪轉法,每個任務的優先級要求不一樣且是唯一中不支持時間片輪轉法,每個任務的優先級要求不一樣且是唯一的,所以任務調度的工作就是:查找準備就緒的最高優先級的任務并進的,所以任務調度的工作就是:查找準備就緒的最高優先級的任務并進行上下文切換。行上下文切換。l C/OSC/OS任務調度所花的時間為常數,與應
25、用程序中建立的任務數無關。任務調度所花的時間為常數,與應用程序中建立的任務數無關。30根據就緒表確定最高優先級兩個關鍵兩個關鍵: :l優先級數分解為高三位和低三位分別確定;優先級數分解為高三位和低三位分別確定;l高優先級有著小的優先級號高優先級有著小的優先級號 。31根據優先級找到任務在就緒任務表中的位置每個就緒的任務都放入就緒表(每個就緒的任務都放入就緒表(ready listready list)中,就緒表有兩個變量:)中,就緒表有兩個變量:OSRdyGrpOSRdyGrp、OSRdyTblOSRdyTblOSRdyGrp1207 6 5 4 300XXXYY Y任務優先級20176543
26、108915 14 13 1212 1118161723 22 2121 20 1926242531 30 29 28 2734323339 38 37 36 3542404147 46 45 44 4350484955 54 53 52 5158565763 62 61 60 5901234567OSRdyTbl7XY優先級最低任務(空閑任務)優先級最高任務任務優先級號32根據優先級確定就緒表(1)假設優先級為假設優先級為1212的任務進入就緒狀態,的任務進入就緒狀態,12=1100b12=1100b,則,則OSRdyTbl1OSRdyTbl1的第的第4 4位置位置1 1,且,且OSRdyG
27、rpOSRdyGrp的第的第1 1位置位置1 1,相應的數學表達式為,相應的數學表達式為: : OSRdyGrp OSRdyGrp |=0000 0010=0 x02|=0000 0010=0 x02; OSRdyTbl1 |=0001 0000=0 x10;OSRdyTbl1 |=0001 0000=0 x10;而優先級為而優先級為2121的任務就緒的任務就緒21=10 101b21=10 101b,則,則OSRdyTbl2OSRdyTbl2的第的第5 5位置位置1 1,且,且OSRdyGrpOSRdyGrp的第的第2 2位置位置1 1,相應的數學表達式為:,相應的數學表達式為: OSRdy
28、Grp OSRdyGrp |=0000 0100=0 x04|=0000 0100=0 x04; OSRdyTbl2 |=0010 0000=0 x20;OSRdyTbl2 |=0010 0000=0 x20;33根據優先級確定就緒表(2)l從上面的計算我們可以得到從上面的計算我們可以得到: :若若OSRdyGrpOSRdyGrp及及OSRdyBblOSRdyBbl的第的第n n位置位置1 1,則,則應該把應該把OSRdyGrpOSRdyGrp及及OSRdyBblOSRdyBbl的值與的值與2 2n n 相或。相或。C/OSC/OS中,把中,把2 2n n的的n=0-7n=0-7的的8 8個值
29、先計算好存在數組個值先計算好存在數組OSMapTblOSMapTbl中,也就是:中,也就是: OSMapTbl0 =2OSMapTbl0 =20 0=0 x01=0 x01(0000 00010000 0001) OSMapTbl1 =2OSMapTbl1 =21 1=0 x02=0 x02(0000 00100000 0010) OSMapTbl7 =2 OSMapTbl7 =27 7=0 x80=0 x80(1000 00001000 0000)34使任務進入就緒態如果如果prio(00yyyxxx)prio(00yyyxxx)是任務的優先級,也是任務的識別號,則將任務是任務的優先級,也是
30、任務的識別號,則將任務放入就緒表,即使任務進入就緒態的方法是:放入就緒表,即使任務進入就緒態的方法是:OSRdyGrp |=OSMapTblprioOSRdyGrp |=OSMapTblprio3;3;OSRdyTblprio3 |=OSMapTblprioOSRdyTblprio3 |=OSMapTblprio & 0 x07; & 0 x07;假設優先級為假設優先級為12121100b1100bOSRdyGrp OSRdyGrp |=OSMapTbl1(0000 0010)|=OSMapTbl1(0000 0010);OSRdyTbl1 |=OSMapTbl4(0001 0000);OSR
31、dyTbl1 |=OSMapTbl4(0001 0000);35使任務脫離就緒態 將任務就緒表將任務就緒表OSRdyTblprioOSRdyTblprio33相應元素的相應位清零,而且相應元素的相應位清零,而且當當OSRdyTblprioOSRdyTblprio33中的所有位都為零時,即全組任務中沒有一個中的所有位都為零時,即全組任務中沒有一個進入就緒態時,進入就緒態時,OSRdyGrpOSRdyGrp的相應位才為零。的相應位才為零。If(OSRdyTblprioIf(OSRdyTblprio3&= 3&= OSMapTblprioOSMapTblprio & 0 x07)=0); & 0 x
32、07)=0);OSRdyGrpOSRdyGrp&= &= OSMapTblprioOSMapTblprio3;3;36采用查表法確定高優先級任務 查表法具有確定的時間,增加了系統的可預測性,查表法具有確定的時間,增加了系統的可預測性,C/OSC/OS中中所有的系統調用時間都是確定的所有的系統調用時間都是確定的High3 =OSUnMapTblOSRdyGrpHigh3 =OSUnMapTblOSRdyGrp;Low3 =OSUnMapTblOSRdyTblHigh3;Low3 =OSUnMapTblOSRdyTblHigh3;Prio Prio =(High33)+Low3;=(High33)
33、+Low3;OSRdyGrp1207 6 5 4 300XXXYY Y任務優先級20176543108915 14 13 12 1118161723 22 21 20 1926242531 30 29 28 2734323339 38 37 36 3542404147 46 45 44 4350484955 54 53 52 5158565763 62 61 60 5901234567OSRdyTbl7XY37INT8U const OSUnMapTbl = 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1,
34、 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1,
35、 0, 2, 0, 1, 0, 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1,
36、 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0;優先級判定表OSUnMapTbl256舉例:舉例: 如如OSRdyGrpOSRdyGrp的值為的值為01101000B01101000B,即,即0X680X68,則查得,則查得OSUnMapTblOSUnMapTblOSRdyGrpOSRdyGrp 的值是的值是3 3,它相應于,它相應于OSRdyGrpOSRdyGrp中的第中的第3 3位位置置1 1; 如如OSRdyTbl3OSRdyTbl3的值是
37、的值是11100100B11100100B,即,即0XE40XE4,則查,則查OSUnMapTblOSRdyTbl3OSUnMapTblOSRdyTbl3的值是的值是2 2,則進入就緒態的最高任務優,則進入就緒態的最高任務優先級先級PrioPrio=3=3* *8+2=268+2=26 38Task schedulervoid OSSched (void) INT8U y; OS_ENTER_CRITICAL(); if (OSLockNesting =0)&(OSIntNesting= 0) y = OSUnMapTblOSRdyGrp; OSPrioHighRdy = (INT8U)(y
38、3) + OSUnMapTblOSRdyTbly) if (OSPrioHighRdy != OSPrioCur) OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; OSCtxSwCtr+; OS_TASK_SW(); OS_EXIT_CRITICAL();39void OSSchedLock (void) if (OSRunning = TRUE) OS_ENTER_CRITICAL(); if(OSLockNesting 0) OSLockNesting-; if (OSLockNesting=0)&(OSIntNesting=0) OS_EXIT_CRI
39、TICAL(); OSSched(); else OS_EXIT_CRITICAL(); else OS_EXIT_CRITICAL(); 41任務切換l將被掛起的任務寄存器入棧;將被掛起的任務寄存器入棧;l將較高優先級任務的寄存器出棧。將較高優先級任務的寄存器出棧。42任務級的任務切換OS_TASK_SW()lOS_TASK_SW()OS_TASK_SW()是宏調用,含有微處理器的軟中斷指令;是宏調用,含有微處理器的軟中斷指令;lOS_TASK_SW()OS_TASK_SW()將處理器相關的軟件中斷機制封裝起來,便于操作將處理器相關的軟件中斷機制封裝起來,便于操作系統移植。系統移植。43調用
40、OS_TASK_SW()前的數據結構低優先級任務 OS_TCBOSTCBCur(1)存儲器低地址存儲器高地址堆棧方向堆棧方向SPR1R2R3R4PCPSW存儲器低地址存儲器高地址高優先級任務 OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)PSWPCR1R2R3R444保存當前CPU寄存器的值低優先級任務 OS_TCBOSTCBCurPSWPCR1R2R3R4存儲器低地址存儲器高地址堆棧方向堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存儲器低地址存儲器高地址高優先級任務 OS_TCBOSTCBHighRdy(2)CPU(1)(3)45重新裝入要運行的任務低
41、優先級任務 OS_TCBOSTCBCurPSWPCR1R2R3R4存儲器低地址存儲器高地址堆棧方向堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存儲器低地址存儲器高地址高優先級任務 OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)46任務切換OS_TASK_SW()的代碼Void OSCtxSw(voidVoid OSCtxSw(void) ) 將將R1,R2,R3R1,R2,R3及及R4R4推入當前堆棧;推入當前堆棧; OSTCBCurOSTCBCurOSTCBStkPtrOSTCBStkPtr = SP; = SP
42、; OSTCBCur = OSTCBHighRdy OSTCBCur = OSTCBHighRdy; ; SP = OSTCBHighRdy SP = OSTCBHighRdy OSTCBSTKPtrOSTCBSTKPtr; ; 將將R4,R3,R2R4,R3,R2及及R1R1從新堆棧中彈出;從新堆棧中彈出; 執行中斷返回指令;執行中斷返回指令; 47C/OS-II中的中斷l中斷:中斷:由于某種事件的發生,而導致程序流程的改變。產生中斷的由于某種事件的發生,而導致程序流程的改變。產生中斷的事件稱為中斷源。事件稱為中斷源。lCPU響應中斷的條件:響應中斷的條件:至少有一個中斷源向至少有一個中斷源
43、向CPU發出中斷信號;發出中斷信號;系統允許中斷,且對此中斷信號未予屏蔽。系統允許中斷,且對此中斷信號未予屏蔽。l中斷類型:中斷類型:硬件中斷;硬件中斷; 外部中斷;外部中斷;陷井中斷;陷井中斷;現場控制量的中斷。現場控制量的中斷。48 C/OSC/OS-II-II中的中斷服務子程序中的中斷服務子程序用戶中斷服務子程序:用戶中斷服務子程序: 保存全部保存全部CPUCPU寄存器;寄存器; 調用調用OSIntEnterOSIntEnter()()或或OSIntNestingOSIntNesting直接加直接加1 1; if(OSIntNestingif(OSIntNesting=1)=1) OST
44、CBCur-OSTCBStkPtr OSTCBCur-OSTCBStkPtr=SP;=SP; 清中斷源;清中斷源; 重新開中斷;重新開中斷; 執行用戶代碼做中斷服務;執行用戶代碼做中斷服務; 調用調用OSIntExitOSIntExit();(); 恢復所有恢復所有CPUCPU寄存器;寄存器; 執行中斷返回指令;執行中斷返回指令;49中斷服務中斷服務5051Search for highest priority similar to schedulerHalf context switch is done by interrupt response i.e. registers saved52
45、中斷與時鐘節拍中斷與時鐘節拍l時鐘節拍(時鐘滴答)時鐘節拍(時鐘滴答)TickTick,是一種定時器中斷,可通過編程方,是一種定時器中斷,可通過編程方式實現。式實現。l時鐘節拍是一種特殊的中斷,操作系統的心臟。首先時鐘節拍是一種特殊的中斷,操作系統的心臟。首先3232位的整數位的整數OSTimeOSTime加加1 1。對任務列表進行掃描,判斷是否有延時任務應該處。對任務列表進行掃描,判斷是否有延時任務應該處于準備就緒狀態,最后進行上下文切換。于準備就緒狀態,最后進行上下文切換。53時鐘節拍中斷服務子程序時鐘節拍中斷服務子程序Void OSTickISR(void) 保存處理器寄存器的值; 調用
46、OSIntEnter(),或是將OSIntNesting加1 if(OSIntNesting=1) OSTCBCur-OSTCBStkPtr=SP; 調用OSTimeTick(); 清發出中斷設備的中斷; 重新允許中斷(可選用) 調用OSIntExit(); 恢復處理器寄存器的值; 執行中斷返回指令;54void OSTimeTick (void) OS_TCB *ptcb; OSTimeTickHook(); (1) ptcb = OSTCBList; (2) while (ptcb-OSTCBPrio != OS_IDLE_PRIO) (3) OS_ENTER_CRITICAL(); if
47、 (ptcb-OSTCBDly != 0) if (-ptcb-OSTCBDly = 0) if (!(ptcb-OSTCBStat & OS_STAT_SUSPEND) (4) OSRdyGrp |= ptcb-OSTCBBitY; (5) OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; else ptcb-OSTCBDly = 1; ptcb = ptcb-OSTCBNext; OS_EXIT_CRITICAL(); OS_ENTER_CRITICAL(); (6) OSTime+; (7)時鐘節拍函數時鐘節拍函數OSTimTickOSTimTick()()5
48、5void OSTaskIdle (void *pdata) pdata = pdata; for (;) OS_ENTER_CRITICAL(); OSIdleCtr+; OS_EXIT_CRITICAL(); 空閑任務空閑任務OSTaskIdle()56初始化統計任務初始化統計任務void main (void) OSInit(); /* 初始化初始化C/OS-II(1)*/ /* 安裝安裝C/OS-II的任務切換向量的任務切換向量*/ /* 創建用戶起始任務創建用戶起始任務(以以TaskStart()作為起始任務作為起始任務)(2)*/ OSStart(); /* 開始多任務調度開始多任
49、務調度(3)*/void TaskStart (void *pdata) /* 安裝并啟動安裝并啟動C/OS-II的時鐘節拍的時鐘節拍 (4)*/ OSStatInit(); /* 初始化統計任務初始化統計任務(5)*/ /* 創建用戶應用程序任務創建用戶應用程序任務*/ for (;) /* 這里是這里是TaskStart()的代碼的代碼!*/ 57統計任務初始化統計任務初始化58 C/OSC/OS-II-II初始化初始化l首先調用系統初始化函數首先調用系統初始化函數OSIint()。OSIint()初始化初始化C/OS-所有的變量和數所有的變量和數據結構(見據結構(見OS_CORE.C)。
50、)。lOSInit()建立空閑任務建立空閑任務idle task,這個任務總是處于就緒態的。空閑任務,這個任務總是處于就緒態的。空閑任務OSTaskIdle()的優先級總是設成最低,即()的優先級總是設成最低,即OS_LOWEST_PRIO。l如果統計任務允許如果統計任務允許OS_TASK_STAT_EN和任務建立擴展允許都設為和任務建立擴展允許都設為1,則,則OSInit()還得建立統計任務還得建立統計任務OSTaskStat()并且讓其進入就緒態。并且讓其進入就緒態。OSTaskStat的優先級總是設為的優先級總是設為OS_LOWEST_PRIO-1 。l空閑和統計任務的任務控制塊(空閑和
51、統計任務的任務控制塊(OS_TCBs)是用雙向鏈表鏈接在一起的。)是用雙向鏈表鏈接在一起的。OSTCBList指向這個鏈表的起始處。當建立一個任務時,這個任務總是被放指向這個鏈表的起始處。當建立一個任務時,這個任務總是被放在這個鏈表的起始處。在這個鏈表的起始處。59調用OSInit()之后的數據結構 60空閑緩沖區空閑緩沖區61C/OS-C/OS-的啟動的啟動void main (void) OSInit(); /* 初始化初始化C/OS-II */ . . 通過調用通過調用OSTaskCreate()或或OSTaskCreateExt()創建至少一個任創建至少一個任務務; . . OSSta
52、rt(); /* 開始多任務調度開始多任務調度!OSStart()永遠不永遠不會返回會返回 */62啟動多任務啟動多任務void OSStart (void) INT8U y; INT8U x; if (OSRunning = FALSE) y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly; OSPrioHighRdy = (INT8U)(y OSTCBStkPtr; OSRunning = TRUE; Restore all processor registers from the new tasks stack; Execute a retur
53、n from interrupt nstruction; 64調用OSStart()之后的數據結構 65本節提要本節提要 C/OS-簡介簡介 C/OS-C/OS-內核結構內核結構 C/OS-任務通信與同步任務通信與同步 C/OS-任務管理任務管理 C/OS-時間管理時間管理66建立任務建立任務Use one of two serviceslOS TaskCreate()lOSTaskCreateExt ()67建立任務,建立任務,OSTaskCreate()INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos
54、, INT8U prio) void *psp; INT8U err; if (prio OS_LOWEST_PRIO) (1) return (OS_PRIO_INVALID); OS_ENTER_CRITICAL(); if (OSTCBPrioTblprio = (OS_TCB *)0) (2) OSTCBPrioTblprio = (OS_TCB *)1; (3) OS_EXIT_CRITICAL(); (4) psp = (void *)OSTaskStkInit(task, pdata, ptos, 0); err = OSTCBInit(prio, psp, (void *)0,
55、 0, 0, (void *)0, 0); if (err = OS_NO_ERR) OS_ENTER_CRITICAL();68 OSTaskCtr+; OSTaskCreateHook(OSTCBPrioTblprio); OS_EXIT_CRITICAL(); if (OSRunning) OSSched(); else OS_ENTER_CRITICAL(); OSTCBPrioTblprio = (OS_TCB *)0; OS_EXIT_CRITICAL(); return (err); else OS_EXIT_CRITICAL(); return (OS_PRIO_EXIST);
56、 69堆棧檢驗,堆棧檢驗,OSTaskStkChkOSTaskStkChk()();刪除任務,刪除任務,OSTaskDelOSTaskDel()();請求刪除任務,請求刪除任務,OSTaskDelReqOSTaskDelReq()();改變任務的優先級,改變任務的優先級,OSTaskChangePrioOSTaskChangePrio()();掛起任務,掛起任務,OSTaskSuspendOSTaskSuspend()();恢復任務,恢復任務,OSTaskResumeOSTaskResume()()。 其他相關函數其他相關函數70本節提要本節提要 C/OS-簡介簡介 C/OS-C/OS-內核結
57、構內核結構 C/OS-任務通信與同步任務通信與同步 C/OS-C/OS-任務管理任務管理 C/OS-時間管理時間管理71時間管理Five services:lOSTimeDLY();lOSTimeDLYHMSM();lOSTimeDlyResmue();lOStimeGet();lOSTimeSet()。72OSTimeDly( )void OSTimeDly (INT16U ticks) if (ticks 0) OS_ENTER_CRITICAL(); if (OSRdyTblOSTCBCur-OSTCBY &= OSTCBCur-OSTCBBitX) = 0) OSRdyGrp &= O
58、STCBCur-OSTCBBitY; OSTCBCur-OSTCBDly = ticks; OS_EXIT_CRITICAL(); OSSched(); 73OSTimeDlyHMSM( )74本節提要本節提要 C/OS-簡介簡介 C/OS-C/OS-內核結構內核結構 C/OS-任務通信與同步任務通信與同步 C/OS-任務管理任務管理 C/OS-時間管理時間管理 C/OS-移植移植75任務間通信手段 C/OSC/OS中,采用多種方法保護任務之間的共享數據和提供任務之中,采用多種方法保護任務之間的共享數據和提供任務之間的通信。間的通信。提供提供OS_ENTER_CRITICALOS_ENTER_
59、CRITICAL和和OS_EXIT_CRITICALOS_EXIT_CRITICAL來對臨界資源進來對臨界資源進行保護。行保護。OSSchedLockOSSchedLock( )( )禁止調度保護任務級的共享資源。禁止調度保護任務級的共享資源。提供了經典操作系統任務間通信方法:信號量、郵箱、消息提供了經典操作系統任務間通信方法:信號量、郵箱、消息隊列,事件標志。隊列,事件標志。 76事件控制塊ECB 程序程序4.5 ECB的結構如下的結構如下 - typedef struct void *OSEventPtr; /*指向消息或消息隊列的指針指向消息或消息隊列的指針*/ INT8U OSEven
60、tTblOS_EVENT_TBL_SIZE; /*等待任務列表等待任務列表*/ INT16U OSEventCnt; /*計數器(當事件是信號量時)計數器(當事件是信號量時)*/ INT8U OSEventType; /*事件類型:信號量、郵箱等事件類型:信號量、郵箱等*/ INT8U OSEventGrp; /*等待任務組等待任務組*/ OS_EVENT; 與與TCB類似的結構,使用兩個鏈表,空閑鏈表與使用類似的結構,使用兩個鏈表,空閑鏈表與使用鏈表鏈表 所有的通信信號都被看成是事件所有的通信信號都被看成是事件(event), (event), 一個稱為事件控制塊一個稱為事件控制塊(ECB,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年康復醫療服務連鎖化運營模式下的患者需求分析與服務創新
- 小學生知黨史感黨恩課件
- 臨海小學招生管理辦法
- 會議同意通過管理辦法
- 人員核酸臺賬管理辦法
- 云南電梯安全管理辦法
- 小學生省略號課件
- 會員禮品管理辦法細則
- 云南學校管理辦法細則
- 企業資金流動管理辦法
- 偏執性精神障礙
- 中醫跟師總結論文3000字(通用3篇)
- 附件1:上海市新增醫療服務項目價格申請受理表
- 2022年陜西二級造價工程師造價管理考試真題及答案
- 《服務設計》課程教學大綱
- 消防維保方案(消防維保服務)(技術標)
- 阿勒泰布爾津縣高校畢業生“三支一扶”計劃招募考試題庫
- 少兒硬筆書法啟蒙教學30講PPT課件配套教案
- 巖棉施工方案改
- 鋼筋配筋全套表格
- GB/T 1688-1986硫化橡膠伸張疲勞的測定
評論
0/150
提交評論