嵌入式操作系統(tǒng)ucOS-II分析_第1頁(yè)
嵌入式操作系統(tǒng)ucOS-II分析_第2頁(yè)
嵌入式操作系統(tǒng)ucOS-II分析_第3頁(yè)
嵌入式操作系統(tǒng)ucOS-II分析_第4頁(yè)
已閱讀5頁(yè),還剩94頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)ucOS-II分析分析ucOS-II應(yīng)用程序基本結(jié)構(gòu)應(yīng)用程序基本結(jié)構(gòu)void task ( void* pdata )INT8U err;InitTimer(); / 可選可選For( ; ) / 你的應(yīng)用程序代碼你的應(yīng)用程序代碼 . OSTimeDly(1); / 可選可選一些重要的一些重要的ucOS-II API)任務(wù)類)任務(wù)類)消息類)消息類)同步類)同步類)時(shí)間類)時(shí)間類)臨界區(qū)與事件類)臨界區(qū)與事件類任務(wù)類和時(shí)間類是必須要首先掌握的兩種類型的任務(wù)類和時(shí)間類是必須要首先掌握的兩種類型的API )OSTaskCreate函數(shù)函數(shù) n這個(gè)函數(shù)應(yīng)該至少在這個(gè)函數(shù)應(yīng)

2、該至少在main函數(shù)內(nèi)調(diào)用一函數(shù)內(nèi)調(diào)用一次,在次,在OSInit函數(shù)調(diào)用之后調(diào)用,以創(chuàng)函數(shù)調(diào)用之后調(diào)用,以創(chuàng)建一個(gè)任務(wù)。建一個(gè)任務(wù)。n系統(tǒng)首先從系統(tǒng)首先從TCB空閑列表內(nèi)申請(qǐng)一個(gè)空空閑列表內(nèi)申請(qǐng)一個(gè)空的的TCB指針,然后根據(jù)用戶給出的參數(shù)指針,然后根據(jù)用戶給出的參數(shù)初始化任務(wù)堆棧,并在內(nèi)部的任務(wù)就緒初始化任務(wù)堆棧,并在內(nèi)部的任務(wù)就緒表內(nèi)標(biāo)記該任務(wù)為就緒狀態(tài)。最后返回,表內(nèi)標(biāo)記該任務(wù)為就緒狀態(tài)。最后返回,這樣一個(gè)任務(wù)就創(chuàng)建成功了。這樣一個(gè)任務(wù)就創(chuàng)建成功了。 )OSTaskSuspend函數(shù)函數(shù) n將指定的任務(wù)掛起。如果掛起的是當(dāng)前任將指定的任務(wù)掛起。如果掛起的是當(dāng)前任務(wù),會(huì)引發(fā)系統(tǒng)執(zhí)行任務(wù)切換先

3、導(dǎo)函數(shù)務(wù),會(huì)引發(fā)系統(tǒng)執(zhí)行任務(wù)切換先導(dǎo)函數(shù)OSShed來進(jìn)行一次任務(wù)切換。來進(jìn)行一次任務(wù)切換。 n這個(gè)函數(shù)只有一個(gè)優(yōu)先級(jí)參數(shù),在系統(tǒng)內(nèi)這個(gè)函數(shù)只有一個(gè)優(yōu)先級(jí)參數(shù),在系統(tǒng)內(nèi)部,優(yōu)先級(jí)除了表示一個(gè)任務(wù)執(zhí)行的先后部,優(yōu)先級(jí)除了表示一個(gè)任務(wù)執(zhí)行的先后次序外,還起著區(qū)分每一個(gè)任務(wù)的作用,次序外,還起著區(qū)分每一個(gè)任務(wù)的作用,即優(yōu)先級(jí)也是任務(wù)的即優(yōu)先級(jí)也是任務(wù)的ID。所以。所以u(píng)COS-II不允許出現(xiàn)相同優(yōu)先級(jí)的任務(wù)。不允許出現(xiàn)相同優(yōu)先級(jí)的任務(wù)。 )OSTaskResume函數(shù)函數(shù) n將指定的已經(jīng)掛起的任務(wù)恢復(fù)成就緒狀將指定的已經(jīng)掛起的任務(wù)恢復(fù)成就緒狀態(tài)。如果恢復(fù)任務(wù)的優(yōu)先級(jí)高于當(dāng)前任態(tài)。如果恢復(fù)任務(wù)的優(yōu)先級(jí)

4、高于當(dāng)前任務(wù),那么還會(huì)引發(fā)一次任務(wù)切換。務(wù),那么還會(huì)引發(fā)一次任務(wù)切換。 n參數(shù)類似參數(shù)類似OSTaskSuspend函數(shù),為指函數(shù),為指定任務(wù)的優(yōu)先級(jí)。需要特別說明是,本定任務(wù)的優(yōu)先級(jí)。需要特別說明是,本函數(shù)并不要求和函數(shù)并不要求和OSTaskSuspend函數(shù)函數(shù)成對(duì)使用。成對(duì)使用。 )OS_ENTER_CRITICAL宏宏 n分析一下分析一下OS_CPU.H文件,它涉及特定文件,它涉及特定CPU的實(shí)現(xiàn)。一般都被替換為一條或者幾的實(shí)現(xiàn)。一般都被替換為一條或者幾條嵌入式匯編代碼。其實(shí),它就是條嵌入式匯編代碼。其實(shí),它就是關(guān)中斷關(guān)中斷。 n只要任務(wù)不主動(dòng)放棄只要任務(wù)不主動(dòng)放棄CPU使用權(quán),別的任

5、使用權(quán),別的任務(wù)就沒有占用務(wù)就沒有占用CPU的機(jī)會(huì),這個(gè)任務(wù)就是的機(jī)會(huì),這個(gè)任務(wù)就是獨(dú)占了。進(jìn)入臨界區(qū)后,這個(gè)宏應(yīng)盡量少獨(dú)占了。進(jìn)入臨界區(qū)后,這個(gè)宏應(yīng)盡量少用,它會(huì)破壞系統(tǒng)的一些服務(wù),尤其是時(shí)用,它會(huì)破壞系統(tǒng)的一些服務(wù),尤其是時(shí)間服務(wù)。并使系統(tǒng)對(duì)外界響應(yīng)性能降低。間服務(wù)。并使系統(tǒng)對(duì)外界響應(yīng)性能降低。 )OS_EXIT_CRITICAL宏宏 n與與OS_ENTER_CRITICAL配套使用的配套使用的一個(gè)宏,在系統(tǒng)手冊(cè)說明里它是退出臨一個(gè)宏,在系統(tǒng)手冊(cè)說明里它是退出臨界區(qū),其實(shí)就是重新界區(qū),其實(shí)就是重新開中斷開中斷。n它必須和它必須和OS_ENTER_CRITICAL成對(duì)成對(duì)出現(xiàn),否則會(huì)帶來意想

6、不到的后果,如出現(xiàn),否則會(huì)帶來意想不到的后果,如系統(tǒng)會(huì)崩潰。我們應(yīng)盡量少用這兩個(gè)宏系統(tǒng)會(huì)崩潰。我們應(yīng)盡量少用這兩個(gè)宏調(diào)用,因?yàn)樗麄兊拇_會(huì)破壞系統(tǒng)的多任調(diào)用,因?yàn)樗麄兊拇_會(huì)破壞系統(tǒng)的多任務(wù)性能。務(wù)性能。 )OSTimeDly函數(shù)函數(shù) n這是調(diào)用最多的一個(gè)函數(shù),它的功能是這是調(diào)用最多的一個(gè)函數(shù),它的功能是先掛先掛起當(dāng)前任務(wù),然后進(jìn)行任務(wù)切換,在指定的起當(dāng)前任務(wù),然后進(jìn)行任務(wù)切換,在指定的時(shí)間到來之后,將當(dāng)前任務(wù)恢復(fù)為就緒狀態(tài),時(shí)間到來之后,將當(dāng)前任務(wù)恢復(fù)為就緒狀態(tài),但是并不一定運(yùn)行,如果恢復(fù)后是優(yōu)先級(jí)最但是并不一定運(yùn)行,如果恢復(fù)后是優(yōu)先級(jí)最高的就緒任務(wù)話,那么就運(yùn)行之。高的就緒任務(wù)話,那么就運(yùn)行之

7、。n可以將任務(wù)延時(shí)一定時(shí)間后再執(zhí)行它,依靠可以將任務(wù)延時(shí)一定時(shí)間后再執(zhí)行它,依靠時(shí)鐘機(jī)制進(jìn)行任務(wù)切換,暫時(shí)放棄時(shí)鐘機(jī)制進(jìn)行任務(wù)切換,暫時(shí)放棄CPU的使的使用權(quán),但多任務(wù)性能會(huì)降低。用權(quán),但多任務(wù)性能會(huì)降低。ucOS-II范例的源碼分析范例的源碼分析INCLUDES.H nucOS-II中所有的中所有的 *.C 文件都包括了以文件都包括了以下定義:下定義:#include includes.h“n唯一的缺點(diǎn)是唯一的缺點(diǎn)是INCLUDES.H中許多頭文中許多頭文件在一些件在一些*.C文件的編譯中是不需要的。文件的編譯中是不需要的。雖然逐個(gè)編譯這些文件要花費(fèi)額外的時(shí)雖然逐個(gè)編譯這些文件要花費(fèi)額外的時(shí)

8、間,但代碼的可移植性卻增加了。間,但代碼的可移植性卻增加了。 不依賴于編譯的數(shù)據(jù)類型不依賴于編譯的數(shù)據(jù)類型 可移植型數(shù)據(jù)類型的程序可移植型數(shù)據(jù)類型的程序Typedef unsigned char BOOLEAN;Typedef unsigned char INT8U;Typedef signed char INT8S;Typedef unsigned int INT16U;Typedef signed int INT16S;Typedef unsigned long INT32U;Typedef signed long INT32S;Typedef float FP32;Typedef dou

9、ble FP64;#define BYTE INT8S -|#define UBYTE INT8U -|#define WORD INT16S -| ucos-ucosII#define UWORD INT16U -|#define LONG INT32S -|#define ULONG INT32U -|全局變量全局變量 n定義全局宏的程序定義全局宏的程序#ifdef xxx_GLOBALS#define xxx_EXT#else#define xxx_EXT extern#endif.H 文件中每個(gè)全局變量都加上了文件中每個(gè)全局變量都加上了xxx_EXT的前綴。的前綴。xxx代表模塊的名字

10、。該模塊的代表模塊的名字。該模塊的.C文件中有以下定義:文件中有以下定義:#define xxx_GLOBALS#include includes.huCOS_II.H中有以下定義:中有以下定義: n#ifdef OS_GLOBALSn#define OS_EXTn#elsen#define OS_EXT externn#endif nOS_EXT INT32U OSIdleCtr;nOS_EXT INT32U OSIdleCtrRun;nOS_EXT INT32U OSIdleCtrMax;uCOS_II.C中有以下定義:中有以下定義: n#define OS_GLOBALSn#includ

11、e “includes.h” 當(dāng)編譯器處理當(dāng)編譯器處理uCOS_II.C時(shí),它使時(shí),它使uCOS_II.H變成如下所示,因?yàn)樽兂扇缦滤荆驗(yàn)镺S_EXT被被設(shè)置為空。編譯器就會(huì)將這些全局變量分配設(shè)置為空。編譯器就會(huì)將這些全局變量分配到內(nèi)存中。到內(nèi)存中。 nINT32U OSIdleCtr;nINT32U OSIdleCtrRun;nINT32U OSIdleCtrMax; 當(dāng)編譯器處理其他當(dāng)編譯器處理其他.C文件時(shí),頭文件變成了文件時(shí),頭文件變成了如下的樣子,因?yàn)槿缦碌臉幼?,因?yàn)镺S_GLOBAL沒有定義,沒有定義,所以所以O(shè)S_EXT被定義為被定義為extern。 nextern INT3

12、2U OSIdleCtr;nextern INT32U OSIdleCtrRun;nextern INT32U OSIdleCtrMax; 在這種情況下,不產(chǎn)生內(nèi)存分配,而任何在這種情況下,不產(chǎn)生內(nèi)存分配,而任何 .C文件都可以使用這些變量。這樣就只需在文件都可以使用這些變量。這樣就只需在 .H 文件中定義一次就可以了。文件中定義一次就可以了。OS_ENTER_CRITICAL() 和和 OS_EXIT_CRITICAL()nOS_ENTER_CRITICAL() 關(guān)中斷;關(guān)中斷;OS_EXIT_CRITICAL()開中斷。開中斷。n是為了保護(hù)臨界段代碼,這些代碼與處是為了保護(hù)臨界段代碼,這些

13、代碼與處理器有關(guān)。宏的定義在理器有關(guān)。宏的定義在OS_CPU.H中。中。n關(guān)中斷會(huì)影響中斷延遲,所以要特別小關(guān)中斷會(huì)影響中斷延遲,所以要特別小心。用戶還可以用信號(hào)量來保護(hù)臨界段心。用戶還可以用信號(hào)量來保護(hù)臨界段代碼。代碼。 基于基于PC的服務(wù)的服務(wù) nPC.C 文件和文件和 PC.H 文件是范例中使文件是范例中使用到的一些基于用到的一些基于PC的服務(wù)程序。的服務(wù)程序。 nPC.C包括字符顯示,時(shí)間度量和其包括字符顯示,時(shí)間度量和其他各種服務(wù)。所有的函數(shù)都以他各種服務(wù)。所有的函數(shù)都以PC_為為前綴。前綴。 字符顯示字符顯示 nPC_DispClrScr()Clear the screennPC_

14、DispClrLine()Clear a single row (or line)nPC_DispChar()Display a single ASCII character anywhere on the screennPC_DispStr()Display an ASCII string anywhere on the screen時(shí)間度量時(shí)間度量 n用用PC的的82C54定時(shí)器定時(shí)器2測(cè)試一個(gè)函數(shù)的運(yùn)行花測(cè)試一個(gè)函數(shù)的運(yùn)行花了多少時(shí)間。被測(cè)的程序代碼放在函數(shù)了多少時(shí)間。被測(cè)的程序代碼放在函數(shù)PC_ElapsedStart()和和PC_ElapsedStop()之之間來測(cè)量。在用這兩個(gè)函數(shù)

15、之前,應(yīng)該調(diào)用間來測(cè)量。在用這兩個(gè)函數(shù)之前,應(yīng)該調(diào)用PC_ElapsedInit()來初始化,它主要是計(jì)算運(yùn)來初始化,它主要是計(jì)算運(yùn)行這兩個(gè)函數(shù)本身所附加的的時(shí)間。這樣,行這兩個(gè)函數(shù)本身所附加的的時(shí)間。這樣,PC_ElapsedStop()函數(shù)中返回的數(shù)值就是準(zhǔn)函數(shù)中返回的數(shù)值就是準(zhǔn)確的測(cè)量結(jié)果了。這兩個(gè)函數(shù)都不具備可重入確的測(cè)量結(jié)果了。這兩個(gè)函數(shù)都不具備可重入性,不要有多個(gè)任務(wù)同時(shí)調(diào)用這兩個(gè)函數(shù)。性,不要有多個(gè)任務(wù)同時(shí)調(diào)用這兩個(gè)函數(shù)。 測(cè)量測(cè)量PC_DisplayChar()的執(zhí)的執(zhí)行時(shí)間(行時(shí)間(us)n測(cè)量代碼執(zhí)行時(shí)間的程序測(cè)量代碼執(zhí)行時(shí)間的程序INT16U time; PC_Elaps

16、edInit();.PC_ElapsedStart();PC_DispChar(40, 24, A, DISP_FGND_WHITE);time = PC_ElapsedStop();應(yīng)用應(yīng)用 C/OS-II 的范例的范例 n用用BC IDE (Integrated Development Environment)編譯通編譯通過,在過,在WindowsXP 的的DOS窗口下編窗口下編譯運(yùn)行。可執(zhí)行代碼在每個(gè)范例的譯運(yùn)行??蓤?zhí)行代碼在每個(gè)范例的OBJ子目錄中。子目錄中。 IDE中編譯選項(xiàng)中編譯選項(xiàng)nCode generation Model: LargeOptions: Treat enums

17、as intsAssume SS Equals DS: Default for memory modelnAdvanced code generation Floating point: EmulationInstruction set: 80186Options: Generate underbars Debug info in OBJs Fast floating pointIDE中編譯選項(xiàng)中編譯選項(xiàng)nOptimizationsGlobal register allocation Invariant code motion Induction variables Loop optimiza

18、tion Suppress redundant loads Copy propagation Dead code elimination Jump optimization In-line intrinsic functionsIDE中編譯選項(xiàng)中編譯選項(xiàng)nRegister variables AutomaticnCommon subexpressions Optimize globallynOptimize for Speed例例1n有有13個(gè)任務(wù)個(gè)任務(wù)(包括包括 C/OS-II 的空閑任務(wù)和一個(gè)計(jì)的空閑任務(wù)和一個(gè)計(jì)算算CPU利用率的任務(wù))。利用率的任務(wù))。TaskStart()在函數(shù)在函數(shù)m

19、ain()中建立,功能是建立其它任務(wù)并且在屏幕上顯示如中建立,功能是建立其它任務(wù)并且在屏幕上顯示如下統(tǒng)計(jì)信息:下統(tǒng)計(jì)信息:n每秒鐘任務(wù)切換次數(shù);每秒鐘任務(wù)切換次數(shù);CPU利用百分率;寄存器切利用百分率;寄存器切換次數(shù);目前日期和時(shí)間;換次數(shù);目前日期和時(shí)間;C/OS-II的版本號(hào);的版本號(hào);n TaskStart()還檢查是否按下還檢查是否按下ESC鍵,以決定是否鍵,以決定是否返回到返回到DOS。n其余其余10個(gè)任務(wù)基于相同的代碼個(gè)任務(wù)基于相同的代碼Task();每個(gè)任;每個(gè)任務(wù)在屏幕上隨機(jī)的位置顯示一個(gè)務(wù)在屏幕上隨機(jī)的位置顯示一個(gè)0到到9的數(shù)字。的數(shù)字。main() nmain()程序從清整

20、個(gè)屏幕開始,為的是保程序從清整個(gè)屏幕開始,為的是保證屏幕上不留有以前的證屏幕上不留有以前的DOS下的顯示。下的顯示。n用戶在使用任何服務(wù)之前先調(diào)用用戶在使用任何服務(wù)之前先調(diào)用OSInit() 。建立兩個(gè)任務(wù):空閑任務(wù)和統(tǒng)計(jì)任務(wù),前者建立兩個(gè)任務(wù):空閑任務(wù)和統(tǒng)計(jì)任務(wù),前者在沒有其它任務(wù)處于就緒態(tài)時(shí)運(yùn)行;后者計(jì)在沒有其它任務(wù)處于就緒態(tài)時(shí)運(yùn)行;后者計(jì)算算CPU的利用率。的利用率。main()程序程序nvoid main (void) PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); (1) OSInit(); (2) PC_DOSSaveReturn

21、(); /保存保存當(dāng)前當(dāng)前DOS環(huán)境環(huán)境 (3) PC_VectSet(uCOS, OSCtxSw); /設(shè)置任務(wù)切換處理函數(shù)設(shè)置任務(wù)切換處理函數(shù) (4) RandomSem = OSSemCreate(1); /信號(hào)量置為信號(hào)量置為1,在某一時(shí)刻只,在某一時(shí)刻只有一個(gè)任務(wù)可以調(diào)用隨機(jī)數(shù)產(chǎn)生函數(shù)有一個(gè)任務(wù)可以調(diào)用隨機(jī)數(shù)產(chǎn)生函數(shù) (5) OSTaskCreate(TaskStart, (void *)0, /啟動(dòng)多任務(wù)啟動(dòng)多任務(wù)OSStart()之前,用戶至少要先建立一個(gè)任務(wù)如之前,用戶至少要先建立一個(gè)任務(wù)如TaskStart()(void*)&TaskStartStkTASK_STK_

22、SIZE-1, 0); (6) OSStart(); /啟動(dòng)多任務(wù)啟動(dòng)多任務(wù) (7)OSInit()初始化初始化【在在OS_CORE.C中定義中定義】 void OSInit (void)#if OS_VERSION = 204 OSInitHookBegin(); /系統(tǒng)初始化開始接口函數(shù)系統(tǒng)初始化開始接口函數(shù)#endif OS_InitMisc(); /初始化變量初始化變量 OS_InitRdyList(); /初始化任務(wù)就緒列表初始化任務(wù)就緒列表 OS_InitTCBList(); /初始化任務(wù)控制塊列表初始化任務(wù)控制塊列表 OS_InitEventList(); /初始化事件控制塊列表

23、初始化事件控制塊列表 OSInit()初始化(續(xù))初始化(續(xù))#if (OS_VERSION = 251) & (OS_FLAG_EN 0) & (OS_MAX_FLAGS 0) OS_FlagInit(); /事件標(biāo)志結(jié)構(gòu)初始化事件標(biāo)志結(jié)構(gòu)初始化 #endif#if (OS_MEM_EN 0) & (OS_MAX_MEM_PART 0) OS_MemInit(); /內(nèi)存管理初始化內(nèi)存管理初始化 #endif#if (OS_Q_EN 0) & (OS_MAX_QS 0) OS_QInit(); /消息隊(duì)列初始化消息隊(duì)列初始化 #endif OS_InitTas

24、kIdle(); /創(chuàng)建空閑任務(wù)創(chuàng)建空閑任務(wù)(無條件無條件) #if OS_TASK_STAT_EN 0 OS_InitTaskStat(); /創(chuàng)建統(tǒng)計(jì)任務(wù)創(chuàng)建統(tǒng)計(jì)任務(wù) #endif#if OS_VERSION = 204 OSInitHookEnd(); /系統(tǒng)初始化結(jié)束接口函數(shù)系統(tǒng)初始化結(jié)束接口函數(shù)#endif#if OS_VERSION = 270 & OS_DEBUG_EN 0 OSDebugInit();#endifOS_InitMisc()初始化變量初始化變量 nOSIntNesting = 0; /清除中斷嵌套計(jì)數(shù)器清除中斷嵌套計(jì)數(shù)器 nOSLockNesting =

25、0; /清除調(diào)度鎖定計(jì)數(shù)器清除調(diào)度鎖定計(jì)數(shù)器 nOSTaskCtr = 0; /任務(wù)數(shù)清零任務(wù)數(shù)清零nOSRunning = FALSE; /系統(tǒng)多任務(wù)沒有執(zhí)系統(tǒng)多任務(wù)沒有執(zhí)行行 nOSIdleCtr = 0L; /清除空閑任務(wù)計(jì)數(shù)器清除空閑任務(wù)計(jì)數(shù)器nOSCtxSwCtr = 0; /清除程序切換計(jì)數(shù)器清除程序切換計(jì)數(shù)器 OS_InitRdyList()初始化任務(wù)就緒列表初始化任務(wù)就緒列表 nstatic void OS_InitRdyList (void) INT8U i; INT8U *prdytbl; OSRdyGrp = 0 x00; /清除任務(wù)就緒表清除任務(wù)就緒表 prdytbl

26、= &OSRdyTbl0; /將將OSRdyTbl數(shù)組全部初始化數(shù)組全部初始化0 for (i = 0; i OS_RDY_TBL_SIZE; i+) *prdytbl+ = 0 x00; /把任務(wù)就緒表里面所有的項(xiàng)目全部清零把任務(wù)就緒表里面所有的項(xiàng)目全部清零 OSPrioCur = 0; /當(dāng)前運(yùn)行任務(wù)的優(yōu)先級(jí)寄存器清零當(dāng)前運(yùn)行任務(wù)的優(yōu)先級(jí)寄存器清零 OSPrioHighRdy = 0; /將處于就緒狀態(tài)的最高優(yōu)先級(jí)的任務(wù)寄存器清零將處于就緒狀態(tài)的最高優(yōu)先級(jí)的任務(wù)寄存器清零 OSTCBHighRdy = (OS_TCB *)0; /將處于就緒態(tài)的最高優(yōu)先級(jí)的任務(wù)控制塊指針寄將處于就緒

27、態(tài)的最高優(yōu)先級(jí)的任務(wù)控制塊指針寄存器清零存器清零 OSTCBCur = (OS_TCB *)0; /將當(dāng)前運(yùn)行任務(wù)的任務(wù)控制塊指針寄存器清零將當(dāng)前運(yùn)行任務(wù)的任務(wù)控制塊指針寄存器清零 OSTCBList = (OS_TCB *)0; /任務(wù)控制塊列表清零任務(wù)控制塊列表清零 for (i = 0; i (OS_LOWEST_PRIO + 1); i+) OSTCBPrioTbli = (OS_TCB *)0; / 清除優(yōu)先級(jí)列表,這個(gè)列表存儲(chǔ)各個(gè)優(yōu)先級(jí)對(duì)應(yīng)的任務(wù)控制塊的地址,系清除優(yōu)先級(jí)列表,這個(gè)列表存儲(chǔ)各個(gè)優(yōu)先級(jí)對(duì)應(yīng)的任務(wù)控制塊的地址,系統(tǒng)用它來尋找下一個(gè)要運(yùn)行的任務(wù)地址統(tǒng)用它來尋找下一個(gè)要運(yùn)行

28、的任務(wù)地址OS_InitTCBList()初始化任務(wù)控制塊列表初始化任務(wù)控制塊列表nstatic void OS_InitTCBList (void) INT8U i; OS_TCB *ptcb1; OS_TCB *ptcb2; OS_MemClr(INT8U *)&OSTCBTbl0, sizeof(OSTCBTbl); / 清除清除TCB OS_MemClr(INT8U *)&OSTCBPrioTbl0, sizeof(OSTCBPrioTbl); / 清除優(yōu)先級(jí)表清除優(yōu)先級(jí)表 ptcb1 = &OSTCBTbl0; /任務(wù)控制塊列表的第一個(gè)任務(wù)塊地址給變量任務(wù)控制

29、塊列表的第一個(gè)任務(wù)塊地址給變量PTCB1 ptcb2 = &OSTCBTbl1; /任務(wù)控制塊列表的第二個(gè)任務(wù)塊地址給變量任務(wù)控制塊列表的第二個(gè)任務(wù)塊地址給變量PTCB2 for (i = 0; i OSTCBNext = ptcb2;#if OS_TASK_NAME_SIZE 1 ptcb1-OSTCBTaskName0 = ?; /* Unknown name */ ptcb1-OSTCBTaskName1 = OS_ASCII_NUL;/把前一個(gè)任務(wù)控制塊的下一個(gè)任務(wù)指針指向下把前一個(gè)任務(wù)控制塊的下一個(gè)任務(wù)指針指向下一個(gè)任務(wù)控制塊一個(gè)任務(wù)控制塊 #endif ptcb1+; pt

30、cb2+; ptcb1-OSTCBNext = (OS_TCB *)0; /把最后一個(gè)任務(wù)控制塊的下個(gè)指針清零把最后一個(gè)任務(wù)控制塊的下個(gè)指針清零 #if OS_TASK_NAME_SIZE 1 ptcb1-OSTCBTaskName0 = ?; /* Unknown name */ ptcb1-OSTCBTaskName1 = OS_ASCII_NUL;#endif OSTCBList = (OS_TCB *)0; /TCB列表初始化列表初始化 OSTCBFreeList = &OSTCBTbl0; /把第一個(gè)任務(wù)控制塊的地址送給空閑任務(wù)控制塊列把第一個(gè)任務(wù)控制塊的地址送給空閑任務(wù)控制

31、塊列表表 建立其它任務(wù)的任務(wù)建立其它任務(wù)的任務(wù) TaskStart() nvoid TaskStart (void *data)TaskStart()將()將data的值賦給自己,以免某些編譯的值賦給自己,以免某些編譯器的警告器的警告 TaskStartDispInit();(); (1) /在屏幕頂端顯示一個(gè)標(biāo)在屏幕頂端顯示一個(gè)標(biāo)識(shí),說明這是例識(shí),說明這是例1 。 OS_ENTER_CRITICAL(); PC_VectSet(0 x08, OSTickISR); (2) PC_SetTickRate(200); (3) /關(guān)中斷,以改變中斷向量,讓其指向關(guān)中斷,以改變中斷向量,讓其指向C/

32、OS-II的時(shí)鐘的時(shí)鐘節(jié)拍處理,然后,改變時(shí)鐘節(jié)拍為節(jié)拍處理,然后,改變時(shí)鐘節(jié)拍為 200Hz OS_EXIT_CRITICAL(); 建立其它任務(wù)的任務(wù)建立其它任務(wù)的任務(wù) TaskStart()(續(xù))(續(xù))OSStatInit(); /測(cè)試處理器的速度(運(yùn)行任務(wù)時(shí)的測(cè)試處理器的速度(運(yùn)行任務(wù)時(shí)的CPU使用率)使用率) (4)TaskStartCreateTasks(); /建立建立10個(gè)同樣的任務(wù)個(gè)同樣的任務(wù) (5) for (;) /每個(gè)任務(wù)都是一個(gè)無限循環(huán)每個(gè)任務(wù)都是一個(gè)無限循環(huán) TaskStartDisp();/在在Dos窗口底部,顯示相關(guān)信息(任務(wù)個(gè)數(shù)、窗口底部,顯示相關(guān)信息(任務(wù)個(gè)

33、數(shù)、CPU利用利用率、任務(wù)切換次數(shù)、率、任務(wù)切換次數(shù)、ucOS-II版本號(hào)和處理器是否包含浮點(diǎn)處理單元版本號(hào)和處理器是否包含浮點(diǎn)處理單元FPU) If (PC_GetKey(&key)=TRUE) /檢查是否有鍵按下檢查是否有鍵按下 if (key=0 x1B) /是否按下是否按下Esc鍵鍵 PC_DOSReturn(); OSCtxSWCtr=0; /如果沒有按下如果沒有按下Esc鍵,則記錄任務(wù)切換次數(shù)的全局變量清鍵,則記錄任務(wù)切換次數(shù)的全局變量清零零 OSTimeDlyHMSM(0,0,1,0);/TaskStart()任務(wù)將自身掛起()任務(wù)將自身掛起1秒,秒,ucOS-II開始調(diào)

34、度,找下一個(gè)最高優(yōu)先級(jí)(開始調(diào)度,找下一個(gè)最高優(yōu)先級(jí)(=1)的就緒任務(wù))的就緒任務(wù) 測(cè)試測(cè)試CPU速度速度 void OSStatInit (void) OSTimeDly(2); /延時(shí)兩個(gè)時(shí)鐘節(jié)拍延時(shí)兩個(gè)時(shí)鐘節(jié)拍 OS_ENTER_CRITICAL(); OSIdleCtr = 0L; /32位的計(jì)數(shù)器位的計(jì)數(shù)器OSIdleCtr被清被清0,并產(chǎn),并產(chǎn)生另一個(gè)延時(shí),這個(gè)延時(shí)使生另一個(gè)延時(shí),這個(gè)延時(shí)使OSStatInit()掛起掛起 。 OS_EXIT_CRITICAL();/uCOS-II執(zhí)行執(zhí)行一個(gè)無一個(gè)無限限循環(huán)循環(huán)的空閑任務(wù)的空閑任務(wù),不斷的遞增,不斷的遞增OSIdleCtr OST

35、imeDly(OS_TICKS_PER_SEC); OS_ENTER_CRITICAL(); OSIdleCtrMax = OSIdleCtr; OSStatRdy = TRUE; /COS-II將統(tǒng)計(jì)將統(tǒng)計(jì)CPU的利用率的利用率 OS_EXIT_CRITICAL(); 建立建立10個(gè)同樣的任務(wù)個(gè)同樣的任務(wù)Static void TaskStartCreateTasks(void)INT8U i; for(i=0;iN_TASKS;i+) TaskDatai=0+i;/初始化字符數(shù)組,包含初始化字符數(shù)組,包含09 OSTaskCreate(Task, /循環(huán)建立循環(huán)建立N_TASKS個(gè)相同的任

36、個(gè)相同的任務(wù),每個(gè)任務(wù)顯示不同的字符務(wù),每個(gè)任務(wù)顯示不同的字符(void *)&TaskDatai, /每個(gè)任務(wù)接受一個(gè)指向字符數(shù)組中每個(gè)任務(wù)接受一個(gè)指向字符數(shù)組中元素的指針元素的指針&TaskStkiTASK_STK_SIZE-1, /每個(gè)任務(wù)各自的堆棧空每個(gè)任務(wù)各自的堆??臻g間i+1); /每個(gè)任務(wù)各自的優(yōu)先級(jí)每個(gè)任務(wù)各自的優(yōu)先級(jí)110在屏幕隨機(jī)位置顯示任務(wù)號(hào)(在屏幕隨機(jī)位置顯示任務(wù)號(hào)(09) void Task (void *data) UBYTE x; UBYTE y; UBYTE err; for (;) OSSemPend(RandomSem, 0, &er

37、r); /獲取信號(hào)量獲取信號(hào)量RandomSem ,同時(shí)禁止其他任務(wù)運(yùn)行這段代碼同時(shí)禁止其他任務(wù)運(yùn)行這段代碼 x = random(80); /獲得一個(gè)隨機(jī)數(shù)獲得一個(gè)隨機(jī)數(shù) y = random(16); /獲得一個(gè)隨機(jī)數(shù)獲得一個(gè)隨機(jī)數(shù) OSSemPost(RandomSem); /計(jì)算出計(jì)算出x和和y坐標(biāo)并坐標(biāo)并釋放信號(hào)量釋放信號(hào)量 PC_DispChar(x, y + 5, *(char *)data, DISP_FGND_LIGHT_GRAY);/在計(jì)算的坐標(biāo)處顯示其任務(wù)號(hào)(在計(jì)算的坐標(biāo)處顯示其任務(wù)號(hào)(0-9) OSTimeDly(1); /延時(shí)一個(gè)時(shí)鐘節(jié)拍延時(shí)一個(gè)時(shí)鐘節(jié)拍,等待進(jìn)入下一

38、次循環(huán),等待進(jìn)入下一次循環(huán) 例例1的運(yùn)行結(jié)果的運(yùn)行結(jié)果例例2n磁盤文件為磁盤文件為SOFTWAREuCOS-IIEX2_x86L,它,它包含包含9個(gè)任務(wù)。加上個(gè)任務(wù)。加上uCOS-II本身的兩個(gè)任務(wù):空閑本身的兩個(gè)任務(wù):空閑任務(wù)(任務(wù)(idle task)和統(tǒng)計(jì)任務(wù),共)和統(tǒng)計(jì)任務(wù),共11個(gè)任務(wù)。個(gè)任務(wù)。 n由由main()中的()中的TaskStart()函數(shù)建立任務(wù),功能()函數(shù)建立任務(wù),功能是建立其他任務(wù)并在屏幕上顯示如下的統(tǒng)計(jì)數(shù)據(jù):是建立其他任務(wù)并在屏幕上顯示如下的統(tǒng)計(jì)數(shù)據(jù): 每秒種任務(wù)切換的次數(shù);每秒種任務(wù)切換的次數(shù); CPU利用率的百分比;利用率的百分比; 當(dāng)前日期和時(shí)間;當(dāng)前日期

39、和時(shí)間; uCOS_II的版本號(hào);的版本號(hào);n使用帶擴(kuò)展功能的任務(wù)建立函數(shù)使用帶擴(kuò)展功能的任務(wù)建立函數(shù)OSTaskCreateExt()()和和uCOS-II的堆棧檢查操作(要使用堆棧檢查操作必的堆棧檢查操作(要使用堆棧檢查操作必須用須用OSTaskCreateExt()建立任務(wù))。()建立任務(wù))。C/OS-II stack checking uCOS-II的堆棧檢查功能要求任務(wù)建立時(shí)堆棧清零。的堆棧檢查功能要求任務(wù)建立時(shí)堆棧清零。OSTaskCreateExt()可以執(zhí)行此可以執(zhí)行此項(xiàng)操作(設(shè)置選項(xiàng)項(xiàng)操作(設(shè)置選項(xiàng)OS_TASK_OPT_STK_CHK和和OS_TASK_OPT_STK_CL

40、R打開此項(xiàng)打開此項(xiàng)操作)。操作)。OSTaskCreateExt()進(jìn)行堆棧清零操作是一項(xiàng)很費(fèi)時(shí)的工作,取決于堆棧的大進(jìn)行堆棧清零操作是一項(xiàng)很費(fèi)時(shí)的工作,取決于堆棧的大小。執(zhí)行堆棧檢查操作的時(shí)候,小。執(zhí)行堆棧檢查操作的時(shí)候,uCOS-II從棧底向棧頂搜索非從棧底向棧頂搜索非0元素元素(參看上圖參看上圖),同時(shí)用,同時(shí)用一個(gè)計(jì)數(shù)器記錄一個(gè)計(jì)數(shù)器記錄0元素的個(gè)數(shù)。元素的個(gè)數(shù)。main() n例例2的的main()函數(shù)和例函數(shù)和例1的看起來差不多;的看起來差不多;n有兩點(diǎn)區(qū)別:第一,有兩點(diǎn)區(qū)別:第一,main()函數(shù)調(diào)用函數(shù)調(diào)用PC_ElapsedInit()來初始化定時(shí)器記錄來初始化定時(shí)器記錄OS

41、TaskStkChk()的執(zhí)行時(shí)間。第二,所的執(zhí)行時(shí)間。第二,所有的任務(wù)都使用有的任務(wù)都使用OSTaskCreateExt()函數(shù)函數(shù)來建立(替代了來建立(替代了OSTaskCreate()函數(shù)),()函數(shù)),這使得每一個(gè)任務(wù)都可進(jìn)行堆棧檢查。這使得每一個(gè)任務(wù)都可進(jìn)行堆棧檢查。 例例2中的中的Main()函數(shù)()函數(shù) nvoid main (void) PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); OSInit(); PC_DOSSaveReturn(); PC_VectSet(uCOS, OSCtxSw); PC_ElapsedInit(

42、); /對(duì)消逝時(shí)間的測(cè)量進(jìn)行初始化對(duì)消逝時(shí)間的測(cè)量進(jìn)行初始化 OSTaskCreateExt(TaskStart, (void *)0, &TaskStartStkTASK_STK_SIZE-1, TASK_START_PRIO, TASK_START_ID, &TaskStartStk0, TASK_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); (2) OSStart();除了除了OSTaskCreate()函數(shù)的四個(gè)參數(shù)外,函數(shù)的四個(gè)參數(shù)外,OSTaskCreateExt()還需要五個(gè)參還需

43、要五個(gè)參數(shù):任務(wù)的數(shù):任務(wù)的ID,一個(gè)指向任務(wù)堆棧棧底的指針,堆棧的大小(以堆棧單元為單,一個(gè)指向任務(wù)堆棧棧底的指針,堆棧的大?。ㄒ远褩卧獮閱挝?,位,80X86中為字),一個(gè)指向用戶定義的中為字),一個(gè)指向用戶定義的TCB擴(kuò)展數(shù)據(jù)結(jié)構(gòu)的指針,和一個(gè)擴(kuò)展數(shù)據(jù)結(jié)構(gòu)的指針,和一個(gè)用于指定對(duì)任務(wù)操作的變量。用于指定對(duì)任務(wù)操作的變量。 TaskStart()()nTaskStart()建立兩個(gè)郵箱,()建立兩個(gè)郵箱,分別提供給任務(wù)分別提供給任務(wù)4和任務(wù)和任務(wù)5。n接著建立一個(gè)專門顯示時(shí)間和日接著建立一個(gè)專門顯示時(shí)間和日期的任務(wù),隨后又建立期的任務(wù),隨后又建立5個(gè)不同的個(gè)不同的任務(wù)。任務(wù)。TaskSta

44、rt()的偽碼的偽碼 nvoid TaskStart (void *data) Prevent compiler warning by assigning data to itself; Display a banner and non-changing text; Install uC/OS-IIs tick handler; /關(guān)中斷,關(guān)中斷,PC_VectSet() Change the tick rate to 200 Hz; /PC_SetTickRate() ,開中斷,開中斷 Initialize the statistics task;/OSStatInit()()以上幾項(xiàng)操作和

45、例以上幾項(xiàng)操作和例1中的相同。中的相同。 TaskStart()的偽碼(續(xù))的偽碼(續(xù))nCreate 2 mailboxes which are used by Task #4 and #5; (1) n/ 調(diào)用調(diào)用TaskStartCreateTasks(void)nCreate a task that will display the date and time on the screen;(2) nCreate 5 application tasks; nfor (;) Display #tasks running; Display CPU usage in %; Display #c

46、ontext switches per seconds; Clear the context switch counter; Display uC/OS-IIs version; If (Key was pressed) if (Key pressed was the ESCAPE key) Return to DOS; Delay for 1 second; 創(chuàng)建創(chuàng)建2個(gè)郵箱個(gè)郵箱n通過調(diào)用通過調(diào)用2個(gè)個(gè)OSMboxCreate(void *)0)函數(shù),創(chuàng)建函數(shù),創(chuàng)建2個(gè)郵箱。個(gè)郵箱。n這這2個(gè)郵箱在任務(wù)個(gè)郵箱在任務(wù)4與任務(wù)與任務(wù)5中使用。中使用。TaskStartCreateTasks(v

47、oid)nstatic void TaskStartCreateTasks (void)nn OSTaskCreateExt(TaskClk, (void *)0,n &TaskClkStkTASK_STK_SIZE - 1,n TASK_CLK_PRIO, TASK_CLK_ID, &TaskClkStk0,n TASK_STK_SIZE, (void *)0,n OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);n OSTaskCreateExt(Task1, (void *)0, n &Task1StkTASK_STK_SIZE

48、 - 1,n TASK_1_PRIO, TASK_1_ID,&Task1Stk0,n TASK_STK_SIZE, (void *)0,n OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);nn OSTaskCreateExt(Task5, .);n時(shí)鐘顯示任務(wù)時(shí)鐘顯示任務(wù)nTaskClk()函數(shù)用于顯示當(dāng)前函數(shù)用于顯示當(dāng)前日期和時(shí)間,每秒更新一次。日期和時(shí)間,每秒更新一次。 時(shí)鐘顯示任務(wù)程序時(shí)鐘顯示任務(wù)程序 nvoid TaskClk (void *data) Struct time now; Struct date today; char s40

49、; data = data; for (;) PC_GetDateTime(s); PC_DispStr(0, 24, s, DISP_FGND_BLUE + DISP_BGND_CYAN); OSTimeDly(OS_TICKS_PER_SEC); 任務(wù)任務(wù)1n任務(wù)任務(wù)1將檢查其他七個(gè)任務(wù)堆棧的將檢查其他七個(gè)任務(wù)堆棧的大小,同時(shí)記錄大小,同時(shí)記錄OSTaskStkChk()函數(shù)的執(zhí)行時(shí)間,并與堆棧大小函數(shù)的執(zhí)行時(shí)間,并與堆棧大小(所有堆棧的大小都是以字節(jié)為(所有堆棧的大小都是以字節(jié)為單位)一起顯示出來。任務(wù)單位)一起顯示出來。任務(wù)1每秒每秒執(zhí)行執(zhí)行10次(間隔次(間隔100ms)。)。任務(wù)任

50、務(wù)1程序程序 nvoid Task1 (void *pdata) INT8U err; OS_STK_DATA data; /任務(wù)堆棧數(shù)據(jù)任務(wù)堆棧數(shù)據(jù) INT16U time; /執(zhí)行時(shí)間執(zhí)行時(shí)間 INT8U i; char s80; pdata = pdata; 任務(wù)任務(wù)1程序程序 (續(xù))(續(xù))for (;) for (i = 0; i 7; i+) PC_ElapsedStart();/ 統(tǒng)計(jì)統(tǒng)計(jì)OSTaskStkChk()函數(shù)運(yùn)行時(shí)間開始()函數(shù)運(yùn)行時(shí)間開始 err = OSTaskStkChk(TASK_START_PRIO+i, &data); time = PC_Elaps

51、edStop(); /統(tǒng)計(jì)統(tǒng)計(jì)OSTaskStkChk()函數(shù)運(yùn)行時(shí)間()函數(shù)運(yùn)行時(shí)間結(jié)束結(jié)束 if (err = OS_NO_ERR) sprintf(s, %3ld %3ld %3ld %5d, data.OSFree + data.OSUsed, data.OSFree, data.OSUsed, time); PC_DispStr(19, 12+i, s, DISP_FGND_YELLOW); /顯示統(tǒng)計(jì)結(jié)果顯示統(tǒng)計(jì)結(jié)果 OSTimeDlyHMSM(0, 0, 0, 100); /延時(shí)延時(shí)100ms 任務(wù)任務(wù)2 n任務(wù)任務(wù)2在屏幕上顯示一個(gè)順時(shí)在屏幕上顯示一個(gè)順時(shí)針旋轉(zhuǎn)的指針(用橫線針

52、旋轉(zhuǎn)的指針(用橫線_,豎線豎線|,斜線,斜線/、,等字符表,等字符表示),每示),每200ms旋轉(zhuǎn)一格。旋轉(zhuǎn)一格。 任務(wù)任務(wù)2程序程序nvoid Task2 (void *data) data = data; for (;) PC_DispChar(70, 15, |, DISP_FGND_WHITE + DISP_BGND_RED); OSTimeDly(10); PC_DispChar(70, 15, /, DISP_FGND_WHITE + DISP_BGND_RED);任務(wù)任務(wù)2程序程序 (續(xù))(續(xù))OSTimeDly(10); PC_DispChar(70, 15, -, DISP_

53、FGND_WHITE + DISP_BGND_RED); OSTimeDly(10); PC_DispChar(70, 15, , DISP_FGND_WHITE + DISP_BGND_RED); OSTimeDly(10); 任務(wù)任務(wù)3 n任務(wù)任務(wù)3也顯示了一個(gè)旋轉(zhuǎn)指針,但是與任務(wù)也顯示了一個(gè)旋轉(zhuǎn)指針,但是與任務(wù)2旋轉(zhuǎn)的方向不同。任務(wù)旋轉(zhuǎn)的方向不同。任務(wù)3在堆棧中分配了在堆棧中分配了一個(gè)一個(gè)500B的數(shù)組,占用了的數(shù)組,占用了Task3的堆棧,的堆棧,程序運(yùn)行后可看出,程序運(yùn)行后可看出,Task3的空閑堆棧比的空閑堆棧比Task2少了少了502B(500B的數(shù)組和一個(gè)的數(shù)組和一個(gè)2B的整型

54、變量)。的整型變量)。任務(wù)任務(wù)3程序程序nvoid Task3 (void *data) char dummy500; INT16U i; data = data; for (I = 0; i 499; i+) dummyi = ?; 任務(wù)任務(wù)3程序程序 (續(xù))(續(xù))for (;) PC_DispChar(70, 16, |, DISP_FGND_WHITE + DISP_BGND_BLUE); OSTimeDly(20); PC_DispChar(70, 16, , DISP_FGND_WHITE + DISP_BGND_BLUE); OSTimeDly(20); PC_DispChar(7

55、0, 16, -, DISP_FGND_WHITE + DISP_BGND_BLUE); OSTimeDly(20); PC_DispChar(70, 16, /, DISP_FGND_WHITE + DISP_BGND_BLUE); OSTimeDly(20); 任務(wù)任務(wù)4 n任務(wù)任務(wù)4向任務(wù)向任務(wù)5發(fā)送消息并等待確發(fā)送消息并等待確認(rèn)。發(fā)送的消息是一個(gè)指向字符認(rèn)。發(fā)送的消息是一個(gè)指向字符的指針。每當(dāng)任務(wù)的指針。每當(dāng)任務(wù)4從任務(wù)從任務(wù)5收到收到確認(rèn),就將傳遞的確認(rèn),就將傳遞的ASCII碼加碼加1再再發(fā)送,結(jié)果是不斷的傳送發(fā)送,結(jié)果是不斷的傳送“ABCDEFG.”。任務(wù)任務(wù)4程序程序nvoid Task4 (void *data) char txmsg; INT8U err; data = data; txmsg = A;任務(wù)任務(wù)4程序程序 (續(xù))(續(xù))for (;) while (txmsg OSTCBExtPtr; if (puser != (void *)0) /如果任務(wù)分配了如果任務(wù)分配了TCB擴(kuò)展數(shù)據(jù)結(jié)構(gòu)擴(kuò)展數(shù)據(jù)結(jié)構(gòu) puser-TaskCtr+; /計(jì)數(shù)器計(jì)數(shù)器TaskCtr進(jìn)行累加以統(tǒng)計(jì)進(jìn)行累加以統(tǒng)計(jì)任務(wù)被切換的頻繁程度,或檢查某個(gè)任務(wù)是否在運(yùn)行。任務(wù)被切換的頻繁程度,或檢查某個(gè)任務(wù)是否在運(yùn)行。 puser-TaskE

溫馨提示

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

評(píng)論

0/150

提交評(píng)論