實時操作系統(tǒng)uCOS開發(fā)與實例_第1頁
實時操作系統(tǒng)uCOS開發(fā)與實例_第2頁
實時操作系統(tǒng)uCOS開發(fā)與實例_第3頁
實時操作系統(tǒng)uCOS開發(fā)與實例_第4頁
實時操作系統(tǒng)uCOS開發(fā)與實例_第5頁
已閱讀5頁,還剩93頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、1嵌入式系統(tǒng)設(shè)計與實例開發(fā)嵌入式系統(tǒng)設(shè)計與實例開發(fā)實時操作系統(tǒng)實時操作系統(tǒng) C/OS-C/OS-2本節(jié)提要本節(jié)提要 C/OS-簡介簡介 C/OS-C/OS-內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu) C/OS-任務(wù)通信與同步任務(wù)通信與同步 C/OS-C/OS-任務(wù)管理任務(wù)管理 C/OS-時間管理時間管理 C/OS-移植移植3RTOSRTOS是是3232位的嵌入式位的嵌入式CPUCPU的軟件基礎(chǔ)的軟件基礎(chǔ)lRTOSRTOS內(nèi)核內(nèi)核 提供提供CPUCPU的管理的管理l硬件初時化,硬件初時化,MMUMMU,定時器,中斷,定時器,中斷l(xiāng)RTOS RTOS 內(nèi)核提供任務(wù),內(nèi)存管理內(nèi)核提供任務(wù),內(nèi)存管理lRTOSRTOS提供設(shè)備管

2、理,文件和網(wǎng)絡(luò)的支持提供設(shè)備管理,文件和網(wǎng)絡(luò)的支持lRTOSRTOS提供提供C/C+C/C+,JAVAJAVA,圖形模塊等編程接口,圖形模塊等編程接口4C/OS簡介1、C/OSMicro Controller O S,微控制器操作系統(tǒng)2 2、 C/OSC/OS簡介l美國人美國人Jean Labrosse 1992Jean Labrosse 1992年完成年完成l應(yīng)用面覆蓋了諸多領(lǐng)域,如照相機(jī)、醫(yī)療器械、音響設(shè)備、發(fā)動應(yīng)用面覆蓋了諸多領(lǐng)域,如照相機(jī)、醫(yī)療器械、音響設(shè)備、發(fā)動機(jī)控制、高速公路電話系統(tǒng)、自動提款機(jī)等機(jī)控制、高速公路電話系統(tǒng)、自動提款機(jī)等 l19981998年年 C/OSC/OS-II

3、-II,目前的版本,目前的版本 C/OSC/OS -II V2.61 -II V2.61l20002000年,得到美國航空管理局(年,得到美國航空管理局(FAAFAA)的認(rèn)證,可以用于飛行器)的認(rèn)證,可以用于飛行器中中l(wèi)網(wǎng)站網(wǎng)站www.ucos-II.comwww.ucos-II.com()5u公開源代碼公開源代碼u可移植性(可移植性(PortablePortable) 絕大部分絕大部分 C/OS-IIC/OS-II的源碼是用移植性很強的的源碼是用移植性很強的ANSI CANSI C寫的。和微處理器寫的。和微處理器硬件相關(guān)的那部分是用匯編語言寫的。匯編語言寫的部分已經(jīng)壓到最硬件相關(guān)的那部分是用

4、匯編語言寫的。匯編語言寫的部分已經(jīng)壓到最低限度,使得低限度,使得 C/OS-IIC/OS-II便于移植到其他微處理器上。便于移植到其他微處理器上。 C/OS-IIC/OS-II可以在可以在絕大多數(shù)絕大多數(shù)8 8位、位、1616位、位、3232位以至位以至6464位微處理器、微控制器位微處理器、微控制器 、數(shù)字信號處、數(shù)字信號處理器(理器(DSPDSP)上運行。)上運行。u可固化(可固化(ROMableROMable) C/OS-IIC/OS-II是為嵌入式應(yīng)用而設(shè)計的,這就意味著,只要讀者有固化手是為嵌入式應(yīng)用而設(shè)計的,這就意味著,只要讀者有固化手段(段(C C編譯、連接、下載和固化),編譯、

5、連接、下載和固化), C/OS-IIC/OS-II可以嵌入到讀者的產(chǎn)品可以嵌入到讀者的產(chǎn)品中成為產(chǎn)品的一部分。中成為產(chǎn)品的一部分。u可裁剪(可裁剪(ScalableScalable) 可以只使用可以只使用 C/OS-IIC/OS-II中應(yīng)用程序需要的那些系統(tǒng)服務(wù)。也就是說某產(chǎn)中應(yīng)用程序需要的那些系統(tǒng)服務(wù)。也就是說某產(chǎn)品可以只使用很少幾個品可以只使用很少幾個 C/OS-IIC/OS-II調(diào)用,而另一個產(chǎn)品則使用了幾乎所調(diào)用,而另一個產(chǎn)品則使用了幾乎所有有 C/OS-IIC/OS-II的功能,這樣可以減少產(chǎn)品中的的功能,這樣可以減少產(chǎn)品中的 C/OS-IIC/OS-II所需的存儲器空所需的存儲器空

6、間(間(RAMRAM和和ROMROM)。這種可剪裁性是靠條件編譯實現(xiàn)的。)。這種可剪裁性是靠條件編譯實現(xiàn)的。C/OS的性能特點(一)6u占先式(占先式(PreemptivePreemptive)u多任務(wù)多任務(wù) C/OS-IIC/OS-II可以管理可以管理6464個任務(wù),然而,目前這一版本保留個任務(wù),然而,目前這一版本保留8 8個給系統(tǒng)。應(yīng)用程序最個給系統(tǒng)。應(yīng)用程序最多可以有多可以有5656個任務(wù)個任務(wù)u可確定性可確定性 全部全部 C/OS-IIC/OS-II的函數(shù)調(diào)用與服務(wù)的執(zhí)行時間具有可確定性。的函數(shù)調(diào)用與服務(wù)的執(zhí)行時間具有可確定性。u任務(wù)棧任務(wù)棧 每個任務(wù)有自己單獨的棧,每個任務(wù)有自己單獨

7、的棧, C/OS-IIC/OS-II允許每個任務(wù)有不同的??臻g,以便壓低應(yīng)允許每個任務(wù)有不同的??臻g,以便壓低應(yīng)用程序?qū)τ贸绦驅(qū)AMRAM的需求。的需求。u系統(tǒng)服務(wù)系統(tǒng)服務(wù) C/OS-IIC/OS-II提供很多系統(tǒng)服務(wù),例如郵箱、消息隊列、信號量、塊大小固定的內(nèi)存提供很多系統(tǒng)服務(wù),例如郵箱、消息隊列、信號量、塊大小固定的內(nèi)存的申請與釋放、時間相關(guān)函數(shù)等。的申請與釋放、時間相關(guān)函數(shù)等。u中斷管理中斷管理 中斷可以使正在執(zhí)行的任務(wù)暫時掛起,如果優(yōu)先級更高的任務(wù)被該中斷喚醒,則中斷可以使正在執(zhí)行的任務(wù)暫時掛起,如果優(yōu)先級更高的任務(wù)被該中斷喚醒,則高優(yōu)先級的任務(wù)在中斷嵌套全部退出后立即執(zhí)行,中斷嵌套

8、層數(shù)可達(dá)高優(yōu)先級的任務(wù)在中斷嵌套全部退出后立即執(zhí)行,中斷嵌套層數(shù)可達(dá)255255層。層。u穩(wěn)定性與可靠性穩(wěn)定性與可靠性C/OS的性能特點(二)7 C/OS-IIC/OS-II圖書圖書l描述了描述了 C/OS-IIC/OS-II內(nèi)部的工作原理內(nèi)部的工作原理l隨書的隨書的CDCD中包含了源代碼中包含了源代碼n工業(yè)界最清晰的源代碼工業(yè)界最清晰的源代碼l除英文版外,有中文和韓文版除英文版外,有中文和韓文版ChineseKoreanEnglishISBN 1-57820-103-9美國CMP BOOK ISBN 7-81077-290-2北京航空航天大學(xué)出版社ISBN 89-951540-5-58C/O

9、S-II的各種商業(yè)應(yīng)用l全世界有數(shù)百種產(chǎn)品在應(yīng)用全世界有數(shù)百種產(chǎn)品在應(yīng)用: :lAvionicslMedicallCell phoneslRouters and switcheslHigh-end audio equipmentlWashing machines and dryerslUPS (Uninterruptible Power Supplies)lIndustrial controllerslGPS Navigation SystemslMicrowave RadioslInstrumentationlPoint-of-sale terminalsl更多更多9C/OS-II提供的系統(tǒng)

10、服務(wù)l信號量信號量l帶互斥機(jī)制的信號量帶互斥機(jī)制的信號量n減少優(yōu)先級倒置的問題減少優(yōu)先級倒置的問題l事件標(biāo)志事件標(biāo)志l消息信箱消息信箱l消息隊列消息隊列l(wèi)內(nèi)存管理內(nèi)存管理l時鐘管理時鐘管理l任務(wù)管理任務(wù)管理10 C/GUI and C/FSl C/GUIC/GUIl嵌入式的用戶界面嵌入式的用戶界面l用用ANSI CANSI C書寫書寫l支持任何支持任何8, 16, 32-bits CPU8, 16, 32-bits CPUl彩色,灰、度,等級或黑白顯示彩色,灰、度,等級或黑白顯示l代碼尺寸小代碼尺寸小l C/FSC/FSl嵌入式的文件系統(tǒng)嵌入式的文件系統(tǒng)Written in ANSI CWri

11、tten in ANSI Cl用用ANSI CANSI C書寫書寫l支持任何支持任何8, 16, 32-bits CPU8, 16, 32-bits CPUl支持支持SMC, MMC, SD, CF, IDE, Flash, RAMSMC, MMC, SD, CF, IDE, Flash, RAM其他介質(zhì)其他介質(zhì)11本節(jié)提要本節(jié)提要 C/OS-簡介簡介 C/OS-內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu) C/OS-任務(wù)通信與同步任務(wù)通信與同步 C/OS-C/OS-任務(wù)管理任務(wù)管理 C/OS-時間管理時間管理 C/OS-移植移植12C/OS-II的文件結(jié)構(gòu)13l內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu)l任務(wù)管理任務(wù)管理l時間管理時間管理l任務(wù)

12、之間通信與同步任務(wù)之間通信與同步l C/OSC/OS的移植的移植C/OS-II的內(nèi)核結(jié)構(gòu)14任務(wù)task典型的任務(wù)一個無限循環(huán)。典型的任務(wù)一個無限循環(huán)。void mytask(void void mytask(void * *pdata)pdata) for (;) for (;) do something; do something; waiting; waiting; do something; do something; l C/OSC/OS II 2.5II 2.5版本支持版本支持6464個任務(wù),每個任務(wù)一個特定的優(yōu)先級。優(yōu)先級越高個任務(wù),每個任務(wù)一個特定的優(yōu)先級。優(yōu)先級越高,數(shù)字越小

13、。,數(shù)字越小。l系統(tǒng)占用了系統(tǒng)占用了8 8個任務(wù),保留優(yōu)先級為個任務(wù),保留優(yōu)先級為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。15任務(wù)狀態(tài)任務(wù)狀態(tài)16任務(wù)控制塊(TCB)l任務(wù)控制塊任務(wù)控制塊 OS_TCBOS_TCB是一個數(shù)據(jù)結(jié)構(gòu),保存該任務(wù)的相關(guān)參是一個數(shù)據(jù)結(jié)構(gòu),保存該任務(wù)的相關(guān)參數(shù),包括任務(wù)堆棧指針,狀態(tài),優(yōu)先級,任務(wù)表位置,任數(shù),包

14、括任務(wù)堆棧指針,狀態(tài),優(yōu)先級,任務(wù)表位置,任務(wù)鏈表指針等。務(wù)鏈表指針等。l所有的任務(wù)控制塊分為兩條鏈表,空閑鏈表和使用鏈表。所有的任務(wù)控制塊分為兩條鏈表,空閑鏈表和使用鏈表。17 C/OS-IIC/OS-II任務(wù)控制塊任務(wù)控制塊. .typedef struct os_tcb OS_STK *OSTCBStkPtr;#if OS_TASK_CREATE_EXT_EN0 void *OSTCBExtPtr; OS_STK *OSTCBStkBottom; INT32U OSTCBStkSize; INT16U OSTCBOpt; INT16U OSTCBId;#endif struct os_t

15、cb *OSTCBNext; struct os_tcb *OSTCBPrev;#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN | OS_SEM_EN OS_EVENT *OSTCBEventPtr;#endif18#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN void *OSTCBMsg;#endif INT16U OSTCBDly; INT8U OSTCBStat; INT8U OSTCBPrio; INT8U OSTCBX; INT8U OSTCBY; INT8U OSTCBBitX; INT8U OSTC

16、BBitY;#if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq;#endif OS_TCB;19任務(wù)控制塊任務(wù)控制塊OS_TCBOS_TCB中幾個成員的算法中幾個成員的算法OSTCBY= priority 3;OSTCBBitY= OSMapTblpriority 3;OSTCBX= priority & 0 x07;OSTCBBitX= OSMapTblpriority & 0 x07;20空任務(wù)列表空任務(wù)列表所有的任務(wù)控制塊都被放置在任務(wù)控制塊列表數(shù)組所有的任務(wù)控制塊都被放置在任務(wù)控制塊列表數(shù)組OSTCBTbl中,中,系統(tǒng)初始化時,所有任務(wù)控制塊被鏈接成空任務(wù)控制

17、塊的單向鏈表,系統(tǒng)初始化時,所有任務(wù)控制塊被鏈接成空任務(wù)控制塊的單向鏈表,任務(wù)建立后,空任務(wù)控制塊指針任務(wù)建立后,空任務(wù)控制塊指針OSTCBFreeList指向的任務(wù)控制塊指向的任務(wù)控制塊就賦給了該任務(wù),然后就賦給了該任務(wù),然后OSTCBFreeList的值調(diào)整為指向鏈表中的下的值調(diào)整為指向鏈表中的下一個空任務(wù)控制塊。一個空任務(wù)控制塊。21任務(wù)控制塊初始化函數(shù)INT8U OS_TCBInit ( INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt )22任務(wù)級的任務(wù)

18、調(diào)度-OSSchedl C/OSC/OS是占先式實時多任務(wù)內(nèi)核,優(yōu)先級最高的任務(wù)一旦準(zhǔn)備就是占先式實時多任務(wù)內(nèi)核,優(yōu)先級最高的任務(wù)一旦準(zhǔn)備就緒,則擁有緒,則擁有CPUCPU的所有權(quán)開始投入運行。的所有權(quán)開始投入運行。l C/OSC/OS中不支持時間片輪轉(zhuǎn)法,每個任務(wù)的優(yōu)先級要求不一樣且中不支持時間片輪轉(zhuǎn)法,每個任務(wù)的優(yōu)先級要求不一樣且是唯一的,所以任務(wù)調(diào)度的工作就是:查找準(zhǔn)備就緒的最高優(yōu)先是唯一的,所以任務(wù)調(diào)度的工作就是:查找準(zhǔn)備就緒的最高優(yōu)先級的任務(wù)并進(jìn)行上下文切換。級的任務(wù)并進(jìn)行上下文切換。l C/OSC/OS任務(wù)調(diào)度所花的時間為常數(shù),與應(yīng)用程序中建立的任務(wù)數(shù)任務(wù)調(diào)度所花的時間為常數(shù),與應(yīng)

19、用程序中建立的任務(wù)數(shù)無關(guān)。無關(guān)。23根據(jù)就緒表確定最高優(yōu)先級兩個關(guān)鍵兩個關(guān)鍵: :l優(yōu)先級數(shù)分解為高三位和低三位分別確定;優(yōu)先級數(shù)分解為高三位和低三位分別確定;l高優(yōu)先級有高優(yōu)先級有著小的優(yōu)先級號 ;24根據(jù)優(yōu)先級找到任務(wù)在就緒任務(wù)表中的位置每個就緒的任務(wù)都放入就緒表中(每個就緒的任務(wù)都放入就緒表中(ready listready list)中,就緒表有兩個變)中,就緒表有兩個變量:量:OSRdyGrpOSRdyGrp、OSRdyTblOSRdyTblOSRdyGrp1207 6 5 4 300XXXYY Y任務(wù)優(yōu)先級20176543108915 14 13 1212 1118161723 2

20、2 2121 20 1926242531 30 29 28 2734323339 38 37 36 3542404147 46 45 44 4350484955 54 53 52 5158565763 62 61 60 5901234567OSRdyTbl7XY優(yōu)先級最低任務(wù)(空閑任務(wù))優(yōu)先級最高任務(wù)任務(wù)優(yōu)先級號25根據(jù)優(yōu)先級確定就緒表(1)n假設(shè)優(yōu)先級為假設(shè)優(yōu)先級為1212的任務(wù)進(jìn)入就緒狀態(tài),的任務(wù)進(jìn)入就緒狀態(tài),12=1100b,12=1100b,則則OSRdyTbl1OSRdyTbl1的第的第4 4位置位置1 1,且,且OSRdyGrpOSRdyGrp的第的第1 1位置位置1 1,相應(yīng)的數(shù)

21、學(xué)表達(dá)式為,相應(yīng)的數(shù)學(xué)表達(dá)式為: : OSRdyGrp |=0 x02OSRdyGrp |=0 x02; OSRdyTbl1 |=0 x10;OSRdyTbl1 |=0 x10;n而優(yōu)先級為而優(yōu)先級為2121的任務(wù)就緒的任務(wù)就緒21=10 101b21=10 101b,則,則OSRdyTbl2OSRdyTbl2的第的第5 5位置位置1 1,且,且OSRdyGrpOSRdyGrp的第的第2 2位置位置1,1,相應(yīng)的數(shù)學(xué)表達(dá)式為:相應(yīng)的數(shù)學(xué)表達(dá)式為: OSRdyGrp |=0 x04OSRdyGrp |=0 x04; OSRdyTbl2 |=0 x20;OSRdyTbl2 |=0 x20;26根據(jù)

22、優(yōu)先級確定就緒表(2)l從上面的計算我們可以得到從上面的計算我們可以得到: :若若OSRdyGrpOSRdyGrp及及OSRdyBblOSRdyBbl的第的第n n位置位置1 1,則應(yīng)該把,則應(yīng)該把OSRdyGrpOSRdyGrp及及OSRdyBblOSRdyBbl的值與的值與2 2n n 相或。相或。uC/OSuC/OS中,把中,把2 2n n的的n=0-7n=0-7的的8 8個值先計算好存在數(shù)組個值先計算好存在數(shù)組OSMapTbl7OSMapTbl7中中, ,也就是:也就是: OSMapTbl0 =2OSMapTbl0 =20 0=0 x01=0 x01(0000 00010000 000

23、1) OSMapTbl1 =2OSMapTbl1 =21 1=0 x02=0 x02(0000 00100000 0010) OSMapTbl7 =2 OSMapTbl7 =27 7=0 x80=0 x80(1000 00001000 0000)27使任務(wù)進(jìn)入就緒態(tài)n如果如果prioprio是任務(wù)是優(yōu)先級,也是任務(wù)的識別號,則將任務(wù)放入就緒表是任務(wù)是優(yōu)先級,也是任務(wù)的識別號,則將任務(wù)放入就緒表,即使任務(wù)進(jìn)入就緒態(tài)的方法是:,即使任務(wù)進(jìn)入就緒態(tài)的方法是:OSRdyGrp |=OSMapTblprio3;OSRdyGrp |=OSMapTblprio3;OSRdyTblprio3 |=OSMapT

24、blprio & 0 x07;OSRdyTblprio3 |=OSMapTblprio & 0 x07;n假設(shè)優(yōu)先級為假設(shè)優(yōu)先級為12121100b1100bOSRdyGrp |=0 x02OSRdyGrp |=0 x02;OSRdyTbl1 |=0 x10;OSRdyTbl1 |=0 x10;28使任務(wù)脫離就緒態(tài)n將任務(wù)就緒表將任務(wù)就緒表OSRdyTblprio3OSRdyTblprio3相應(yīng)元素的相應(yīng)位清零,而且當(dāng)相應(yīng)元素的相應(yīng)位清零,而且當(dāng)OSRdyTblprio3OSRdyTblprio3中的所有位都為零時,即全組任務(wù)中沒有一個進(jìn)中的所有位都為零時,即全組任務(wù)中沒有一個進(jìn)入就緒態(tài)時,入

25、就緒態(tài)時,OSRdyGrpOSRdyGrp的相應(yīng)位才為零。的相應(yīng)位才為零。If(OSRdyTblprio3&= If(OSRdyTblprio3&= OSMapTblprio & 0 x07)=0)OSMapTblprio & 0 x07)=0)OSRdyGrp&= OSRdyGrp&= OSMapTblprio3;OSMapTblprio3;29根據(jù)就緒表確定最高優(yōu)先級l通過通過OSRdyGrpOSRdyGrp值確定高值確定高3 3位,假設(shè)為位,假設(shè)為0 x24=100 100b, -0 x24=100 100b, - 對應(yīng)對應(yīng)OSRdyTbl2 OSRdyTbl2 和和OSRdyTbl5O

26、SRdyTbl5,高優(yōu)先級為,高優(yōu)先級為2 2l通過通過OSRdyTbl2OSRdyTbl2的值來確定低的值來確定低3 3位,位, 假設(shè)為假設(shè)為0 x12=010 010b 0 x12=010 010b ,-第第2 2個和第個和第5 5個任務(wù),取高優(yōu)先級個任務(wù),取高優(yōu)先級為為2 2,則最高優(yōu)先級的任務(wù)號為,則最高優(yōu)先級的任務(wù)號為1717OSRdyGrp0 01 10 00 0 0 0 1 1 0 0 0 00001000 1任務(wù)優(yōu)先級20176543108915 14 13 12 110 001 1000 01 10 026242531 30 29 28 2734323339 38 37 36

27、 3542404147 46 45 44 4350484955 54 53 52 5158565763 62 61 60 5901234567OSRdyTbl7XY30源代碼中使用了查表法 查表法具有確定的時間,增加了系統(tǒng)的可預(yù)測性,查表法具有確定的時間,增加了系統(tǒng)的可預(yù)測性,uC/OSuC/OS中所有的中所有的系統(tǒng)調(diào)用時間都是確定的系統(tǒng)調(diào)用時間都是確定的High3 =OSUnMapTblOSRdyGrp;High3 =OSUnMapTblOSRdyGrp;Low3 =OSUnMapTblOSRdyTblHigh3;Low3 =OSUnMapTblOSRdyTblHigh3;Prio =(Hi

28、gn33)+Low3;Prio =(Hign33)+Low3;OSRdyGrp1207 6 5 4 300XXXYY Y任務(wù)優(yōu)先級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 5901234567OSRdyTbl7XY31INT8U const OSUnMapTbl = 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1

29、, 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, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1

30、, 0, 2, 0, 1, 0, 3, 0, 1, 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

31、, 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;優(yōu)先級判定表OSUnMapTbl256舉例:舉例: 如如OSRdyGrpOSRdyGrp的值為的值為01101000B01101000B,即,即0X680X68,則查得,則查得OSUnMapTblOSRdyGrpOSUnMapTblOSRdyGrp的值是的值是3 3,它相應(yīng)于,它相應(yīng)于OSRdyGrpOSRdyGrp中的第中的第3 3位置位置1 1;

32、 如如OSRdyTbl3OSRdyTbl3的值是的值是11100100B11100100B,即,即0XE40XE4,則查,則查OSUnMapTblOSRdyTbl3OSUnMapTblOSRdyTbl3的的值是值是2 2,則進(jìn)入就緒態(tài)的最高,則進(jìn)入就緒態(tài)的最高任務(wù)優(yōu)先級任務(wù)優(yōu)先級 Prio=3Prio=3* *8+2=268+2=26 32Task schedulervoid OSSched (void) INT8U y; OS_ENTER_CRITICAL(); if (OSLockNesting =0)&(OSIntNesting= 0) y = OSUnMapTblOSRdyGrp; O

33、SPrioHighRdy = (INT8U)(y 3) + OSUnMapTblOSRdyTbly) if (OSPrioHighRdy != OSPrioCur) OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; OSCtxSwCtr+; OS_TASK_SW(); OS_EXIT_CRITICAL();33void OSSchedLock (void) if (OSRunning = TRUE) OS_ENTER_CRITICAL(); if(OSLockNesting 0) OSLockNesting-; if (OSLockNesting=0)&(OS

34、IntNesting=0) OS_EXIT_CRITICAL(); OSSched(); else OS_EXIT_CRITICAL(); else OS_EXIT_CRITICAL(); 35任務(wù)切換l將被掛起的任務(wù)寄存器入棧將被掛起的任務(wù)寄存器入棧l將較高優(yōu)先級任務(wù)的寄存器出棧將較高優(yōu)先級任務(wù)的寄存器出棧36任務(wù)級的任務(wù)切換OS_TASK_SW()lOS_TASK_SW()OS_TASK_SW()是宏調(diào)用,含有微處理器的軟中斷指令是宏調(diào)用,含有微處理器的軟中斷指令lOS_TASK_SW()OS_TASK_SW()將處理器相關(guān)的軟件中斷機(jī)制封裝起來,便于操作將處理器相關(guān)的軟件中斷機(jī)制封裝起來

35、,便于操作系統(tǒng)移植系統(tǒng)移植37調(diào)用OS_TASK_SW()前的數(shù)據(jù)結(jié)構(gòu)低優(yōu)先級任務(wù) OS_TCBOSTCBCur(1)存貯器低地址存貯器高地址堆棧方向堆棧方向SPR1R2R3R4PCPSW存貯器低地址存貯器高地址高優(yōu)先級任務(wù) OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)PSWPCR1R2R3R438保存當(dāng)前CPU寄存器的值低優(yōu)先級任務(wù) OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存貯器低地址存貯器高地址高優(yōu)先級任務(wù) OS_TCBOSTCBHighRdy(3)(2)CP

36、U(4)(5)(1)(3)39重新裝入要運行的任務(wù)低優(yōu)先級任務(wù) OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存貯器低地址存貯器高地址高優(yōu)先級任務(wù) OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)40任務(wù)切換OS_TASK_SW()的代碼Void OSCtxSw(void)Void OSCtxSw(void) 將將R1,R2,R3R1,R2,R3及及R4R4推入當(dāng)前堆棧;推入當(dāng)前堆棧; OSTCBCurOSTCBCurOSTCBStk

37、Ptr = SP;OSTCBStkPtr = SP; OSTCBCur = OSTCBHighRdy; OSTCBCur = OSTCBHighRdy; SP = OSTCBHighRdy SP = OSTCBHighRdy OSTCBSTKPtr;OSTCBSTKPtr; 將將R4,R3,R2R4,R3,R2及及R1R1從新堆棧中彈出;從新堆棧中彈出; 執(zhí)行中斷返回指令;執(zhí)行中斷返回指令; 41C/OS-II中的中斷l(xiāng)中斷:中斷:由于某種事件的發(fā)生,而導(dǎo)致程序流程的改變。產(chǎn)生中斷的由于某種事件的發(fā)生,而導(dǎo)致程序流程的改變。產(chǎn)生中斷的事件稱為中斷源。事件稱為中斷源。lCPU響應(yīng)中斷的條件:響應(yīng)

38、中斷的條件:n至少有一個中斷源向至少有一個中斷源向CPU發(fā)出中斷信號;發(fā)出中斷信號;n系統(tǒng)允許中斷,且對此中斷信號未予屏蔽系統(tǒng)允許中斷,且對此中斷信號未予屏蔽l中斷類型:中斷類型:n硬件中斷硬件中斷 n外部中斷外部中斷n陷阱中斷陷阱中斷n現(xiàn)場控制量的中斷現(xiàn)場控制量的中斷42 C/OSC/OS-II-II中的中斷服務(wù)子程序中的中斷服務(wù)子程序用戶中斷服務(wù)子程序:用戶中斷服務(wù)子程序: 保存全部保存全部CPUCPU寄存器;寄存器; 調(diào)用調(diào)用OSIntEnter()OSIntEnter()或或OSIntNestingOSIntNesting直接加直接加1 1; if(OSIntNesting=1)if(

39、OSIntNesting=1) OSTCBCur-OSTCBStkPtr=SP; OSTCBCur-OSTCBStkPtr=SP; 清中斷源;清中斷源; 重新開中斷;重新開中斷; 執(zhí)行用戶代碼做中斷服務(wù);執(zhí)行用戶代碼做中斷服務(wù); 調(diào)用調(diào)用OSIntExit();OSIntExit(); 恢復(fù)所有恢復(fù)所有CPUCPU寄存器;寄存器; 執(zhí)行中斷返回指令;執(zhí)行中斷返回指令;4344uC/OS-II about beginning an ISRvoid OSIntEnter(void)OS_ENTER_CRITICAL();OSIntNesting+;OS_EXIT_CRITICAL();45Sear

40、ch for highest priority similar to schedulerHalf context switch is done by interrupt response i.e. registers saved46中斷與時鐘節(jié)拍中斷與時鐘節(jié)拍l時鐘節(jié)拍(時鐘滴答)時鐘節(jié)拍(時鐘滴答)TickTick,是一種定時器中斷,可通過編程方,是一種定時器中斷,可通過編程方式實現(xiàn)式實現(xiàn)l時鐘節(jié)拍是一種特殊的中斷,操作系統(tǒng)的心臟。首先時鐘節(jié)拍是一種特殊的中斷,操作系統(tǒng)的心臟。首先3232位的整數(shù)位的整數(shù)OSTimeOSTime加一。對任務(wù)列表進(jìn)行掃描,判斷是否有延時任務(wù)應(yīng)該處加一。對任務(wù)列

41、表進(jìn)行掃描,判斷是否有延時任務(wù)應(yīng)該處于準(zhǔn)備就緒狀態(tài),最后進(jìn)行上下文切換。于準(zhǔn)備就緒狀態(tài),最后進(jìn)行上下文切換。47時鐘節(jié)拍中斷服務(wù)子程序時鐘節(jié)拍中斷服務(wù)子程序Void OSTickISR(void) 保存處理器寄存器的值; 調(diào)用OSIntEnter(),或是將OSIntNesting加1 if(OSIntNesting=1) OSTCBCur-OSTCBStkPtr=SP; 調(diào)用OSTimeTick(); 清發(fā)出中斷設(shè)備的中斷; 重新允許中斷(可選用) 調(diào)用OSIntExit(); 恢復(fù)處理器寄存器的值; 執(zhí)行中斷返回指令;48void OSTimeTick (void) OS_TCB *ptc

42、b; OSTimeTickHook(); (1) ptcb = OSTCBList; (2) while (ptcb-OSTCBPrio != OS_IDLE_PRIO) (3) OS_ENTER_CRITICAL(); if (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; pt

43、cb = ptcb-OSTCBNext; OS_EXIT_CRITICAL(); OS_ENTER_CRITICAL(); (6) OSTime+; (7)時鐘節(jié)拍函數(shù)時鐘節(jié)拍函數(shù)OSTimTick()OSTimTick()49void OSTaskIdle (void *pdata) pdata = pdata; for (;) OS_ENTER_CRITICAL(); OSIdleCtr+; OS_EXIT_CRITICAL(); 空閑任務(wù)空閑任務(wù)OSTaskIdle()50初始化統(tǒng)計任務(wù)初始化統(tǒng)計任務(wù)void main (void) OSInit(); /* 初始化初始化uC/OS-II

44、(1)*/ /* 安裝安裝uC/OS-II的任務(wù)切換向量的任務(wù)切換向量*/ /* 創(chuàng)建用戶起始任務(wù)創(chuàng)建用戶起始任務(wù)(以以TaskStart()作為起始任務(wù)作為起始任務(wù))(2)*/ OSStart(); /* 開始多任務(wù)調(diào)度開始多任務(wù)調(diào)度(3)*/void TaskStart (void *pdata) /* 安裝并啟動安裝并啟動uC/OS-II的時鐘節(jié)拍的時鐘節(jié)拍 (4)*/ OSStatInit(); /* 初始化統(tǒng)計任務(wù)初始化統(tǒng)計任務(wù)(5)*/ /* 創(chuàng)建用戶應(yīng)用程序任務(wù)創(chuàng)建用戶應(yīng)用程序任務(wù)*/ for (;) /* 這里是這里是TaskStart()的代碼的代碼!*/ 51 C/OSC/

45、OS-II-II初始化初始化l首先調(diào)用系統(tǒng)初始化函數(shù)首先調(diào)用系統(tǒng)初始化函數(shù)OSIint()。OSIint()初始化初始化C/OS-所有的所有的變量和數(shù)據(jù)結(jié)構(gòu)(見變量和數(shù)據(jù)結(jié)構(gòu)(見OS_CORE.C)。)。lOSInit()建立空閑任務(wù)建立空閑任務(wù)idle task,這個任務(wù)總是處于就緒態(tài)的??臻e,這個任務(wù)總是處于就緒態(tài)的??臻e任務(wù)任務(wù)OSTaskIdle()的優(yōu)先級總是設(shè)成最低,即()的優(yōu)先級總是設(shè)成最低,即OS_LOWEST_PRIO。l如果統(tǒng)計任務(wù)允許如果統(tǒng)計任務(wù)允許OS_TASK_STAT_EN和任務(wù)建立擴(kuò)展允許都設(shè)為和任務(wù)建立擴(kuò)展允許都設(shè)為1,則,則OSInit()還得建立統(tǒng)計任務(wù)還得

46、建立統(tǒng)計任務(wù)OSTaskStat()并且讓其進(jìn)入就緒態(tài)并且讓其進(jìn)入就緒態(tài)。OSTaskStat的優(yōu)先級總是設(shè)為的優(yōu)先級總是設(shè)為OS_LOWEST_PRIO-1 l空閑和統(tǒng)計任務(wù)的任務(wù)控制塊(空閑和統(tǒng)計任務(wù)的任務(wù)控制塊(OS_TCBs)是用雙向鏈表鏈接在一)是用雙向鏈表鏈接在一起的。起的。OSTCBList指向這個鏈表的起始處。當(dāng)建立一個任務(wù)時,這指向這個鏈表的起始處。當(dāng)建立一個任務(wù)時,這個任務(wù)總是被放在這個鏈表的起始處。個任務(wù)總是被放在這個鏈表的起始處。52調(diào)用OSInit()之后的數(shù)據(jù)結(jié)構(gòu) 53空閑緩沖區(qū)空閑緩沖區(qū)54C/OS-C/OS-的啟動的啟動void main (void) OSIn

47、it(); /* 初始化初始化uC/OS-II */ . . 通過調(diào)用通過調(diào)用OSTaskCreate()或或OSTaskCreateExt()創(chuàng)建至少一個任創(chuàng)建至少一個任務(wù)務(wù); . . OSStart(); /* 開始多任務(wù)調(diào)度開始多任務(wù)調(diào)度!OSStart()永遠(yuǎn)不永遠(yuǎn)不會返回會返回 */55啟動多任務(wù)啟動多任務(wù)void OSStart (void) INT8U y; INT8U x; if (OSRunning = FALSE) y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly; OSPrioHighRdy = (INT8U)(y OS_LO

48、WEST_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, 0, 0, (void *)0, 0); if (err = OS_NO_ERR) OS_ENTE

49、R_CRITICAL();61 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); 62堆棧檢驗,堆棧檢驗,OSTaskStkChk()OSTaskStkChk()刪除任務(wù),刪除任務(wù)

50、,OSTaskDel()OSTaskDel()請求刪除任務(wù),請求刪除任務(wù),OSTaskDelReq()OSTaskDelReq()改變?nèi)蝿?wù)的優(yōu)先級,改變?nèi)蝿?wù)的優(yōu)先級,OSTaskChangePrio()OSTaskChangePrio()掛起任務(wù),掛起任務(wù),OSTaskSuspend()OSTaskSuspend()恢復(fù)任務(wù),恢復(fù)任務(wù),OSTaskResume() OSTaskResume() 其它相關(guān)函數(shù)其它相關(guān)函數(shù)63本節(jié)提要本節(jié)提要 C/OS-簡介簡介 C/OS-C/OS-內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu) C/OS-任務(wù)通信與同步任務(wù)通信與同步 C/OS-C/OS-任務(wù)管理任務(wù)管理 C/OS-時間管理時

51、間管理 C/OS-移植移植64時間管理Five services:lOSTimeDLY()lOSTimeDLYHMSM()lOSTimeDlyResmue()lOStimeGet()lOSTimeSet()65OSTimeDly( )void OSTimeDly (INT16U ticks) if (ticks 0) OS_ENTER_CRITICAL(); if (OSRdyTblOSTCBCur-OSTCBY &= OSTCBCur-OSTCBBitX) = 0) OSRdyGrp &= OSTCBCur-OSTCBBitY; OSTCBCur-OSTCBDly = ticks; OS_E

52、XIT_CRITICAL(); OSSched(); 66延時詳解67OSTimeDlyHMSM( )68本節(jié)提要本節(jié)提要 C/OS-簡介簡介 C/OS-C/OS-內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu) C/OS-任務(wù)通信與同步任務(wù)通信與同步 C/OS-任務(wù)管理任務(wù)管理 C/OS-時間管理時間管理 C/OS-移植移植69任務(wù)間通信手段 C/OSC/OS中,采用多種方法保護(hù)任務(wù)之間的共享數(shù)據(jù)和提供任務(wù)之中,采用多種方法保護(hù)任務(wù)之間的共享數(shù)據(jù)和提供任務(wù)之間的通信。間的通信。u提供提供OS_ENTER_CRITICALOS_ENTER_CRITICAL和和OS_EXIT_CRITICALOS_EXIT_CRITICAL來

53、對臨界資源進(jìn)來對臨界資源進(jìn)行保護(hù)行保護(hù)uOSSchedLock( )OSSchedLock( )禁止調(diào)度保護(hù)任務(wù)級的共享資源。禁止調(diào)度保護(hù)任務(wù)級的共享資源。u提供了經(jīng)典操作系統(tǒng)任務(wù)間通信方法:信號量、郵箱、消息提供了經(jīng)典操作系統(tǒng)任務(wù)間通信方法:信號量、郵箱、消息隊列,事件標(biāo)志。隊列,事件標(biāo)志。 70事件控制塊ECB 程序程序4.5 ECB的結(jié)構(gòu)如下的結(jié)構(gòu)如下 - typedef struct void *OSEventPtr; /*指向消息或消息隊列的指針指向消息或消息隊列的指針*/ INT8U OSEventTblOS_EVENT_TBL_SIZE; /*等待任務(wù)列表等待任務(wù)列表*/ INT

54、16U OSEventCnt; /*計數(shù)器(當(dāng)事件是信號量時)計數(shù)器(當(dāng)事件是信號量時)*/ INT8U OSEventType; /*事件類型:信號量、郵箱等事件類型:信號量、郵箱等*/ INT8U OSEventGrp; /*等待任務(wù)組等待任務(wù)組*/ OS_EVENT; 與與TCB類似的結(jié)構(gòu),使用兩個鏈表,空閑鏈表與使用鏈表類似的結(jié)構(gòu),使用兩個鏈表,空閑鏈表與使用鏈表所有的通信信號都被看成是事件所有的通信信號都被看成是事件(event), (event), 一個稱為事件控制塊一個稱為事件控制塊(ECB, (ECB, Event Control Block)Event Control Blo

55、ck)的數(shù)據(jù)結(jié)構(gòu)來表征每一個具體事件,的數(shù)據(jù)結(jié)構(gòu)來表征每一個具體事件,ECBECB的結(jié)構(gòu)如下的結(jié)構(gòu)如下71事件的等待任務(wù)列表72空閑事件控制塊鏈表73事件控制塊TCB的操作對事件控制塊進(jìn)行的操作包括對事件控制塊進(jìn)行的操作包括l初始化一個事件控制塊初始化一個事件控制塊OS_EventWaitListInit()OS_EventWaitListInit();l使一個任務(wù)進(jìn)入就緒態(tài)使一個任務(wù)進(jìn)入就緒態(tài)OS_EventTaskRdy()OS_EventTaskRdy();l使一個任務(wù)進(jìn)入等待某事件的狀態(tài)使一個任務(wù)進(jìn)入等待某事件的狀態(tài)OS_EventTaskWait()OS_EventTaskWait(

56、);l因為等待超時而使一個任務(wù)進(jìn)入就緒態(tài)因為等待超時而使一個任務(wù)進(jìn)入就緒態(tài)OS_EventTO()OS_EventTO()。74信號量semaphorel信號量在多任務(wù)系統(tǒng)中用于:控制共享資源的使用權(quán)、標(biāo)志事件信號量在多任務(wù)系統(tǒng)中用于:控制共享資源的使用權(quán)、標(biāo)志事件的發(fā)生、使兩個任務(wù)的行為同步。的發(fā)生、使兩個任務(wù)的行為同步。luC/OSuC/OS中信號量由兩部分組成:信號量的計數(shù)值和等待該信號任中信號量由兩部分組成:信號量的計數(shù)值和等待該信號任務(wù)的等待任務(wù)表。信號量的計數(shù)值可以為二進(jìn)制務(wù)的等待任務(wù)表。信號量的計數(shù)值可以為二進(jìn)制, , 也可以是其他也可以是其他整數(shù)。整數(shù)。l系統(tǒng)通過系統(tǒng)通過OSS

57、emPend( )OSSemPend( )和和OSSemPost( )OSSemPost( )來支持信號量的兩種原子來支持信號量的兩種原子操作操作P()P()和和V()V()。P()P()操作減少信號量的值,如果新的信號量的值操作減少信號量的值,如果新的信號量的值不大于不大于0,0,則操作阻塞;則操作阻塞;V()V()操作增加信號量的值。操作增加信號量的值。 75任務(wù)、中斷服務(wù)子程序和信號量之間的關(guān)系 T Ta as sk kI IS SR RT Ta as sk kO OS SS Se em mP Pe en nd d( () )O OS SS Se em mA Ac cc ce ep pt

58、 t( () )O OS SS Se em mQ Qu ue er ry y( () )O OS SS Se em mP Po os st t( () )O OS SS Se em mP Po os st t( () )O OS SS Se em mA Ac cc ce ep pt t( () )O OR RO OS SS Se em mC Cr re ea at te e( () )N NN N76信號量操作lC/OS-IIC/OS-II提供了提供了5 5個對信號量進(jìn)行操作的函數(shù)。它們是:個對信號量進(jìn)行操作的函數(shù)。它們是:lOSSemCreate()OSSemCreate()lOSSemPe

59、nd()OSSemPend()lOSSemPost()OSSemPost()lOSSemAccept()OSSemAccept()lOSSemQuery()OSSemQuery()函數(shù)。函數(shù)。 77郵 箱l郵箱是郵箱是C/OS-IIC/OS-II中另一種通訊機(jī)制,它可以使一個任務(wù)中另一種通訊機(jī)制,它可以使一個任務(wù)或者中斷服務(wù)子程序向另一個任務(wù)發(fā)送一個指針型的變或者中斷服務(wù)子程序向另一個任務(wù)發(fā)送一個指針型的變量。該指針指向一個包含了特定量。該指針指向一個包含了特定“消息消息”的數(shù)據(jù)結(jié)構(gòu)。的數(shù)據(jù)結(jié)構(gòu)。為了在為了在C/OS-IIC/OS-II中使用郵箱,必須將中使用郵箱,必須將OS_CFG.HOS_

60、CFG.H中的中的OS_MBOX_ENOS_MBOX_EN常數(shù)置為常數(shù)置為1 1。l使用郵箱之前,必須先建立該郵箱。該操作可以通過調(diào)使用郵箱之前,必須先建立該郵箱。該操作可以通過調(diào)用用OSMboxCreate()OSMboxCreate()函數(shù)來完成,并且要指定指針的初始函數(shù)來完成,并且要指定指針的初始值。值。lC/OS-IIC/OS-II提供了提供了5 5種對郵箱的操作:種對郵箱的操作:OSMboxCreate()OSMboxCreate(),OSMboxPend()OSMboxPend(),OSMboxPost()OSMboxPost(),OSMboxAccept()OSMboxAccep

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論