【正文】
efficient, stable, reliable, energy saving system, widely used in the security, and consumer electronics. And based on the STM32 architecture CortexM3 framework is a superior costeffective new microprocessor, 181。C/OSII operating system theory analysis, method of transplantation, application design and debugging of the simulation implementation. First of all, the theoretical analysis of 181。 Second, analysis of STM32 hardware platform and the demand 181。C/OSII development of LCD, LED, button KEY applications, and analysis of multitasking system debugging. Main research conclusion is as follows: (1) 181。C/OSII transplantation mainly in , file, , three involves the data type definition and task switching etc, stack, interrupt. (3)The application design to the allocation of priorities, initialize the modular processing hardware platform. Key words: embedded system。C/OSII。C/OSII是由美國工程師Jean Labrosse編寫的嵌入式多任務(wù)的實時操作系統(tǒng),包括實時內(nèi)核、任務(wù)管理、時鐘管理、任務(wù)間通信同步(信號量、郵箱、消息隊列)和內(nèi)存管理。C/OSII它具有別的操作系統(tǒng)沒有的優(yōu)點,具體如下:(1)源代碼開放:181。(2)可移植性好:181。(3)穩(wěn)定性高:181。因此,181。C/OSII操作系統(tǒng)是一種很好的選擇。傳統(tǒng)的系統(tǒng)開發(fā)我們往往使用前后臺的方式,但是這種開發(fā)方式在任務(wù)較簡單的開發(fā)中比較適用,對于任務(wù)比較復(fù)雜的系統(tǒng)往往力不從心。RTOS體現(xiàn)了一種新的應(yīng)用程序設(shè)計思想和開放的框架,用戶在編寫程序時,可以分別編寫各個任務(wù),不必同時將所有任務(wù)運行的各種可能情況記在心中,大大減小了程序編寫的工作量,而且減小了出錯的可能,保證最終程序具有高可靠性,從而降低程序的復(fù)雜度和開發(fā)周期。所以,使用實時操作系統(tǒng),將不同的功能劃分成不同的任務(wù)進(jìn)行處理使得設(shè)計大大簡化。中國單片機二十年論壇總結(jié)出,我國嵌入式起步較早,但總體來說發(fā)展緩慢,和國外的開發(fā)應(yīng)用具有很大的差距,造成這一局面的原因是多方面的。例如,經(jīng)典51系列單片機在上世紀(jì)我國的工業(yè)信息化改造過程中發(fā)揮了重要的作用,滲透到生產(chǎn)生活的各個方面。國外的大部分高校和國內(nèi)的極少數(shù)大學(xué)相繼開設(shè)嵌入式微處理器設(shè)計等相關(guān)的前沿性的課程,可見基于STM32技術(shù)將是未來微控制開發(fā)的主流方向。C/OSII系統(tǒng)具有體積小、性能強、功耗武昌工學(xué)院畢業(yè)論文(設(shè)計)專用稿紙2低、可靠性高以及面向行業(yè)應(yīng)用的突出特征,目前已經(jīng)被廣泛的應(yīng)用于軍事國防、消費電子、網(wǎng)絡(luò)通信、工業(yè)控制等各個領(lǐng)域。美國汽車大王福特公司的高級經(jīng)理也曾宣稱,“福特出售的‘計算能力’已超過了IBM ”,由此可以想見嵌入式計算機工業(yè)的規(guī)模和廣度。在國內(nèi),“維納斯計劃”和“女媧計劃”一度鬧得沸沸揚揚,機頂盒、信息加電這兩年更成了IT熱點,而實際上這些都是嵌入式系統(tǒng)在特定環(huán)境下的一個特定應(yīng)用。在國內(nèi),雖然嵌入式應(yīng)用、開發(fā)很廣,但該領(lǐng)域卻幾乎還是空白,只有三兩家公司和極少數(shù)人員在從事這方面工作。 研 究 的 主 要 內(nèi) 容本文是在基于 32 位的 ARM 微處理器 STM32 和嵌入式實時操作系統(tǒng)181。通過將嵌入式實時操作系統(tǒng) 181。建立了基于嵌入式 ARM 處理器的應(yīng)用軟件體系;將 181。C/OSII 下的開發(fā)環(huán)境體系。C/OSII 系統(tǒng)配置、181。完成了基于 STM32 的 181。本文主要分為 4 章,章節(jié)安排如下: (1)緒論。C/OSII 的國內(nèi)外研究現(xiàn)狀。C/OSII 的理論介紹。C/OSII 各模塊的基本功能和在STM32 上移植方法。多任務(wù)的建立并實現(xiàn)基本功能。主要介紹本論文中的優(yōu)點和不足之處。C/OSII 的理論介紹 181。C/OSII 內(nèi)核結(jié)構(gòu)(1)181。C/OSII操作系統(tǒng)進(jìn)行應(yīng)用時,設(shè)計時的主要任務(wù)是將系統(tǒng)合理劃分成多個任務(wù),并由RTOS 進(jìn)行調(diào)度,任務(wù)之間使用181。C/OSII 內(nèi)核文件(與處理器類型無關(guān)的代碼) 181。C/OSII(與處理器類型有關(guān)的代碼) CPU 定時器圖 181。與前后臺系統(tǒng)一樣,基于181。在main主函數(shù)中主要實現(xiàn)181。C/OSII的多任務(wù)啟動OSStart()等常規(guī)操作。 (2)OSInit()初始化181。 181。C/OSII內(nèi)核主要對用戶任務(wù)進(jìn)行調(diào)度和管理,并為任務(wù)間共享資源提供服務(wù)。181。C/OSII系統(tǒng)進(jìn)行調(diào)度的基本單元。任務(wù)函數(shù)和任何C函數(shù)一樣,具有一個返回類型和一個參數(shù),但是它決不返回。當(dāng)任務(wù)的CPU 使用權(quán)被剝奪時,它用來保存該任務(wù)的狀態(tài)。武昌工學(xué)院畢業(yè)論文(設(shè)計)專用稿紙5 任務(wù)調(diào)度器 181。任務(wù)調(diào)度器的功能是:在就緒表中查找最高優(yōu)先級的任務(wù),然后進(jìn)行必要的任務(wù)切換,運行該任務(wù)。C/OSII的任務(wù)調(diào)度有兩種情況:任務(wù)級的任務(wù)調(diào)度由 OS_Sched()完成;中斷級的任務(wù)調(diào)度由OSIntExt()完成。任務(wù)級的任務(wù)調(diào)度是由于有更高優(yōu)先級的任務(wù)進(jìn)入就緒態(tài),當(dāng)前的任務(wù)的CPU使用權(quán)被剝奪,發(fā)生了任務(wù)到任務(wù)的切換;中斷級的調(diào)度是指當(dāng)前運行的任務(wù)被中斷打斷,由于ISR運行過程中有更高優(yōu)先級的任務(wù)被激活進(jìn)入就緒態(tài)。(1)任務(wù)切換任務(wù)切換有兩種:OS_TASK_SW()和OSIntCtxSw()。例如:define OS_TASK_SW() asm(“int 32”)。如:堆棧指針,程序計數(shù)器,狀態(tài)寄存器等。③進(jìn)行 TCB的切換,并運行任務(wù)。由于ISR已經(jīng)將CPU寄存器的值存入被中斷的任務(wù)的堆棧中,所以O(shè)SIntCtxSw()的實現(xiàn)和OS_TASK_SW()不一樣,具體參見移植文檔。OSRdyGrp中,將任務(wù)按優(yōu)先級分組,八個為一組。在就緒表中查找優(yōu)先級最高的任務(wù)不需要掃描整個OSRdyTbl[],只要查優(yōu)先級判定表OSUnMapTbl[] 。 中斷服務(wù)在用戶的ISR 中可以調(diào)用OSIntEnter()和OSIntExit()通知181。 時鐘節(jié)拍181。時鐘節(jié)拍率越高,系統(tǒng)的額外負(fù)荷就越重。系統(tǒng)設(shè)計者可以在第1個開始運行的任務(wù)中調(diào)用時鐘節(jié)拍啟動函數(shù)。181。 OSTimeTick()跟蹤所有任務(wù)的定時器以及超時時限。C/OSII 的初始化和啟動調(diào)用181。OSInit()初始化181。 181。多任務(wù)的啟動是通過調(diào)用OSStart()實現(xiàn)的。OSStart()調(diào)用就緒任務(wù)啟動函數(shù)OSStartHighRdy(),其功能是將任務(wù)棧的值恢復(fù)到CPU 寄存器,并執(zhí)行中斷返回指令,強制執(zhí)行該任務(wù)代碼。但在嵌入式實時系統(tǒng)中,多次這樣的操作會導(dǎo)致內(nèi)存碎片,且由于內(nèi)存管理算法的原因,malloc和free的執(zhí)行時間也是不確定。C/OSII中把連續(xù)的大塊內(nèi)存按分區(qū)管理。用戶需要動態(tài)分配內(nèi)存時,系統(tǒng)選擇一個適當(dāng)?shù)姆謪^(qū),按塊來分配內(nèi)存。 任務(wù)管理181。63為最低級,系統(tǒng)保留了4個最高優(yōu)先級的任務(wù)和4個最低優(yōu)先級的任務(wù),所有用戶可以使用的任務(wù)數(shù)有56個。C/OSII 提供了任務(wù)管理的各種函數(shù)調(diào)用,包括創(chuàng)建任務(wù),刪除任務(wù),改變?nèi)蝿?wù)的優(yōu)先級,任務(wù)掛起和恢復(fù)等。 181。信號量用于對共享資源的訪問,用鑰匙符號,符號旁數(shù)字代表可用資源數(shù),對于二值信號量該值為1?;コ庑托盘柫坑糜谔幚砉蚕碣Y源。(3)消息隊列另一種通信機制,允許一個任務(wù)或者中斷服務(wù)子程序向另一個任務(wù)發(fā)送以指針方式定義的變量或其它任務(wù),因具體應(yīng)用不同,每個指針指向的包含了消息的數(shù)據(jù)結(jié)構(gòu)的變量類型也有所不同。C/OSII的正常運行需要處理器平臺滿足以下要求:(1)處理器的C編譯器能產(chǎn)生可重入代碼。(3)處理器支持中斷,并且能產(chǎn)生定時中斷(通常在10至100Hz之間)。(5)處理器有將堆棧指針和其它CPU寄存器讀出和存儲到堆棧或內(nèi)存中的指令。 定義與處理器無關(guān)的數(shù)據(jù)類型 typede f unsigned char BOOLEAN。 typedef signed char NT8S。 typedef signed short INT16S。 typedef signed int NT32S。 typedef double FP64。 typedef unsigned int OS_CPU_SR。故這部分代碼無需修改。C/OSII定義了float 類型和double 類型,但為了方便移植它們在181。為了方便使用堆棧, 181。在CortexM3 中寄存器為32位,故定義堆棧的長度也為32位。 (2)臨界代碼段 181。這樣的代碼段稱作臨界代碼段。C/OSII 通過定義兩個宏OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL() 來分別實現(xiàn)中斷的關(guān)閉和打開。這兩個宏分別定義如下: define OS_CRITICAL_METHOD 3 define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save()。} 函數(shù)OS_CPU_SR_Save()和OS_CPU_SR_Restore(cpu_sr)中定義。否則編譯時將出錯。C/OSII支持兩種方向生長的棧,但對于以CortexM3為內(nèi)核的STM32 微處理器來說,它支持向下增長的滿棧,故需要定義棧增長方向宏為1。因為這個宏也是與處理器相關(guān)的, 中描述。 void OSCtxSw(void)。 void OSStartHighRdy(void)。 (6)與處理器相關(guān)的匯編代碼()在OS_CP 。 OS_CPU_SR_Restore()。 OSCtxSw()。 函數(shù)實現(xiàn) 武昌工學(xué)院畢業(yè)論文(設(shè)計)專用稿紙9(1)關(guān)中斷函數(shù)(OS_CPU_SR_Save()) 即先保存當(dāng)前的狀態(tài)寄存器然后關(guān)中斷。 (2)恢復(fù)中斷函數(shù)(OS_CPU_SR_Restore() ) 這是宏OS_EXIT_CRITICAL() 的最終實現(xiàn)。此函數(shù)完成的將中斷狀態(tài)恢復(fù)到關(guān)中斷前的狀態(tài)。 (3)啟動最高優(yōu)先級任務(wù)運行(OSStartHighRdy()) OSStart()調(diào)用OSStartHighRdy()來啟動最高優(yōu)先級任務(wù)的運行,從而啟動整個系統(tǒng)。 (4)任務(wù)級和中斷級任務(wù)切換 因為CortexM3 進(jìn)入異常自動保存寄存器 R3R0,R12,LR ,PC和xPSR這種的特殊機制,這兩個函數(shù)都是觸發(fā)一次PendSV來實現(xiàn)任務(wù)的切換。中斷服務(wù)程序退出的時候?qū)⒆詣映鰲3R0 ,R12 ,LR ,PC 和xPSR 。 //保存堆棧的指針到任務(wù)控制塊 } OSTaskSwHook()。 //設(shè)置運行任務(wù)為最高優(yōu)先級就緒任務(wù) OSTCBCur = OSTCBHighRdy。//將要切換的任務(wù)堆棧指 // 針賦給微處理器的堆棧指 // 針從而實現(xiàn)切換 從堆棧中恢復(fù) R4R11。 (5)與CPU 相關(guān)的C 函數(shù)和鉤子函數(shù)( ) 這