版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1 緒、緒、 Jean J. Labrosse Jean J. Labrosse的故事的故事8080年代末,我設(shè)計(jì)了一個(gè)基于年代末,我設(shè)計(jì)了一個(gè)基于Intel 80C188Intel 80C188的產(chǎn)品,的產(chǎn)品,需要一個(gè)實(shí)時(shí)內(nèi)核。需要一個(gè)實(shí)時(shí)內(nèi)核。使用一個(gè)知名的內(nèi)核太貴了,廉價(jià)的內(nèi)核使用一個(gè)知名的內(nèi)核太貴了,廉價(jià)的內(nèi)核B B(當(dāng)時(shí)大約(當(dāng)時(shí)大約10001000美元以下美元以下) )讓我總給該廠商打電話求援。該廠商讓我總給該廠商打電話求援。該廠商聲稱內(nèi)核聲稱內(nèi)核B B是用是用C C語(yǔ)言寫的,可我還得用匯編語(yǔ)言初語(yǔ)言寫的,可我還得用匯編語(yǔ)言初始化程序的每個(gè)對(duì)象,實(shí)在是煩透了,產(chǎn)品的開發(fā)始化程序的每
2、個(gè)對(duì)象,實(shí)在是煩透了,產(chǎn)品的開發(fā)也耽誤了。也耽誤了。后來(lái)我得知我是該廠商的第一個(gè)客戶后來(lái)我得知我是該廠商的第一個(gè)客戶第五章第五章 C/OS-IIC/OS-II在在ARMARM系統(tǒng)中的系統(tǒng)中的應(yīng)用與開發(fā)應(yīng)用與開發(fā)2 至今, C/OS的書已售出了15,000多冊(cè)。 C/OS已被移植到以下一些CPU上。Analog 設(shè)備公司 AD21xxARM公司 ARM 6, ARM7日立公司 64180,H8/3xx,SH系列Intel公司 80 x86(Real and PM),Pentium, Pentium II, 8051,8052, MCS-251,80196,8096三菱公司 M16和M32摩托羅拉
3、公司 PowerPC, 飛利浦公司 XA西門子公司 80C166和TriCoreTI公司 TMS320Zilog公司 Z80 和Z1803C/OS-II意為“微控制器操作系統(tǒng)版本2”。世界上已有數(shù)千人在各個(gè)領(lǐng)域使用C/OS,例如,照相機(jī)行業(yè)、醫(yī)療器械、音響設(shè)施、發(fā)動(dòng)機(jī)控制、網(wǎng)絡(luò)設(shè)備、高速公路電話系統(tǒng)、自動(dòng)提款機(jī)、工業(yè)機(jī)器人等等。很多高等院校將C/OS用于實(shí)時(shí)系統(tǒng)教學(xué)。4C/OS 的幾個(gè)典型應(yīng)用NSA2010NSA2010便攜式電話,在日本便攜式電話,在日本大約有大約有1500015000臺(tái)投入市場(chǎng)。使用臺(tái)投入市場(chǎng)。使用C/OSC/OS實(shí)時(shí)操作系統(tǒng)。實(shí)時(shí)操作系統(tǒng)。CYCLONECYCLONE移動(dòng)
4、電話,移動(dòng)電話,Hitachi Hitachi H8S/2318kH8S/2318k微程序控制器,微程序控制器,256K256K閃存和閃存和8K Ram8K Ram, C/OS C/OS 實(shí)時(shí)操實(shí)時(shí)操作系統(tǒng)。作系統(tǒng)。選擇選擇C/OS的原因:的原因:INFEA R&D的職員從的職員從1996年以來(lái)開始應(yīng)用年以來(lái)開始應(yīng)用Micrim實(shí)時(shí)操作系統(tǒng)。通過比較,還實(shí)時(shí)操作系統(tǒng)。通過比較,還沒有發(fā)現(xiàn)比沒有發(fā)現(xiàn)比C/OS更好的實(shí)時(shí)操作系統(tǒng)。我們將繼續(xù)應(yīng)用更好的實(shí)時(shí)操作系統(tǒng)。我們將繼續(xù)應(yīng)用C/OS以及以及Micrim的的其它產(chǎn)品包括下一代其它產(chǎn)品包括下一代C/OS-II V2.52的產(chǎn)品。的產(chǎn)品。 5
5、三軸運(yùn)動(dòng)控制卡Hitachi SH2Hitachi SH2微處理器;微處理器;77個(gè)任務(wù);個(gè)任務(wù);時(shí)鐘頻率時(shí)鐘頻率10Hz10Hz;用于加工眼鏡的塑料鏡用于加工眼鏡的塑料鏡片的計(jì)算機(jī)控制車床片的計(jì)算機(jī)控制車床的運(yùn)動(dòng)控制。的運(yùn)動(dòng)控制。選擇選擇C/OS-IIC/OS-II的原因:的原因: 主要原因是它與其它市場(chǎng)上的實(shí)時(shí)操作系統(tǒng)相比的相對(duì)低廉的費(fèi)用。主要原因是它與其它市場(chǎng)上的實(shí)時(shí)操作系統(tǒng)相比的相對(duì)低廉的費(fèi)用。另一個(gè)主要原因是資源和內(nèi)設(shè)的可獲得性。最后一點(diǎn),另一個(gè)主要原因是資源和內(nèi)設(shè)的可獲得性。最后一點(diǎn),C/OS-IIC/OS-II有足夠有足夠的能力使我們能夠順利完成工作。的能力使我們能夠順利完成工作
6、。SH-2SH-2快速,有效的執(zhí)行與快速,有效的執(zhí)行與C/OS-IIC/OS-II的的實(shí)時(shí)內(nèi)核是使工作順利完成的最重要的條件。實(shí)時(shí)內(nèi)核是使工作順利完成的最重要的條件。6MB-20-M信用卡處理裝置 TCP/IPTCP/IP協(xié)議;協(xié)議;20MHz Am188ES20MHz Am188ES;1010項(xiàng)任務(wù);項(xiàng)任務(wù);時(shí)鐘頻率時(shí)鐘頻率100Hz100Hz; MB-20-M MB-20-M被用于對(duì)很多的教被用于對(duì)很多的教學(xué)和商務(wù)設(shè)備的控制使用和收學(xué)和商務(wù)設(shè)備的控制使用和收費(fèi)費(fèi), ,包括身份證,安全卡和圖包括身份證,安全卡和圖書館借閱卡,現(xiàn)在只要應(yīng)用標(biāo)書館借閱卡,現(xiàn)在只要應(yīng)用標(biāo)準(zhǔn)磁條的用戶卡都可以在準(zhǔn)磁條
7、的用戶卡都可以在MB-MB-20-M20-M終端上使用。終端上使用。選擇選擇C/OS-IIC/OS-II的原因:的原因: 價(jià)格便宜,代碼尺寸小,縮短開發(fā)周期價(jià)格便宜,代碼尺寸小,縮短開發(fā)周期7獨(dú)立靜態(tài)交換機(jī) Hitachi H8S/2357 CPU Hitachi H8S/2357 CPU 4 4個(gè)任務(wù)個(gè)任務(wù) 時(shí)鐘頻率時(shí)鐘頻率1000Hz1000Hz 獨(dú)立靜態(tài)交換機(jī)(獨(dú)立靜態(tài)交換機(jī)(SIELSIEL交換機(jī))交換機(jī))是一個(gè)可以連續(xù)的瞬時(shí)改變電源的是一個(gè)可以連續(xù)的瞬時(shí)改變電源的裝置從而控制兩條電線的狀態(tài),最裝置從而控制兩條電線的狀態(tài),最終保證負(fù)載的最佳電力供給。這種終保證負(fù)載的最佳電力供給。這種機(jī)
8、器同樣可以保護(hù)負(fù)載以防短路。機(jī)器同樣可以保護(hù)負(fù)載以防短路。選擇選擇C/OSIIC/OSII的原因:的原因: 與其它實(shí)時(shí)方案相比低廉的價(jià)格,與很多微處理器可與其它實(shí)時(shí)方案相比低廉的價(jià)格,與很多微處理器可以進(jìn)行數(shù)據(jù)傳輸,對(duì)源代碼的完全控制。以進(jìn)行數(shù)據(jù)傳輸,對(duì)源代碼的完全控制。8COS-是一個(gè)免費(fèi)的、源代碼公開的實(shí)時(shí)嵌入式內(nèi)是一個(gè)免費(fèi)的、源代碼公開的實(shí)時(shí)嵌入式內(nèi)核,其內(nèi)核提供了實(shí)時(shí)系統(tǒng)所需要的一些基本功能。其核,其內(nèi)核提供了實(shí)時(shí)系統(tǒng)所需要的一些基本功能。其中包含全部功能的核心部分代碼占用中包含全部功能的核心部分代碼占用8.3 KB,全部的源,全部的源代碼約代碼約5500行,結(jié)構(gòu)合理、清晰易懂,且注解
9、詳盡,非行,結(jié)構(gòu)合理、清晰易懂,且注解詳盡,非常適合初學(xué)者進(jìn)行學(xué)習(xí)分析。常適合初學(xué)者進(jìn)行學(xué)習(xí)分析。COS-不僅使用戶得不僅使用戶得到廉價(jià)的解決方案,而且由于到廉價(jià)的解決方案,而且由于COS-的開放源代碼的開放源代碼特性,還使用戶可針對(duì)自己的硬件優(yōu)化代碼,獲得更好特性,還使用戶可針對(duì)自己的硬件優(yōu)化代碼,獲得更好的性能。的性能。 COS-是在是在PC機(jī)上開發(fā)的,機(jī)上開發(fā)的,C編輯器使用的是編輯器使用的是Borland C/C+3.1版。從早期使用的版。從早期使用的COS到現(xiàn)在的到現(xiàn)在的COS- V2.52版,應(yīng)用的實(shí)例也進(jìn)一步說明了該內(nèi)核版,應(yīng)用的實(shí)例也進(jìn)一步說明了該內(nèi)核的實(shí)用性和可靠性。的實(shí)用性
10、和可靠性。5.1 5.1 C/OS-IIC/OS-II系統(tǒng)的特點(diǎn)及結(jié)構(gòu)系統(tǒng)的特點(diǎn)及結(jié)構(gòu) 95.1.1 5.1.1 C COS-OS-系統(tǒng)的特點(diǎn)系統(tǒng)的特點(diǎn)1 1有源代碼,有源代碼,C COS-OS-源代碼是開放的,用戶可登源代碼是開放的,用戶可登錄錄C COS-OS-的網(wǎng)站的網(wǎng)站(www(wwwuCOS-IIuCOS-IIcom)com)下載針對(duì)不下載針對(duì)不同微處理器的移植代碼。這極大地方便了實(shí)時(shí)嵌入式同微處理器的移植代碼。這極大地方便了實(shí)時(shí)嵌入式系統(tǒng)系統(tǒng)C COS-OS-的開發(fā),降低了開發(fā)成本。的開發(fā),降低了開發(fā)成本。2 2可移植可移植(Portable)(Portable),C COS-OS
11、-的源代碼中,除了的源代碼中,除了與微處理器硬件相關(guān)的部分是使用匯編語(yǔ)言編寫的,與微處理器硬件相關(guān)的部分是使用匯編語(yǔ)言編寫的,其絕大部分是使用移植性很強(qiáng)的其絕大部分是使用移植性很強(qiáng)的ANSI CANSI C來(lái)編寫的。并來(lái)編寫的。并且把用匯編語(yǔ)言編寫的部分已經(jīng)壓縮到最低的限度,且把用匯編語(yǔ)言編寫的部分已經(jīng)壓縮到最低的限度,以使以使C COS-OS-更方便于移植到其他微處理器上使用。更方便于移植到其他微處理器上使用。如如IntelIntel公司、公司、ZilogZilog公司、公司、MotorolaMotorola公司的微控制器公司的微控制器和和TITI公司的公司的DSPDSP,以及包括,以及包括
12、ARMARM公司、公司、Analog DeviceAnalog Device公司、三菱公司、日立公司、飛利浦公司和西門子公公司、三菱公司、日立公司、飛利浦公司和西門子公司的各種微處理器。司的各種微處理器。 103 3可固化可固化(ROMable)(ROMable),C COS-OS-是為嵌入式應(yīng)用而設(shè)是為嵌入式應(yīng)用而設(shè)計(jì)的操作系統(tǒng),只要具備有合適的軟硬件工具,就可將計(jì)的操作系統(tǒng),只要具備有合適的軟硬件工具,就可將C COS-OS-嵌入到產(chǎn)品中去,從而成為產(chǎn)品的一部分。嵌入到產(chǎn)品中去,從而成為產(chǎn)品的一部分。 4 4可裁剪可裁剪(Scalable)(Scalable),C COS-OS-可根據(jù)實(shí)際
13、用戶的可根據(jù)實(shí)際用戶的應(yīng)用需要使用條件編譯來(lái)完成對(duì)操作系統(tǒng)的裁剪,這樣應(yīng)用需要使用條件編譯來(lái)完成對(duì)操作系統(tǒng)的裁剪,這樣就可以減少就可以減少C COS-OS-對(duì)代碼空間和數(shù)據(jù)空間的占用。對(duì)代碼空間和數(shù)據(jù)空間的占用。5 5可剝奪型可剝奪型(Preemptive)(Preemptive),C COS-OS-是完全可剝奪是完全可剝奪型的實(shí)時(shí)內(nèi)核,運(yùn)行就緒條件下優(yōu)先級(jí)最高的任務(wù)。型的實(shí)時(shí)內(nèi)核,運(yùn)行就緒條件下優(yōu)先級(jí)最高的任務(wù)。6 6多任務(wù),多任務(wù),C COS-OS-可管理可管理6464個(gè)任務(wù)。一般情況下,個(gè)任務(wù)。一般情況下,建議用戶保留建議用戶保留8 8個(gè)任務(wù)給個(gè)任務(wù)給C COS-OS-。這樣,留給用戶應(yīng)
14、。這樣,留給用戶應(yīng)用程序的任務(wù)最多可有用程序的任務(wù)最多可有5656個(gè)。系統(tǒng)賦給每個(gè)任務(wù)的優(yōu)先個(gè)。系統(tǒng)賦給每個(gè)任務(wù)的優(yōu)先級(jí)必須不同,這意味著級(jí)必須不同,這意味著C COS-OS-不支持時(shí)間片輪轉(zhuǎn)調(diào)不支持時(shí)間片輪轉(zhuǎn)調(diào)度法度法(Round-robin Scheduling)(Round-robin Scheduling)。 7 7可確定性,絕大多數(shù)可確定性,絕大多數(shù)C COS-OS-的函數(shù)調(diào)用和服務(wù)的的函數(shù)調(diào)用和服務(wù)的執(zhí)行時(shí)間具有確定性。在任何時(shí)候用戶都能知道執(zhí)行時(shí)間具有確定性。在任何時(shí)候用戶都能知道C COS-OS-的函數(shù)調(diào)用與服務(wù)的執(zhí)行時(shí)間。的函數(shù)調(diào)用與服務(wù)的執(zhí)行時(shí)間。118 8任務(wù)棧,任務(wù)棧,
15、C COS-OS-的每個(gè)任務(wù)都有自己?jiǎn)为?dú)的棧和的每個(gè)任務(wù)都有自己?jiǎn)为?dú)的棧和棧空間。使用??臻g。使用C COS-OS-的棧空間校驗(yàn)函數(shù)可確定每個(gè)的??臻g校驗(yàn)函數(shù)可確定每個(gè)任務(wù)到底需要多少??臻g。任務(wù)到底需要多少棧空間。 9 9系統(tǒng)服務(wù),提供了例如信號(hào)量、互斥信號(hào)量、消息系統(tǒng)服務(wù),提供了例如信號(hào)量、互斥信號(hào)量、消息郵箱、事件標(biāo)志、數(shù)據(jù)隊(duì)列、塊大小固定的內(nèi)存的申請(qǐng)郵箱、事件標(biāo)志、數(shù)據(jù)隊(duì)列、塊大小固定的內(nèi)存的申請(qǐng)與釋放及時(shí)間管理函數(shù)等。與釋放及時(shí)間管理函數(shù)等。 1010中斷管理,中斷可使正在執(zhí)行的任務(wù)暫時(shí)掛起,如中斷管理,中斷可使正在執(zhí)行的任務(wù)暫時(shí)掛起,如果優(yōu)先級(jí)更高的任務(wù)被中斷喚醒,則高優(yōu)先級(jí)的任務(wù)
16、在果優(yōu)先級(jí)更高的任務(wù)被中斷喚醒,則高優(yōu)先級(jí)的任務(wù)在中斷嵌套全部退出后立即執(zhí)行。中斷嵌套層數(shù)可達(dá)中斷嵌套全部退出后立即執(zhí)行。中斷嵌套層數(shù)可達(dá)255255層。層。 1111穩(wěn)定性與可靠性,穩(wěn)定性與可靠性,20002000年年7 7月,月,C COS-OS-在一個(gè)航在一個(gè)航空項(xiàng)目中得到了美國(guó)聯(lián)邦航空管理局對(duì)商用飛機(jī)的符合空項(xiàng)目中得到了美國(guó)聯(lián)邦航空管理局對(duì)商用飛機(jī)的符合RTCA DO-178BRTCA DO-178B標(biāo)準(zhǔn)的認(rèn)證??梢哉f,標(biāo)準(zhǔn)的認(rèn)證??梢哉f,C COS-OS-的每的每一種功能、每一個(gè)函數(shù)及每一行代碼都經(jīng)過了考驗(yàn)與測(cè)一種功能、每一個(gè)函數(shù)及每一行代碼都經(jīng)過了考驗(yàn)與測(cè)試。試。125.1.2 5
17、.1.2 C COS-OS-系統(tǒng)的內(nèi)核結(jié)構(gòu)系統(tǒng)的內(nèi)核結(jié)構(gòu)與其他操作系統(tǒng)不同,與其他操作系統(tǒng)不同,C COS-OS-其實(shí)其實(shí)只有一個(gè)內(nèi)核,提供任務(wù)調(diào)度、任務(wù)間的只有一個(gè)內(nèi)核,提供任務(wù)調(diào)度、任務(wù)間的通信與同步、任務(wù)管理、時(shí)間管理和內(nèi)存通信與同步、任務(wù)管理、時(shí)間管理和內(nèi)存管理等基本功能。管理等基本功能。1) 1) 任務(wù)任務(wù)在在C COS-OS-中,一個(gè)任務(wù)通常是一個(gè)無(wú)限中,一個(gè)任務(wù)通常是一個(gè)無(wú)限的循環(huán)。一個(gè)任務(wù)看起來(lái)像其他的循環(huán)。一個(gè)任務(wù)看起來(lái)像其他c c語(yǔ)言的函語(yǔ)言的函數(shù)一樣,有函數(shù)返回類型,有形式參數(shù)變數(shù)一樣,有函數(shù)返回類型,有形式參數(shù)變量,但任務(wù)是決不會(huì)返回的。故返回參數(shù)量,但任務(wù)是決不會(huì)返回
18、的。故返回參數(shù)必須定義成必須定義成voidvoid,例如:,例如:Void YourTask(void Void YourTask(void * *pdata)pdata) for(for(;)* *用戶代碼用戶代碼* * *調(diào)用調(diào)用C COS-IIOS-II的某種系統(tǒng)服務(wù):的某種系統(tǒng)服務(wù):* * * *用戶代碼用戶代碼* * 132) 2) 任務(wù)調(diào)度任務(wù)調(diào)度C COS-IIOS-II可以管理多達(dá)可以管理多達(dá)6464個(gè)任務(wù),其優(yōu)先個(gè)任務(wù),其優(yōu)先級(jí)可以從級(jí)可以從0 0開始,優(yōu)先級(jí)號(hào)越低,其任務(wù)的開始,優(yōu)先級(jí)號(hào)越低,其任務(wù)的優(yōu)先級(jí)就越高。但目前版本的優(yōu)先級(jí)就越高。但目前版本的C COS-IIOS-
19、II有有兩個(gè)任務(wù)已經(jīng)被系統(tǒng)占用了,而且保留了兩個(gè)任務(wù)已經(jīng)被系統(tǒng)占用了,而且保留了優(yōu)先級(jí)優(yōu)先級(jí)0 0、1 1、2 2、3 3、和、和OS_LOWEST_PRIO-3OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2OS_LOWEST_PRIO-2、0S_LOWEST_PRIO-10S_LOWEST_PRIO-1以以及及OS_LOWEST_PRIOOS_LOWEST_PRIO這這8 8個(gè)任務(wù)已備將來(lái)使用。個(gè)任務(wù)已備將來(lái)使用。OS_LOWEST_PRIOOS_LOWEST_PRIO是作為常數(shù)在是作為常數(shù)在OS_CFG.HOS_CFG.H文文件中用定義常數(shù)語(yǔ)句件中用定義常數(shù)語(yǔ)句#def
20、ine constant#define constant來(lái)來(lái)定義的。因此用戶可以使用多達(dá)定義的。因此用戶可以使用多達(dá)5656個(gè)應(yīng)用個(gè)應(yīng)用任務(wù),但首先要給每個(gè)任務(wù)賦以不同的優(yōu)任務(wù),但首先要給每個(gè)任務(wù)賦以不同的優(yōu)先級(jí)。先級(jí)。C COS-IIOS-II總是運(yùn)行進(jìn)入就緒態(tài)的優(yōu)總是運(yùn)行進(jìn)入就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)。目前版本的先級(jí)最高的任務(wù)。目前版本的C COS-IIOS-II中,中,任務(wù)的優(yōu)先級(jí)號(hào)就是任務(wù)編號(hào)任務(wù)的優(yōu)先級(jí)號(hào)就是任務(wù)編號(hào)(ID)(ID)。優(yōu)先。優(yōu)先級(jí)號(hào)級(jí)號(hào)( (或任務(wù)的或任務(wù)的IDID號(hào)號(hào)) )也可以被一些內(nèi)核服也可以被一些內(nèi)核服務(wù)函數(shù)調(diào)用,比如改變優(yōu)先級(jí)函數(shù)務(wù)函數(shù)調(diào)用,比如改變優(yōu)先級(jí)函數(shù)
21、OSTaskChangePrio()OSTaskChangePrio()或者或者OSTaskDel()OSTaskDel()。 為了使為了使C COS-IIOS-II能管理用戶任務(wù),用戶必能管理用戶任務(wù),用戶必須在建立一個(gè)任務(wù)的時(shí)候,將任務(wù)的起始須在建立一個(gè)任務(wù)的時(shí)候,將任務(wù)的起始地址與其他參數(shù)一起傳給地址與其他參數(shù)一起傳給OSTaskCreate()OSTaskCreate()或者或者OSTaskCreateExt()OSTaskCreateExt()這兩個(gè)函數(shù)中的任這兩個(gè)函數(shù)中的任何一個(gè)函數(shù)。圖何一個(gè)函數(shù)。圖5-15-1是是C COS-IIOS-II控制下的控制下的任務(wù)狀態(tài)轉(zhuǎn)換圖,在任一時(shí)
22、刻,任務(wù)的狀任務(wù)狀態(tài)轉(zhuǎn)換圖,在任一時(shí)刻,任務(wù)的狀態(tài)一定是這五種狀態(tài)之一。態(tài)一定是這五種狀態(tài)之一。14由于,由于,C COS-IIOS-II總是運(yùn)行進(jìn)入就緒態(tài)任務(wù)中優(yōu)先級(jí)最高的那個(gè)總是運(yùn)行進(jìn)入就緒態(tài)任務(wù)中優(yōu)先級(jí)最高的那個(gè)任務(wù)。那么確定哪一個(gè)任務(wù)優(yōu)先級(jí)最高、該哪個(gè)任務(wù)將要運(yùn)行,任務(wù)。那么確定哪一個(gè)任務(wù)優(yōu)先級(jí)最高、該哪個(gè)任務(wù)將要運(yùn)行,這樣的工作是由調(diào)度器完成的。這樣的工作是由調(diào)度器完成的。C COS-IIOS-II任務(wù)調(diào)度所花的時(shí)間任務(wù)調(diào)度所花的時(shí)間是常數(shù),與應(yīng)用程序中建立的任務(wù)數(shù)無(wú)關(guān)。任務(wù)切換很簡(jiǎn)單,一是常數(shù),與應(yīng)用程序中建立的任務(wù)數(shù)無(wú)關(guān)。任務(wù)切換很簡(jiǎn)單,一般由以下兩步完成:首先將被掛起任務(wù)的微處
23、理器寄存器推入堆般由以下兩步完成:首先將被掛起任務(wù)的微處理器寄存器推入堆棧;然后將較高優(yōu)先級(jí)的任務(wù)的寄存器值從堆棧中恢復(fù)到寄存器棧;然后將較高優(yōu)先級(jí)的任務(wù)的寄存器值從堆棧中恢復(fù)到寄存器中。在中。在C COS-IIOS-II中,就緒任務(wù)的棧結(jié)構(gòu)總是看起來(lái)跟剛剛發(fā)生中,就緒任務(wù)的棧結(jié)構(gòu)總是看起來(lái)跟剛剛發(fā)生過中斷一樣,所有微處理器的寄存器都保存在棧中。換句話說,過中斷一樣,所有微處理器的寄存器都保存在棧中。換句話說,C COS-IIOS-II運(yùn)行就緒態(tài)的任務(wù)所要做的一切,只是恢復(fù)所有的運(yùn)行就緒態(tài)的任務(wù)所要做的一切,只是恢復(fù)所有的CPUCPU寄存器并運(yùn)行中斷返回指令。寄存器并運(yùn)行中斷返回指令。 155
24、.1.3 5.1.3 主要模塊介紹主要模塊介紹1 1內(nèi)存管理內(nèi)存管理在在ANSI CANSI C中,一般采用內(nèi)存分配函數(shù)中,一般采用內(nèi)存分配函數(shù)malloc()malloc()和內(nèi)存釋和內(nèi)存釋放函數(shù)放函數(shù)free()free()兩個(gè)函數(shù)動(dòng)態(tài)地分配和釋放內(nèi)存。為了消兩個(gè)函數(shù)動(dòng)態(tài)地分配和釋放內(nèi)存。為了消除多次動(dòng)態(tài)分配與釋放內(nèi)存所引起的內(nèi)存碎片和分配、除多次動(dòng)態(tài)分配與釋放內(nèi)存所引起的內(nèi)存碎片和分配、釋放函數(shù)執(zhí)行時(shí)間的不確定性的現(xiàn)象,釋放函數(shù)執(zhí)行時(shí)間的不確定性的現(xiàn)象,C COS-OS-把連把連續(xù)的大塊內(nèi)存按分區(qū)來(lái)進(jìn)行管理。每個(gè)分區(qū)中都包含若續(xù)的大塊內(nèi)存按分區(qū)來(lái)進(jìn)行管理。每個(gè)分區(qū)中都包含若干個(gè)存儲(chǔ)容量大
25、小相同的內(nèi)存塊,但不同分區(qū)之間的內(nèi)干個(gè)存儲(chǔ)容量大小相同的內(nèi)存塊,但不同分區(qū)之間的內(nèi)存塊容量大小是可以不同的。在需要?jiǎng)討B(tài)分配內(nèi)存時(shí),存塊容量大小是可以不同的。在需要?jiǎng)討B(tài)分配內(nèi)存時(shí),可選擇一個(gè)適當(dāng)?shù)姆謪^(qū),按塊來(lái)分配內(nèi)存。在釋放內(nèi)存可選擇一個(gè)適當(dāng)?shù)姆謪^(qū),按塊來(lái)分配內(nèi)存。在釋放內(nèi)存時(shí),將該塊放回它以前所屬的分區(qū)。這樣,就能有效解時(shí),將該塊放回它以前所屬的分區(qū)。這樣,就能有效解決內(nèi)存碎片問題。而且每次調(diào)用決內(nèi)存碎片問題。而且每次調(diào)用malloc()malloc()和和free()free()分配分配和釋放的都是整數(shù)倍的固定內(nèi)存塊長(zhǎng),這樣執(zhí)行時(shí)間就和釋放的都是整數(shù)倍的固定內(nèi)存塊長(zhǎng),這樣執(zhí)行時(shí)間就是確定的了
26、。是確定的了。 16(1 1)內(nèi)存管理控制塊)內(nèi)存管理控制塊OS_MEMOS_MEM為便于內(nèi)存的管理,為便于內(nèi)存的管理,C COS-IIOS-II中使用內(nèi)存控制塊中使用內(nèi)存控制塊(Memory Control Blocks)(Memory Control Blocks)的數(shù)據(jù)結(jié)構(gòu)跟蹤每一個(gè)內(nèi)存的數(shù)據(jù)結(jié)構(gòu)跟蹤每一個(gè)內(nèi)存分區(qū)系統(tǒng),每個(gè)分區(qū)都有屬于自己的內(nèi)存控制塊,系統(tǒng)分區(qū)系統(tǒng),每個(gè)分區(qū)都有屬于自己的內(nèi)存控制塊,系統(tǒng)是通過內(nèi)存控制塊數(shù)據(jù)結(jié)構(gòu)是通過內(nèi)存控制塊數(shù)據(jù)結(jié)構(gòu)OS_MEMOS_MEM來(lái)管理內(nèi)存的。來(lái)管理內(nèi)存的。 (2 2)內(nèi)存管理)內(nèi)存管理內(nèi)存管理主要通過以下內(nèi)存管理主要通過以下4 4個(gè)函數(shù)來(lái)實(shí)
27、現(xiàn):個(gè)函數(shù)來(lái)實(shí)現(xiàn): OSMemCreate()OSMemCreate()函數(shù),用于建立一個(gè)內(nèi)存分區(qū)。函數(shù),用于建立一個(gè)內(nèi)存分區(qū)。該函數(shù)共有該函數(shù)共有4 4個(gè)參數(shù):內(nèi)存分區(qū)的起始地址、分區(qū)內(nèi)的個(gè)參數(shù):內(nèi)存分區(qū)的起始地址、分區(qū)內(nèi)的內(nèi)存塊數(shù)、每個(gè)內(nèi)存塊的字節(jié)數(shù)和一個(gè)指向錯(cuò)誤信息代內(nèi)存塊數(shù)、每個(gè)內(nèi)存塊的字節(jié)數(shù)和一個(gè)指向錯(cuò)誤信息代碼的指針。碼的指針。 OSMemGet()OSMemGet()函數(shù),用于分配一個(gè)內(nèi)存塊。當(dāng)調(diào)度函數(shù),用于分配一個(gè)內(nèi)存塊。當(dāng)調(diào)度某任務(wù)執(zhí)行時(shí),必須先從已建立的內(nèi)存分區(qū)中為該任務(wù)某任務(wù)執(zhí)行時(shí),必須先從已建立的內(nèi)存分區(qū)中為該任務(wù)申請(qǐng)一個(gè)內(nèi)存塊。申請(qǐng)一個(gè)內(nèi)存塊。 OSMemPut()O
28、SMemPut()函數(shù),釋放一個(gè)內(nèi)存塊。當(dāng)某一任務(wù)函數(shù),釋放一個(gè)內(nèi)存塊。當(dāng)某一任務(wù)不再使用一個(gè)內(nèi)存塊時(shí),必須及時(shí)地把它放回到相應(yīng)的不再使用一個(gè)內(nèi)存塊時(shí),必須及時(shí)地把它放回到相應(yīng)的內(nèi)存分區(qū)中,以便下一次的分配操作。內(nèi)存分區(qū)中,以便下一次的分配操作。 OSMemQuery()OSMemQuery()函數(shù),用于查詢一個(gè)特定內(nèi)存分區(qū)函數(shù),用于查詢一個(gè)特定內(nèi)存分區(qū)的狀態(tài)。如查詢某內(nèi)存分區(qū)中內(nèi)存塊的大小、可用內(nèi)存的狀態(tài)。如查詢某內(nèi)存分區(qū)中內(nèi)存塊的大小、可用內(nèi)存塊數(shù)和正在使用的內(nèi)存塊數(shù)等信息。塊數(shù)和正在使用的內(nèi)存塊數(shù)等信息。17(3 3)時(shí)間管理)時(shí)間管理與大部分內(nèi)核一樣,與大部分內(nèi)核一樣,C COS-OS
29、-要求提供定時(shí)中斷,以實(shí)現(xiàn)延時(shí)要求提供定時(shí)中斷,以實(shí)現(xiàn)延時(shí)與超時(shí)控制等功能。這個(gè)定時(shí)中斷也可以被叫作為時(shí)鐘節(jié)拍。在與超時(shí)控制等功能。這個(gè)定時(shí)中斷也可以被叫作為時(shí)鐘節(jié)拍。在相關(guān)的內(nèi)容中,介紹了時(shí)鐘的中斷服務(wù)子程序(相關(guān)的內(nèi)容中,介紹了時(shí)鐘的中斷服務(wù)子程序(ISRISR)和時(shí)鐘節(jié))和時(shí)鐘節(jié)拍函數(shù)拍函數(shù)OSTimeTick()OSTimeTick()。時(shí)鐘節(jié)拍函數(shù)的作用是用于通知。時(shí)鐘節(jié)拍函數(shù)的作用是用于通知C COS-OS-發(fā)生了時(shí)鐘節(jié)拍中斷,下面再介紹幾個(gè)可以處理時(shí)間問題的函發(fā)生了時(shí)鐘節(jié)拍中斷,下面再介紹幾個(gè)可以處理時(shí)間問題的函數(shù)。數(shù)。任務(wù)延時(shí)函數(shù)任務(wù)延時(shí)函數(shù)OSTimeDIy()OSTimeD
30、Iy() 調(diào)用該函數(shù)會(huì)使調(diào)用該函數(shù)會(huì)使C COS-OS-進(jìn)行一次任務(wù)調(diào)度,并且執(zhí)行下進(jìn)行一次任務(wù)調(diào)度,并且執(zhí)行下一個(gè)優(yōu)先級(jí)最高的就緒態(tài)任務(wù)。任務(wù)調(diào)用一個(gè)優(yōu)先級(jí)最高的就緒態(tài)任務(wù)。任務(wù)調(diào)用OSTimeDly()OSTimeDly()后,一旦后,一旦規(guī)定的時(shí)間期滿或者有其他任務(wù)通過調(diào)用規(guī)定的時(shí)間期滿或者有其他任務(wù)通過調(diào)用OSTimeDlyResume()OSTimeDlyResume()取取消了延時(shí),它就會(huì)立即進(jìn)入就緒狀態(tài)。只有當(dāng)該任務(wù)在所有就緒消了延時(shí),它就會(huì)立即進(jìn)入就緒狀態(tài)。只有當(dāng)該任務(wù)在所有就緒任務(wù)中具有最高的優(yōu)先級(jí)時(shí),它才會(huì)立即運(yùn)行。任務(wù)中具有最高的優(yōu)先級(jí)時(shí),它才會(huì)立即運(yùn)行?;謴?fù)延時(shí)的任務(wù)函
31、數(shù)恢復(fù)延時(shí)的任務(wù)函數(shù)OSTimeDlyResume()OSTimeDlyResume() C COS-IIOS-II具有允許結(jié)束正處于延時(shí)期的任務(wù)的功能。具體具有允許結(jié)束正處于延時(shí)期的任務(wù)的功能。具體方法是通過調(diào)用方法是通過調(diào)用OSTimeDlyResume()OSTimeDlyResume()和指定要恢復(fù)的任務(wù)的優(yōu)先和指定要恢復(fù)的任務(wù)的優(yōu)先級(jí)的方式,這樣延時(shí)的任務(wù)就可以不用等待延時(shí)期滿,而是通過級(jí)的方式,這樣延時(shí)的任務(wù)就可以不用等待延時(shí)期滿,而是通過其 他 任 務(wù) 取 消 延 時(shí) 來(lái) 使 自 己 處 于 就 緒 態(tài) 。 實(shí) 際 上 ,其 他 任 務(wù) 取 消 延 時(shí) 來(lái) 使 自 己 處 于 就
32、 緒 態(tài) 。 實(shí) 際 上 ,OSTimeDlyResume()OSTimeDlyResume()也可喚醒正在等待事件的任務(wù)。也可喚醒正在等待事件的任務(wù)。18按時(shí)、分、秒、毫秒延時(shí)函數(shù)按時(shí)、分、秒、毫秒延時(shí)函數(shù)OSTimeDlyHMSM()OSTimeDlyHMSM() OSTimeDly() OSTimeDly()是一個(gè)非常有用的函數(shù),但用戶的應(yīng)用程序須要是一個(gè)非常有用的函數(shù),但用戶的應(yīng)用程序須要知道延時(shí)時(shí)間所對(duì)應(yīng)的時(shí)鐘節(jié)拍的數(shù)目。增加了知道延時(shí)時(shí)間所對(duì)應(yīng)的時(shí)鐘節(jié)拍的數(shù)目。增加了OSTimeDlyHMSM()OSTimeDlyHMSM()函數(shù)后,就可按時(shí)、分、秒和毫秒來(lái)定義時(shí)間了,這樣會(huì)顯得更
33、函數(shù)后,就可按時(shí)、分、秒和毫秒來(lái)定義時(shí)間了,這樣會(huì)顯得更加方便。與加方便。與OSTimeDly()OSTimeDly()一樣,調(diào)用一樣,調(diào)用OSTimeDIyHMSM()OSTimeDIyHMSM()函數(shù)也會(huì)使函數(shù)也會(huì)使C COS-IIOS-II進(jìn)行一次任務(wù)調(diào)度,并且執(zhí)行下一個(gè)優(yōu)先級(jí)最高的就進(jìn)行一次任務(wù)調(diào)度,并且執(zhí)行下一個(gè)優(yōu)先級(jí)最高的就緒態(tài)任務(wù)。任務(wù)調(diào)用緒態(tài)任務(wù)。任務(wù)調(diào)用OSTimeDlyHMSM()OSTimeDlyHMSM()后,一旦規(guī)定的時(shí)間期滿后,一旦規(guī)定的時(shí)間期滿或有其他任務(wù)通過調(diào)用或有其他任務(wù)通過調(diào)用OSTimeDlyResume()OSTimeDlyResume()取消了延時(shí),它
34、就會(huì)取消了延時(shí),它就會(huì)立即處于就緒態(tài)。同樣,只有當(dāng)該任務(wù)在所有就緒態(tài)任務(wù)中具有立即處于就緒態(tài)。同樣,只有當(dāng)該任務(wù)在所有就緒態(tài)任務(wù)中具有最高的優(yōu)先級(jí)時(shí),它才會(huì)立即運(yùn)行。最高的優(yōu)先級(jí)時(shí),它才會(huì)立即運(yùn)行。系統(tǒng)時(shí)間函數(shù)系統(tǒng)時(shí)間函數(shù)OSTimeGet()OSTimeGet()和和OSTimeSet()OSTimeSet() 無(wú)論時(shí)鐘節(jié)拍何時(shí)發(fā)生,無(wú)論時(shí)鐘節(jié)拍何時(shí)發(fā)生,C COS-IIOS-II都會(huì)將一個(gè)都會(huì)將一個(gè)3232位的計(jì)數(shù)位的計(jì)數(shù)器加器加1 1。這個(gè)計(jì)數(shù)器在調(diào)用。這個(gè)計(jì)數(shù)器在調(diào)用OSStart()OSStart()初始化多任務(wù)和初始化多任務(wù)和 個(gè)節(jié)拍執(zhí)行完一遍后,從個(gè)節(jié)拍執(zhí)行完一遍后,從0 0開始
35、計(jì)數(shù)。在時(shí)鐘節(jié)拍頻率等于開始計(jì)數(shù)。在時(shí)鐘節(jié)拍頻率等于100Hz100Hz時(shí),這個(gè)時(shí),這個(gè)3232位的計(jì)數(shù)器每隔位的計(jì)數(shù)器每隔497497天就重新開始計(jì)數(shù)。在執(zhí)行的過天就重新開始計(jì)數(shù)。在執(zhí)行的過程中可以通過調(diào)用程中可以通過調(diào)用OSTimeGet()OSTimeGet()函數(shù)來(lái)獲得該計(jì)數(shù)器的當(dāng)前值,函數(shù)來(lái)獲得該計(jì)數(shù)器的當(dāng)前值,也可以通過調(diào)用也可以通過調(diào)用OSTimeSet()OSTimeSet()函數(shù)來(lái)改變?cè)撚?jì)數(shù)器的值。函數(shù)來(lái)改變?cè)撚?jì)數(shù)器的值。192 2、任務(wù)的管理、任務(wù)的管理COS-II提過大量的提過大量的API函數(shù)實(shí)現(xiàn)對(duì)任務(wù)的管理,主要的任務(wù)函數(shù)實(shí)現(xiàn)對(duì)任務(wù)的管理,主要的任務(wù)有:有:(1)建立任
36、務(wù))建立任務(wù)COS-II要管理用戶的任務(wù),就必須先建立任務(wù)。通過將任務(wù)要管理用戶的任務(wù),就必須先建立任務(wù)。通過將任務(wù)的地址和其他參數(shù)傳遞給以下兩個(gè)函數(shù)來(lái)建立任務(wù)。的地址和其他參數(shù)傳遞給以下兩個(gè)函數(shù)來(lái)建立任務(wù)。OSTaskCreate()和帶有擴(kuò)展附加功能的和帶有擴(kuò)展附加功能的OSTaskCreateExt()函數(shù)。函數(shù)。在在main()函數(shù)內(nèi)開始多任務(wù)調(diào)度(函數(shù)內(nèi)開始多任務(wù)調(diào)度(OSStart()前,必須至少建立一前,必須至少建立一個(gè)任務(wù),而且任務(wù)不能由中斷服務(wù)程序(個(gè)任務(wù),而且任務(wù)不能由中斷服務(wù)程序(ISR)建立。)建立。創(chuàng)建一個(gè)任務(wù)控制塊,并通過任務(wù)控制塊把任務(wù)代碼和任務(wù)堆棧創(chuàng)建一個(gè)任務(wù)控
37、制塊,并通過任務(wù)控制塊把任務(wù)代碼和任務(wù)堆棧關(guān)聯(lián)起來(lái)形成一個(gè)完整的任務(wù)。還有使剛創(chuàng)建的任務(wù)進(jìn)入就緒狀關(guān)聯(lián)起來(lái)形成一個(gè)完整的任務(wù)。還有使剛創(chuàng)建的任務(wù)進(jìn)入就緒狀態(tài),并引發(fā)一次任務(wù)調(diào)度(取決于任務(wù)是否處于多多任務(wù)工作狀態(tài),并引發(fā)一次任務(wù)調(diào)度(取決于任務(wù)是否處于多多任務(wù)工作狀態(tài))。態(tài))。20兩個(gè)函數(shù)兩個(gè)函數(shù)OSTaskCreate()OSTaskCreate()和和OSTaskCreateExt()OSTaskCreateExt()原型如下:原型如下:INT8U OSTaskCreate(INT8U OSTaskCreate( void ( void (* *task)(void task)(void
38、* *pd); /pd); /指向任務(wù)指向任務(wù)的指針的指針 void void * * pdata; / pdata; /傳遞給傳遞給任務(wù)的參數(shù)任務(wù)的參數(shù) OS_STK OS_STK * * ptos;/ ptos;/指向任務(wù)堆棧棧頂?shù)闹钢赶蛉蝿?wù)堆棧棧頂?shù)闹羔樶?INT8U prio / INT8U prio /任務(wù)的優(yōu)任務(wù)的優(yōu)先級(jí)先級(jí)) )21INT8U OSTaskCreateExt(INT8U OSTaskCreateExt( void ( void (* *task)(void task)(void * *pd); /pd); /指向任務(wù)的指針指向任務(wù)的指針 void void * *
39、 pdata; / pdata; /傳遞給任務(wù)的參數(shù)傳遞給任務(wù)的參數(shù) OS_STK OS_STK * * ptos;/ ptos;/指向任務(wù)堆棧棧頂?shù)闹羔樦赶蛉蝿?wù)堆棧棧頂?shù)闹羔?INT8U prio / INT8U prio /任務(wù)的優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí) INT16U id / INT16U id /任務(wù)的標(biāo)識(shí)任務(wù)的標(biāo)識(shí) OS_STK OS_STK * * pbos;/ pbos;/指向任務(wù)堆棧棧低的指針指向任務(wù)堆棧棧低的指針 INT32U stk_siaze; / INT32U stk_siaze; /任務(wù)堆棧容量任務(wù)堆棧容量 void void * * pext; / pext; /指向附加
40、數(shù)據(jù)域的指指向附加數(shù)據(jù)域的指針針 INT16U opt / INT16U opt /用于設(shè)定操作選項(xiàng)用于設(shè)定操作選項(xiàng) ) ) 在調(diào)用任務(wù)建立函數(shù)后,在調(diào)用任務(wù)建立函數(shù)后, C COS-IIOS-II內(nèi)核會(huì)首先從內(nèi)核會(huì)首先從TCBTCB空閑列表內(nèi)申請(qǐng)一個(gè)空的空閑列表內(nèi)申請(qǐng)一個(gè)空的TCBTCB指針;然后根據(jù)用戶給指針;然后根據(jù)用戶給出的參數(shù)初始化任務(wù)堆棧,并在內(nèi)部的任務(wù)就緒表中標(biāo)出的參數(shù)初始化任務(wù)堆棧,并在內(nèi)部的任務(wù)就緒表中標(biāo)記該任務(wù)為就緒狀態(tài);最后返回。這樣就建立了一個(gè)任記該任務(wù)為就緒狀態(tài);最后返回。這樣就建立了一個(gè)任務(wù)。務(wù)。22(2 2)任務(wù)堆棧)任務(wù)堆棧在在C COS-IIOS-II中,每個(gè)
41、任務(wù)都有自己的堆??臻g。堆棧中,每個(gè)任務(wù)都有自己的堆??臻g。堆棧必須聲明為必須聲明為OS_STKOS_STK類型,并且由連續(xù)的內(nèi)存空間組成。類型,并且由連續(xù)的內(nèi)存空間組成??梢造o態(tài)分配堆??臻g(在編譯時(shí)分配),也可以動(dòng)態(tài)可以靜態(tài)分配堆??臻g(在編譯時(shí)分配),也可以動(dòng)態(tài)分配堆??臻g(在運(yùn)行時(shí)分配),這兩種聲明方式都應(yīng)分配堆棧空間(在運(yùn)行時(shí)分配),這兩種聲明方式都應(yīng)放置在函數(shù)外面。放置在函數(shù)外面。任務(wù)所需堆棧的容量由應(yīng)用程序確定。但必須考慮到任任務(wù)所需堆棧的容量由應(yīng)用程序確定。但必須考慮到任務(wù)調(diào)用的所有函數(shù)的嵌套情況、任務(wù)調(diào)用的所有函數(shù)為務(wù)調(diào)用的所有函數(shù)的嵌套情況、任務(wù)調(diào)用的所有函數(shù)為局部變量分配
42、的所有內(nèi)存的數(shù)目,以及所有可能的中斷局部變量分配的所有內(nèi)存的數(shù)目,以及所有可能的中斷服務(wù)子程序嵌套對(duì)堆棧的需求。此外,堆棧必須能夠保服務(wù)子程序嵌套對(duì)堆棧的需求。此外,堆棧必須能夠保存存CPUCPU所有的寄存器。所有的寄存器。C COS-IIOS-II提供了堆棧檢驗(yàn)函數(shù)提供了堆棧檢驗(yàn)函數(shù)OSTaskStkChk()OSTaskStkChk(),用來(lái),用來(lái)確定任務(wù)實(shí)際需要的堆??臻g的大小。這樣能夠避免為確定任務(wù)實(shí)際需要的堆??臻g的大小。這樣能夠避免為任務(wù)分配過多的堆??臻g,從而減少應(yīng)用程序代碼所需任務(wù)分配過多的堆??臻g,從而減少應(yīng)用程序代碼所需的的RAMRAM數(shù)量。調(diào)用堆棧檢驗(yàn)函數(shù)后,所得到的只是
43、一個(gè)數(shù)量。調(diào)用堆棧檢驗(yàn)函數(shù)后,所得到的只是一個(gè)大致的堆棧使用情況,并不能說明堆棧使用的全部實(shí)際大致的堆棧使用情況,并不能說明堆棧使用的全部實(shí)際情況。為了適應(yīng)系統(tǒng)以后的升級(jí)和擴(kuò)展,應(yīng)該多分配情況。為了適應(yīng)系統(tǒng)以后的升級(jí)和擴(kuò)展,應(yīng)該多分配1010100100的堆??臻g。的堆??臻g。23(3 3)任務(wù)的掛起和恢復(fù))任務(wù)的掛起和恢復(fù)掛起一個(gè)任務(wù),就是停止這個(gè)任務(wù)的運(yùn)行。在掛起一個(gè)任務(wù),就是停止這個(gè)任務(wù)的運(yùn)行。在uC/OS-IIuC/OS-II中,用戶任務(wù)可以通過調(diào)用系統(tǒng)提供的中,用戶任務(wù)可以通過調(diào)用系統(tǒng)提供的函數(shù)函數(shù)OSTaskSuspend()OSTaskSuspend()來(lái)掛起自身或者除空閑任來(lái)掛
44、起自身或者除空閑任務(wù)之外的其他任務(wù)。掛起的任務(wù),只能在其他任務(wù)之外的其他任務(wù)。掛起的任務(wù),只能在其他任務(wù)中通過調(diào)用恢復(fù)函數(shù)務(wù)中通過調(diào)用恢復(fù)函數(shù)OSTaskResume()OSTaskResume()使其恢復(fù)使其恢復(fù)為就緒狀態(tài)。該函數(shù)并不要求和掛起函數(shù)為就緒狀態(tài)。該函數(shù)并不要求和掛起函數(shù)OSTaskSuspend()OSTaskSuspend()成對(duì)使用。成對(duì)使用。但是,如果任務(wù)在被掛起的同時(shí)還在等待延遲時(shí)但是,如果任務(wù)在被掛起的同時(shí)還在等待延遲時(shí)間到,則需要對(duì)任務(wù)取消掛起操作,并且要繼續(xù)間到,則需要對(duì)任務(wù)取消掛起操作,并且要繼續(xù)等待延遲時(shí)間到,任務(wù)才能轉(zhuǎn)入就緒狀態(tài)。等待延遲時(shí)間到,任務(wù)才能轉(zhuǎn)入
45、就緒狀態(tài)。24(4 4)任務(wù)的刪除)任務(wù)的刪除 刪除一個(gè)任務(wù),就是把該任務(wù)置于睡眠狀態(tài),任務(wù)刪除一個(gè)任務(wù),就是把該任務(wù)置于睡眠狀態(tài),任務(wù)的代碼不再被的代碼不再被uC/OS-IIuC/OS-II使用,而并不是說任務(wù)的代碼被使用,而并不是說任務(wù)的代碼被刪除了。調(diào)用刪除了。調(diào)用OSTaskDel()OSTaskDel()后,先進(jìn)行條件判斷,當(dāng)所后,先進(jìn)行條件判斷,當(dāng)所有的條件都滿足后,就會(huì)從所有可能的有的條件都滿足后,就會(huì)從所有可能的uC/OS-IIuC/OS-II的數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)中去除任務(wù)的任務(wù)控制塊結(jié)構(gòu)中去除任務(wù)的任務(wù)控制塊OS_TCB,OS_TCB,這樣就不會(huì)被其這樣就不會(huì)被其他的任務(wù)或中斷服
46、務(wù)子程序置于就緒態(tài),即任務(wù)置于休他的任務(wù)或中斷服務(wù)子程序置于就緒態(tài),即任務(wù)置于休眠狀態(tài)。眠狀態(tài)。函數(shù)原型如下:函數(shù)原型如下: INT8U OSTaskDel(INT8U prio) INT8U OSTaskDel(INT8U prio) 可刪除任務(wù)自身或者除了空閑任務(wù)之外的其他任務(wù)??蓜h除任務(wù)自身或者除了空閑任務(wù)之外的其他任務(wù)。刪除自己參數(shù)為:刪除自己參數(shù)為: OS_PRIO_SELF OS_PRIO_SELF 直接調(diào)用這樣的刪除任務(wù),可能出現(xiàn)某些問題,如直接調(diào)用這樣的刪除任務(wù),可能出現(xiàn)某些問題,如果任務(wù)擁有一些動(dòng)態(tài)的內(nèi)存或者信號(hào)量之類的資源,那果任務(wù)擁有一些動(dòng)態(tài)的內(nèi)存或者信號(hào)量之類的資源,那
47、么如果它被刪除了,它的資源就不會(huì)被釋放而丟失,會(huì)么如果它被刪除了,它的資源就不會(huì)被釋放而丟失,會(huì)造成同樣使用資源的其他任務(wù)進(jìn)入死等待,出現(xiàn)錯(cuò)誤情造成同樣使用資源的其他任務(wù)進(jìn)入死等待,出現(xiàn)錯(cuò)誤情況。要慎重使用。提供了一個(gè)可以在請(qǐng)求刪除方和被刪況。要慎重使用。提供了一個(gè)可以在請(qǐng)求刪除方和被刪除方通信完成刪除的函數(shù)。原型如下:除方通信完成刪除的函數(shù)。原型如下: INT8U OSTaskDelReq(INT8U prio) INT8U OSTaskDelReq(INT8U prio) 返回是否被返回是否被刪除和是否有要?jiǎng)h除自己的要求。被刪除方調(diào)用得知要?jiǎng)h除和是否有要?jiǎng)h除自己的要求。被刪除方調(diào)用得知要?jiǎng)h
48、除自己,釋放資源后,在刪除自己。刪除自己,釋放資源后,在刪除自己。25(5 5)其他任務(wù)管理函數(shù))其他任務(wù)管理函數(shù)任務(wù)優(yōu)先級(jí)別修改任務(wù)優(yōu)先級(jí)別修改 任務(wù)運(yùn)行過程中,用戶可以根據(jù)需要來(lái)改變?nèi)蝿?wù)的任務(wù)運(yùn)行過程中,用戶可以根據(jù)需要來(lái)改變?nèi)蝿?wù)的優(yōu)先級(jí)別。調(diào)用的函數(shù)原型如下:優(yōu)先級(jí)別。調(diào)用的函數(shù)原型如下: INT8U OSTaskChangePrio( INT8U OSTaskChangePrio( INT8U oldprio; / INT8U oldprio; /任務(wù)現(xiàn)在的優(yōu)先級(jí)任務(wù)現(xiàn)在的優(yōu)先級(jí)別別 INT8U newprio / INT8U newprio /要修改的優(yōu)先級(jí)別要修改的優(yōu)先級(jí)別 ) )
49、 查詢?nèi)蝿?wù)的信息查詢?nèi)蝿?wù)的信息 查詢一些任務(wù)中的信息,函數(shù)原型如下:查詢一些任務(wù)中的信息,函數(shù)原型如下: INT8U OSTaskQuery( INT8U OSTaskQuery( INT8U prio; INT8U prio; OS_TCB OS_TCB * * pdata pdata ) )263 3、任務(wù)間同步與通信的管理、任務(wù)間同步與通信的管理uC/OS-IIuC/OS-II中,使用信號(hào)量、郵箱(消息郵箱)和中,使用信號(hào)量、郵箱(消息郵箱)和消息隊(duì)列來(lái)實(shí)現(xiàn)任務(wù)相互同步或相互之間的通信。消息隊(duì)列來(lái)實(shí)現(xiàn)任務(wù)相互同步或相互之間的通信。 uC/OS-II uC/OS-II把關(guān)于它們的操作都定義
50、為全局函把關(guān)于它們的操作都定義為全局函數(shù),以供應(yīng)用程序的所有任務(wù)來(lái)調(diào)用數(shù),以供應(yīng)用程序的所有任務(wù)來(lái)調(diào)用等待任務(wù)列表等待任務(wù)列表 采用采用INT8UINT8U類型的數(shù)組類型的數(shù)組OSEventTblOSEventTbl作為記錄作為記錄等待事件任務(wù)的記錄表,叫做等待任務(wù)表,每個(gè)等待事件任務(wù)的記錄表,叫做等待任務(wù)表,每個(gè)任務(wù)占任務(wù)占1 1位,為位,為1 1表示是等待任務(wù)。表示是等待任務(wù)。任務(wù)的等待時(shí)限,記錄在等待任務(wù)的任務(wù)控制塊任務(wù)的等待時(shí)限,記錄在等待任務(wù)的任務(wù)控制塊TCBTCB的成員的成員OSTCBDlyOSTCBDly中中27(1 1)事件控制塊)事件控制塊 uC/OS-II uC/OS-II
51、使用叫做事件控制塊使用叫做事件控制塊ECBECB的數(shù)的數(shù)據(jù)結(jié)構(gòu)來(lái)描述諸如信號(hào)量、郵箱和消息隊(duì)列據(jù)結(jié)構(gòu)來(lái)描述諸如信號(hào)量、郵箱和消息隊(duì)列這些事件。事件控制塊包含包括等待任務(wù)表這些事件。事件控制塊包含包括等待任務(wù)表在內(nèi)的所有有關(guān)事件的數(shù)據(jù)。在內(nèi)的所有有關(guān)事件的數(shù)據(jù)。28操作事件控制塊的函數(shù)操作事件控制塊的函數(shù) uC/OS-II uC/OS-II有有4 4個(gè)對(duì)事件控制塊進(jìn)行基本操作的個(gè)對(duì)事件控制塊進(jìn)行基本操作的函數(shù)(定義在函數(shù)(定義在OS_CORE.COS_CORE.C中)。中)。事件控制塊的初始化函數(shù)事件控制塊的初始化函數(shù) void OS_EventWaitListInit(OS_ENENT voi
52、d OS_EventWaitListInit(OS_ENENT * * pevent )pevent ) 把變量把變量OSEventGrpOSEventGrp及任務(wù)等待表中的每一位都及任務(wù)等待表中的每一位都清清0 0,即令事件的任務(wù)等待表中不含有任何等待任,即令事件的任務(wù)等待表中不含有任何等待任務(wù)。該函數(shù)被務(wù)。該函數(shù)被OSXXXCreateOSXXXCreate()創(chuàng)建時(shí)所調(diào)用。()創(chuàng)建時(shí)所調(diào)用。 XXX Sem XXX Sem 信號(hào)量信號(hào)量 Mutex Mutex 互斥信號(hào)量互斥信號(hào)量 Mbox Mbox 消息郵箱消息郵箱 Q Q 消息隊(duì)列消息隊(duì)列29l使一個(gè)任務(wù)進(jìn)入等待狀態(tài)的函數(shù)使一個(gè)任務(wù)
53、進(jìn)入等待狀態(tài)的函數(shù)l void OS_EventTaskWait( OS_ENENT void OS_EventTaskWait( OS_ENENT * * pevent) pevent)l 將在任務(wù)調(diào)用函數(shù)將在任務(wù)調(diào)用函數(shù)OSXXXPendOSXXXPend()請(qǐng)求一個(gè)事件時(shí)調(diào)用。()請(qǐng)求一個(gè)事件時(shí)調(diào)用。l使一個(gè)正在等待任務(wù)進(jìn)入就緒狀態(tài)的函數(shù)使一個(gè)正在等待任務(wù)進(jìn)入就緒狀態(tài)的函數(shù)l INT8U OS_EventTaskRdy( OS_EVENT INT8U OS_EventTaskRdy( OS_EVENT * * pevent, pevent, void void * *msg , INT8
54、U msk) msg , INT8U msk) l 作用:把調(diào)用這個(gè)函數(shù)的任務(wù)在任務(wù)等待表中的位置清作用:把調(diào)用這個(gè)函數(shù)的任務(wù)在任務(wù)等待表中的位置清0 0后,再把任務(wù)在任務(wù)就緒表中的對(duì)應(yīng)的位置后,再把任務(wù)在任務(wù)就緒表中的對(duì)應(yīng)的位置1 1,然后引發(fā)一次,然后引發(fā)一次任務(wù)調(diào)度任務(wù)調(diào)度l 將在任務(wù)調(diào)用函數(shù)將在任務(wù)調(diào)用函數(shù)OSXXXPostOSXXXPost()發(fā)送一個(gè)事件時(shí),被調(diào)()發(fā)送一個(gè)事件時(shí),被調(diào)用。用。l使一個(gè)等待超時(shí)的任務(wù)僅需就緒狀態(tài)的函數(shù)使一個(gè)等待超時(shí)的任務(wù)僅需就緒狀態(tài)的函數(shù)l void OS_EventTo(OS_EVENT void OS_EventTo(OS_EVENT * *pe
55、vent)pevent)l 作用:當(dāng)任務(wù)已經(jīng)超過了等待的時(shí)間,卻要使它進(jìn)入就作用:當(dāng)任務(wù)已經(jīng)超過了等待的時(shí)間,卻要使它進(jìn)入就緒狀態(tài)。緒狀態(tài)。l 將在任務(wù)調(diào)用函數(shù)將在任務(wù)調(diào)用函數(shù)OSXXXPendOSXXXPend()請(qǐng)求一個(gè)事()請(qǐng)求一個(gè)事 件時(shí),被調(diào)件時(shí),被調(diào)用用30(2 2)信號(hào)量管理)信號(hào)量管理使用信號(hào)量可以在任務(wù)間傳遞信息,實(shí)現(xiàn)任務(wù)使用信號(hào)量可以在任務(wù)間傳遞信息,實(shí)現(xiàn)任務(wù)與任務(wù)或中斷服務(wù)子程序的同步。與任務(wù)或中斷服務(wù)子程序的同步。 uC/OS-II uC/OS-II中中的信號(hào)量由兩部分組成:的信號(hào)量由兩部分組成:1616位的無(wú)符號(hào)整數(shù)信位的無(wú)符號(hào)整數(shù)信號(hào)量的計(jì)數(shù)值(號(hào)量的計(jì)數(shù)值(0 0
56、6553565535);另一部分是由等);另一部分是由等待該信號(hào)量的任務(wù)組成的等待任務(wù)列表。待該信號(hào)量的任務(wù)組成的等待任務(wù)列表。 uC/OS-IIuC/OS-II提供了以下提供了以下6 6個(gè)函數(shù)對(duì)信號(hào)量進(jìn)行操作。個(gè)函數(shù)對(duì)信號(hào)量進(jìn)行操作。操作操作創(chuàng)建信號(hào)量創(chuàng)建信號(hào)量OSSemCreatOSSemCreat(INT16U cntINT16U cnt)創(chuàng)建,)創(chuàng)建,返回已創(chuàng)建信號(hào)量的指針。返回已創(chuàng)建信號(hào)量的指針。請(qǐng)求信號(hào)量請(qǐng)求信號(hào)量OSSemPendOSSemPend(OS_EVENT OS_EVENT * *peventpevent INT16U timeout INT16U timeout IN
57、T8U INT8U * *errerr)31 time time為為0 0,則表示無(wú)限等待。,則表示無(wú)限等待。 不等待調(diào)用的函數(shù)為不等待調(diào)用的函數(shù)為OSSemAcceptOSSemAccept(OS_EVENT OS_EVENT * * pevent pevent)。)。發(fā)送信號(hào)量發(fā)送信號(hào)量 INT8U OSSemPost INT8U OSSemPost(OS_EVENT OS_EVENT * * pevent pevent) 當(dāng)獲得信號(hào)量,訪問共享資源結(jié)束以后,釋放當(dāng)獲得信號(hào)量,訪問共享資源結(jié)束以后,釋放信號(hào)量,調(diào)用該函數(shù)。先檢查是否有等待該信號(hào)信號(hào)量,調(diào)用該函數(shù)。先檢查是否有等待該信號(hào)量的
58、任務(wù)。沒有,信號(hào)量計(jì)數(shù)器加量的任務(wù)。沒有,信號(hào)量計(jì)數(shù)器加1 1,有,則調(diào),有,則調(diào)用調(diào)度器用調(diào)度器OS_SchedOS_Sched()。()。32l刪除信號(hào)量刪除信號(hào)量l OS_EVENT OS_EVENT * *OSSemDel( OS_EVENT OSSemDel( OS_EVENT * * pevent, pevent,l INT8U opt, INT8U INT8U opt, INT8U * *err)err)l opt OS_DEL_NO_PEND opt OS_DEL_NO_PEND 沒有等待任務(wù)刪除沒有等待任務(wù)刪除l OS_DEL_ALLWAYS OS_DEL_ALLWAYS 立
59、即刪除立即刪除l 只能任務(wù)執(zhí)行,不能在中斷服務(wù)程序中刪除只能任務(wù)執(zhí)行,不能在中斷服務(wù)程序中刪除l查詢信號(hào)量的狀態(tài)查詢信號(hào)量的狀態(tài)l INT8U OSSemQuery INT8U OSSemQuery(OS_EVENT OS_EVENT * * pevent peventl OS_SEM_DATA OS_SEM_DATA * *pdatapdata)l pdata pdata是一個(gè)結(jié)構(gòu)指針,存儲(chǔ)信號(hào)量的狀態(tài)。是一個(gè)結(jié)構(gòu)指針,存儲(chǔ)信號(hào)量的狀態(tài)。33(3 3)消息郵箱管理)消息郵箱管理消息郵箱是消息郵箱是uC/OS-IIuC/OS-II中的一種通信機(jī)制,中的一種通信機(jī)制,通常使用時(shí)要先定義一個(gè)指針型
60、的變量該通常使用時(shí)要先定義一個(gè)指針型的變量該指針指向一個(gè)包含了消息內(nèi)容的特定數(shù)據(jù)指針指向一個(gè)包含了消息內(nèi)容的特定數(shù)據(jù)結(jié)構(gòu)。發(fā)送消息的任務(wù)或中斷服務(wù)子程序結(jié)構(gòu)。發(fā)送消息的任務(wù)或中斷服務(wù)子程序把這個(gè)變量送往郵箱,接收消息的任務(wù)從把這個(gè)變量送往郵箱,接收消息的任務(wù)從郵箱中取出該指針變量,完成信息交換。郵箱中取出該指針變量,完成信息交換。 uC/OS-IIuC/OS-II提供提供6 6種對(duì)消息郵箱的操作,它們種對(duì)消息郵箱的操作,它們通過以下函數(shù)實(shí)現(xiàn):通過以下函數(shù)實(shí)現(xiàn):創(chuàng)建創(chuàng)建OS_EVENT OS_EVENT * * OSMoxCreate( void OSMoxCreate( void * * msg) m
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024專業(yè)加工承攬合同
- 2024西瓜種植收購(gòu)合同范文
- 工程勞務(wù)承包合同的簡(jiǎn)化版本
- 成人高等教育聯(lián)合舉辦協(xié)議
- 2024工程機(jī)械租賃合同范本
- 租房協(xié)議書示范
- 2024標(biāo)識(shí)標(biāo)牌合同
- 信息技術(shù)服務(wù)合作契約樣本
- 2024財(cái)產(chǎn)信托合同范文
- 2024年人力資源派遣協(xié)議范本
- 世界各國(guó)國(guó)家標(biāo)準(zhǔn)制定機(jī)構(gòu)
- 壓路機(jī)合格證及檢驗(yàn)報(bào)告(共3頁(yè))
- Maxsurf 的中文使用手冊(cè)(船舶設(shè)計(jì)建造軟件)
- 《園冶》全文
- 2號(hào)表-天津市基本醫(yī)療保險(xiǎn)住院醫(yī)療費(fèi)申請(qǐng)支付審核單
- 留守兒童成長(zhǎng)檔案(精編版)
- 單位對(duì)個(gè)人教育教學(xué)情況定性綜合分析
- 數(shù)字音效處理器 項(xiàng)目報(bào)告
- 外墻真石漆技術(shù)交底(完整版)
- 趕工措施施工方案(完整版)
- 隨機(jī)前沿分析完整版
評(píng)論
0/150
提交評(píng)論