基于stm32的嵌入式操作系統(tǒng)程序設計及實現(xiàn)本科_第1頁
已閱讀1頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  本科畢業(yè)論文(設計)</p><p> 論文題目:基于STM32的嵌入式操作系統(tǒng)程序設計及實現(xiàn) </p><p> 姓 名:郝宇</p><p> 學 號:093001020144</p><p> 班 級:01班</p><p> 年 級:2009級</p>

2、<p> 專 業(yè):電子信息工程</p><p> 學 院:信息工程學院</p><p> 指導教師:丁光哲 講師</p><p> 完成時間:2013年5月20日</p><p><b>  作者聲明</b></p><p>  本畢業(yè)論文(設計)是在導師的指導下由本人獨

3、立撰寫完成的,沒有剽竊、抄襲、造假等違反道德、學術規(guī)范和其他侵權行為。對本論文(設計)的研究做出重要貢獻的個人和集體,均已在文中以明確方式標明。因本畢業(yè)論文(設計)引起的法律結果完全由本人承擔。</p><p>  畢業(yè)論文(設計)成果歸武昌工學院所有。</p><p><b>  特此聲明</b></p><p>  基于STM32的嵌入式操

4、作系統(tǒng)</p><p><b>  程序設計及實現(xiàn)</b></p><p><b>  郝宇</b></p><p>  The Design and Implementation of embedded operating system program based on STM32</p><p>

5、;<b>  Hao, Yu</b></p><p>  2013年 5月 20日</p><p><b>  摘 要</b></p><p>  隨著科學技術不斷的進步,工業(yè)生產越來越先進復雜,操作系統(tǒng)µC/OS-II是高效、穩(wěn)定、可靠、節(jié)能的系統(tǒng),廣泛應用安防,消費電子中。而基于Cortex-M3架構

6、下的STM32是一款性價比優(yōu)越新型微處理器,將µC/OS-II移植到STM32上能夠發(fā)揮其高效的性能,從而投入社會生產,制造出很多有用又實惠的電子產品,為我們的生活帶來便利。</p><p>  本文主要的研究內容是µC/OS-II操作系統(tǒng)理論分析、移植方法、應用程序設計及調試仿真實現(xiàn)。首先,對µC/OS-II的理論分析,研究其實際應用及系統(tǒng)結構;其次,分析STM32硬件平臺及

7、81;C/OS-II的移植需求;最后,在µC/OS-II上開發(fā)LCD,LED,按鍵KEY等應用程序,并對多任務系統(tǒng)調試分析。主要研究結論如下:</p><p> ?。?)µC/OS-II操作系統(tǒng)主要分為任務管理、內存管理和時間管理三大部分,其間通信是通過消息隊列和消郵箱。</p><p> ?。?)µC/OS-II移植主要在OS_CPU.H,OS_CPU_C.

8、C,OS_CPU_A.ASM三個文件中,涉及到數(shù)據類型、堆棧、中斷定義和任務切換等。</p><p>  (3)應用程序設計優(yōu)先級分配要合理,硬件平臺初始化模塊化處理。</p><p>  關鍵詞:嵌入式系統(tǒng);µC/OS-II;移植</p><p><b>  Abstract</b></p><p>  Wi

9、th the progress of science and technology constantly, advanced industrial production to more complex, the operating system µC/OS-II is efficient, stable, reliable, energy saving system, widely used in the security,

10、and consumer electronics. And based on the STM32 architecture Cortex-M3 framework is a superior cost-effective new microprocessor, µC/OS-II transplantation to STM32 can play its efficient performance, thus in social

11、 production and create a lot of useful and affordable electronic pro</p><p>  This article main research content is µC/OS-II operating system theory analysis, method of transplantation, application desi

12、gn and debugging of the simulation implementation. First of all, the theoretical analysis of µC/OS-II, research the actual application and system structure; Second, analysis of STM32 hardware platform and the demand

13、 µC/OS-II transplantation. Finally, on the µC/OS-II development of LCD, LED, button KEY applications, and analysis of multitasking system debugging. Main researc</p><p>  (1) µC/OS-II operatin

14、g system consists of three major task management, memory management and time management, in which communication is through the message queue and email. </p><p>  (2) µC/OS-II transplantation mainly in O

15、S_CPU_C.C, OS_CPU_A.ASM file, OS_CPU.H, three involves the data type definition and task switching etc, stack, interrupt. </p><p>  (3)The application design to the allocation of priorities, initialize the m

16、odular processing hardware platform. </p><p>  Key words: embedded system; µC/OS-II; transplant</p><p><b>  目 錄</b></p><p><b>  1 概 述1</b></p&

17、gt;<p>  1.1 研究的目的及意義1</p><p>  1.2 國內外研究狀況綜述1</p><p>  1.3 研究的主要內容2</p><p>  2 µC/OS-II的理論介紹3</p><p>  2.1 µC/OS-II各模塊的基本功能3</p><p>

18、;  2.2 STM32上移植方法7</p><p>  3 LCD屏程序設計及調試12</p><p>  3.1 工具概述12</p><p>  3.2 硬件結構13</p><p>  3.3 C程序設計15</p><p><b>  3.4 調試16</b></p&

19、gt;<p><b>  結 語18</b></p><p><b>  主要參考文獻19</b></p><p><b>  附 錄20</b></p><p>  附錄1 主程序代碼20</p><p><b>  1 概 述<

20、/b></p><p>  1.1 研究的目的及意義</p><p>  µC/OS-II是由美國工程師Jean Labrosse編寫的嵌入式多任務的實時操作系統(tǒng),包括實時內核、任務管理、時鐘管理、任務間通信同步(信號量、郵箱、消息隊列)和內存管理。除了有上面的優(yōu)點外,µC/OS-II它具有別的操作系統(tǒng)沒有的優(yōu)點,具體如下:</p><p>

21、; ?。?)源代碼開放:µC/OS-II的源代碼可以免費獲取,且標有清晰的注釋,可讀性好。</p><p> ?。?)可移植性好:µC/OS-II的源代碼90%以上是用C語言編寫的,可以很容易地把它移植到各類8位、16位和32位處理器上。</p><p> ?。?)穩(wěn)定性高:µC/OS-II已得到FAA的標準認證,且目前已有上百個商業(yè)應用實例,其穩(wěn)定性和可靠性

22、是經過實踐驗證的。</p><p>  因此,µC/OS-II廣泛的應用于控制系統(tǒng)中,如在衍射儀高壓控制系統(tǒng)中使用µC/OS-II操作系統(tǒng)是一種很好的選擇??刂葡到y(tǒng)是一個復雜的系統(tǒng),它需要多個系統(tǒng)協(xié)同工作。傳統(tǒng)的系統(tǒng)開發(fā)我們往往使用前后臺的方式,但是這種開發(fā)方式在任務較簡單的開發(fā)中比較適用,對于任務比較復雜的系統(tǒng)往往力不從心。對于任務較多而且復雜的情況我們就要引入實時操作系統(tǒng)RTOS。<

23、/p><p>  RTOS體現(xiàn)了一種新的應用程序設計思想和開放的框架,用戶在編寫程序時,可以分別編寫各個任務,不必同時將所有任務運行的各種可能情況記在心中,大大減小了程序編寫的工作量,而且減小了出錯的可能,保證最終程序具有高可靠性,從而降低程序的復雜度和開發(fā)周期。由于控制系統(tǒng)功能較復雜,諸多的功能可以劃分成許多不同的模塊,模塊之間既彼此聯(lián)系又相對獨立,可以當作不同的任務來進行處理。所以,使用實時操作系統(tǒng),將不同的功能

24、劃分成不同的任務進行處理使得設計大大簡化。</p><p>  1.2 國內外研究狀況綜述</p><p>  嵌入式系統(tǒng)是繼IT網絡技術之后,又一個新的技術發(fā)展方向。中國單片機二十年論壇總結出,我國嵌入式起步較早,但總體來說發(fā)展緩慢,和國外的開發(fā)應用具有很大的差距,造成這一局面的原因是多方面的。在國內嵌入式系統(tǒng)開發(fā)方面,多是一些低層次的應用,停留在以前老的技術基礎之上。例如,經典51系列

25、單片機在上世紀我國的工業(yè)信息化改造過程中發(fā)揮了重要的作用,滲透到生產生活的各個方面。與此同時在大學電類相關的工科單片機教學中,依然是經典的51,微機原理依然是8086/88,這顯然體現(xiàn)不了最新的技術特征,造成了大學教育與實際社會需要的脫節(jié)。國外的大部分高校和國內的極少數(shù)大學相繼開設嵌入式微處理器設計等相關的前沿性的課程,可見基于STM32技術將是未來微控制開發(fā)的主流方向。由于µC/OS-II系統(tǒng)具有體積小、性能強、功耗低、可靠

26、性高以及面向行業(yè)應用的突出特征,目前已經被廣泛的應用于軍事國防、消費電子、網絡通信、工業(yè)控制等各個領域。</p><p>  今天嵌入式系統(tǒng)帶來的工業(yè)年產值已超過了1萬億美元,1997年來自美國嵌入式系統(tǒng)大會(Embedded System Conference)的報告指出,未來5年僅基于嵌入式計算機系統(tǒng)的全數(shù)字電視產品,就將在美國產生一個每年1500億美元的新市場。美國汽車大王福特公司的高級經理也曾宣稱,“福特

27、出售的‘計算能力’已超過了IBM”,由此可以想見嵌入式計算機工業(yè)的規(guī)模和廣度。1998年11月在美國加州舉行的嵌入式系統(tǒng)大會上,基于RTOS的Embedded Internet成為一個技術新熱點。在國內,“維納斯計劃”和“女媧計劃”一度鬧得沸沸揚揚,機頂盒、信息加電這兩年更成了IT熱點,而實際上這些都是嵌入式系統(tǒng)在特定環(huán)境下的一個特定應用。據調查,目前國際上已有兩百多種嵌入式操作系統(tǒng),而各種各樣的開發(fā)工具、應用于嵌入式開發(fā)的儀器設備更是

28、不可勝數(shù)。在國內,雖然嵌入式應用、開發(fā)很廣,但該領域卻幾乎還是空白,只有三兩家公司和極少數(shù)人員在從事這方面工作。由此可見,嵌入式系統(tǒng)技術發(fā)展的空間真是無比廣大。</p><p>  1.3 研究的主要內容</p><p>  本文是在基于32位的ARM微處理器STM32和嵌入式實時操作系統(tǒng)µC/OS-II上進行嵌入式操作系統(tǒng)的移植和功能實現(xiàn)。通過將嵌入式實時操作系統(tǒng)µC

29、/OS-II移植到STM32微處理器上,并對其進行軟件功能的擴展和硬件擴展,實現(xiàn)了一個基本完整的嵌入式實時操作系統(tǒng)。建立了基于嵌入式ARM處理器的應用軟件體系;將µC/OS-II移植到STM32,建立了嵌入式操作系統(tǒng)研究及µC/OS-II下的開發(fā)環(huán)境體系。包括µC/OS-II系統(tǒng)配置、µC/OS-II下的移植、啟動、測試和功能實現(xiàn)等。完成了基于STM32的µC/OS-II的應用設計。&l

30、t;/p><p>  本文主要分為4章,章節(jié)安排如下: </p><p> ?。?)緒論。主要介紹了開題的背景和研究意義,以及µC/OS-II的國內外研究現(xiàn)狀。</p><p> ?。?)µC/OS-II的理論

31、介紹。主要介紹µC/OS-II各模塊的基本功能和在STM32上移植方法。</p><p> ?。?)硬件平臺介紹及LCD屏程序設計及調試。多任務的建立并實現(xiàn)基本功能。</p><p> ?。?)結語。主要介紹本論文中的優(yōu)點和不足之處。</p><p>  2 µC/OS-II的理論介紹</p><p>  2.1 &#

32、181;C/OS-II各模塊的基本功能</p><p>  2.1.1 µC/OS-II內核結構</p><p> ?。?)µC/OS-II是以源代碼形式提供的實時操作系統(tǒng)內核,其包含的文件結構如圖2.1所示:</p><p>  基于µC/OS-II操作系統(tǒng)進行應用時,設計時的主要任務是將系統(tǒng)合理劃分成多個任務,并由RTOS進行調度,

33、任務之間使用µC/OS-II提供的系統(tǒng)服務進行通信,以配合實現(xiàn)應用系統(tǒng)的功能。與前后臺系統(tǒng)一樣,基于µC/OS-II的多任務系統(tǒng)也有一個main主函數(shù),main函數(shù)由編譯器所帶的C啟動程序調用。在main主函數(shù)中主要實現(xiàn)µC/OS-II的初始化OSInit()、任務創(chuàng)建、一些任務通信方法的創(chuàng)建、µC/OS-II的多任務啟動OSStart()等常規(guī)操作。另外,還有一些應用程序相關的初始化操作,例如:

34、硬件初始化、數(shù)據結構初始化等。 </p><p> ?。?)OSInit()初始化µC/OS-II所有的變量和數(shù)據結構,并建立空閑任務OS_TaskIdle(),這個任務總是處于就緒態(tài)。</p><p>  2.1.2 µC/OS-II內核體系結構圖</p><p>  µC/OS-II內核主要對用戶任務進行調度和管理,并為任務間共

35、享資源提供服務。包含的模塊有任務管理、任務調度、任務間通信、時間管理、內核初始化等。µC/OS-II內核體系結構如圖2.2所示:</p><p>  圖2.2 內核結構圖</p><p>  2.1.3 任務狀態(tài)及其轉換關系</p><p>  在多任務系統(tǒng)中,任務是設計者實現(xiàn)應用系統(tǒng)的基本形式,也是µC/OS-II系統(tǒng)進行調度的基本單元。任務可

36、以是一個無限的循環(huán),也可以在一次執(zhí)行后被操作系統(tǒng)刪除。任務函數(shù)和任何C函數(shù)一樣,具有一個返回類型和一個參數(shù),但是它決不返回。</p><p>  任務控制塊(TCB)是一個數(shù)據結構OS_TCB,一旦一個任務創(chuàng)建,就有一個和它關聯(lián)的TCB被賦值。當任務的CPU使用權被剝奪時,它用來保存該任務的狀態(tài)。這樣,當任務重新獲得CPU使用權時,可以從TCB中獲取任務切換前的信息,準確的繼續(xù)運行。</p><

37、;p>  2.1.4 任務調度器 </p><p>  µC/OS-II總是運行進入就緒態(tài)的優(yōu)先級最高的任務。任務調度器的功能是:在就緒表中查找最高優(yōu)先級的任務,然后進行必要的任務切換,運行該任務。µC/OS-II的任務調度有兩種情況:任務級的任務調度由OS_Sched()完成;中斷級的任務調度由OSIntExt()完成。這兩種任務調度情況調用的任務切換函數(shù)不同:任務級的任務調度OS_S

38、ched()調用了任務切換函數(shù) OS_TASK_SW(),而中斷級的調度OSIntExt()調用了任務切換函數(shù)OSIntCtxSw()。</p><p>  任務級的任務調度是由于有更高優(yōu)先級的任務進入就緒態(tài),當前的任務的CPU使用權被剝奪,發(fā)生了任務到任務的切換;中斷級的調度是指當前運行的任務被中斷打斷,由于ISR運行過程中有更高優(yōu)先級的任務被激活進入就緒態(tài)。而中斷返回前ISR調用OSIntExt()函數(shù),該函

39、數(shù)查找就緒表發(fā)現(xiàn)有必要進行任務切換,從而被中斷的任務進入等待狀態(tài),運行被激活的高優(yōu)先級的任務。</p><p><b>  (1)任務切換</b></p><p>  任務切換有兩種:OS_TASK_SW()和OSIntCtxSw()。任務級的任務切換OS_TASK_SW()是宏調用,通過軟中斷指令來實現(xiàn)CPU寄存器內容切換。例如:#define OS_TASK_SW

40、() asm(“int #32”)。</p><p>  任務級的任務切換過程:①保存當前運行的任務的CPU寄存器值到該任務的堆棧。如:堆棧指針,程序計數(shù)器,狀態(tài)寄存器等。②將要運行的高優(yōu)先級的任務的寄存器值從堆?;謴偷紺PU寄存器。③進行TCB的切換,并運行任務。</p><p>  中斷級的任務切換OSIntCtxSw()是在OSIntExt()中調用的,我們一般在用戶ISR中調用O

41、SIntExt()以實現(xiàn)中斷返回前的任務調度。由于ISR已經將CPU寄存器的值存入被中斷的任務的堆棧中,所以OSIntCtxSw()的實現(xiàn)和OS_TASK_SW()不一樣,具體參見移植文檔。</p><p><b>  (2)就緒表</b></p><p>  每個就緒的任務都放在就緒表中,就緒表有兩個變量:OSRdyGrp和OSRdyTbl[]。OSRdyGrp中,

42、將任務按優(yōu)先級分組,八個為一組。OSRdyGrp的每一位代表每組任務是否有進入就緒態(tài)的任務。</p><p>  在就緒表中查找優(yōu)先級最高的任務不需要掃描整個OSRdyTbl[],只要查優(yōu)先級判定表OSUnMapTbl[]。OSUnMapTbl[]是常量表,所以查找優(yōu)先級最高的任務的執(zhí)行時間為常量,和就緒表的任務數(shù)無關。</p><p>  2.1.5 中斷服務</p>&l

43、t;p>  在用戶的ISR中可以調用OSIntEnter()和OSIntExit()通知µC/OS-II發(fā)生了中斷,這樣可以實現(xiàn)ISR返回前的任務調度。</p><p>  2.1.6 時鐘節(jié)拍</p><p>  µC/OS-II要求用戶提供一個周期性的時鐘源,來實現(xiàn)時間的延遲和超時功能,時鐘節(jié)拍應該每秒發(fā)生10~100次/秒。時鐘節(jié)拍率越高,系統(tǒng)的額外負荷就越

44、重。</p><p>  應該在多任務系統(tǒng)啟動后,也就是調用OSStart()后再開啟時鐘節(jié)拍器。系統(tǒng)設計者可以在第1個開始運行的任務中調用時鐘節(jié)拍啟動函數(shù)。假設用定時器TA0作為時鐘中斷源,那么,在移植過程中實現(xiàn)了函數(shù)init_timer_ta0(),此函數(shù)用來初始化定時器TA0,并將其打開。µC/OS-II中的時鐘節(jié)拍服務是在ISR中調用OSTimeTick()實現(xiàn)的。OSTimeTick()跟蹤所

45、有任務的定時器以及超時時限。</p><p>  2.1.7 µC/OS-II的初始化和啟動</p><p>  調用µC/OS-II的服務之前要先調用系統(tǒng)初始化函數(shù)OSInit()。OSInit()初始化µC/OS-II所有的變量和數(shù)據結構,并建立空閑任務。µC/OS-II初始化任務控制塊、事件控制塊、消息隊列緩沖、標志控制塊等數(shù)據結構的空緩沖區(qū)。

46、</p><p>  多任務的啟動是通過調用OSStart()實現(xiàn)的。啟動之前要至少創(chuàng)建一個任務。OSStart()調用就緒任務啟動函數(shù)OSStartHighRdy(),其功能是將任務棧的值恢復到CPU寄存器,并執(zhí)行中斷返回指令,強制執(zhí)行該任務代碼。</p><p>  2.1.8 內存管理</p><p>  在ANSI C中是使用malloc和free兩個函數(shù)來

47、動態(tài)分配和釋放內存。但在嵌入式實時系統(tǒng)中,多次這樣的操作會導致內存碎片,且由于內存管理算法的原因,malloc和free的執(zhí)行時間也是不確定。µC/OS-II中把連續(xù)的大塊內存按分區(qū)管理。每個分區(qū)中包含整數(shù)個大小相同的內存塊,但不同分區(qū)之間的內存塊大小可以不同。用戶需要動態(tài)分配內存時,系統(tǒng)選擇一個適當?shù)姆謪^(qū),按塊來分配內存。釋放內存時將該塊放回它以前所屬的分區(qū),這樣能有效解決碎片問題,同時執(zhí)行時間也是固定的。</p>

48、;<p>  2.1.9 任務管理</p><p>  µC/OS-II中最多可以支持64個任務,分別對應優(yōu)先級0~63,其中0為最高優(yōu)先級。63為最低級,系統(tǒng)保留了4個最高優(yōu)先級的任務和4個最低優(yōu)先級的任務,所有用戶可以使用的任務數(shù)有56個。µC/OS-II提供了任務管理的各種函數(shù)調用,包括創(chuàng)建任務,刪除任務,改變任務的優(yōu)先級,任務掛起和恢復等。系統(tǒng)初始化時會自動產生兩個任務:

49、一個是空閑任務,它的優(yōu)先級最低,該任務僅給一個整型變量做累加運算;另一個是統(tǒng)計任務,它的優(yōu)先級為次低,該任務負責統(tǒng)計當前CPU的利用率。 </p><p>  2.1.10 µC/OS-II任務間通信方式 </p><p><b> ?。?)信號量</b></p><p>  信號量由兩部分組成:一部分是16位的無符號整型信號量的計數(shù)

50、值;另一部分是由等待該信號量的任務組成的等待任務表。信號量用于對共享資源的訪問,用鑰匙符號,符號旁數(shù)字代表可用資源數(shù),對于二值信號量該值為1。信號量還可用于表示某事件的發(fā)生,用旗幟符號表示,符號旁數(shù)字代表事件已經發(fā)生的次數(shù)?;コ庑托盘柫坑糜谔幚砉蚕碣Y源。</p><p><b> ?。?)消息郵箱</b></p><p>  一種通信機制,可以使一個任務或者中斷服務子

51、程序向另一個任務發(fā)送一個指針型的變量,通常該指針指向一個包含了消息的特定數(shù)據結構。</p><p><b> ?。?)消息隊列</b></p><p>  另一種通信機制,允許一個任務或者中斷服務子程序向另一個任務發(fā)送以指針方式定義的變量或其它任務,因具體應用不同,每個指針指向的包含了消息的數(shù)據結構的變量類型也有所不同。</p><p>  2

52、.2 STM32上移植方法</p><p>  2.2.1 平臺需求</p><p>  µC/OS-II的正常運行需要處理器平臺滿足以下要求:</p><p> ?。?)處理器的C編譯器能產生可重入代碼。</p><p> ?。?)用C語言就可以打開和關閉中斷。</p><p> ?。?)處理器支持中斷,

53、并且能產生定時中斷(通常在10至100Hz之間)。 </p><p>  (4)處理器支持能夠容納一定量數(shù)據(可能是幾千字節(jié))的硬件堆棧。</p><p> ?。?)處理器有將堆棧指針和其它CPU寄存器讀出和存儲到堆?;騼却嬷械闹噶?。</p><p>  2.2.2 移植方法</p><p> ?。?)內核頭文件(OS_CPU.H) <

54、/p><p>  在OS_CP U.H 中,主要聲明了一些與微處理器相關的常量、宏和typedef。 </p><p>  定義與處理器無關的數(shù)據類型 </p><p>  typede f unsigned char BOOLEAN; </p><p>  typedef unsigned char INT8U;

55、</p><p>  typedef signed char NT8S; </p><p>  typedef unsigned short INT16U; </p><p>  typedef signed short INT16S; </p><p>  typedef uns

56、igned int INT32U; </p><p>  typedef signed int NT32S; </p><p>  typedef float FP32; </p><p>  typedef double FP64; </p>&

57、lt;p>  typedef unsigned int OS_STK; </p><p>  typedef unsigned int OS_CPU_SR; </p><p>  在STM32處理器及keil MDK 或者IAR 編譯環(huán)境中可以通過查手冊得知short類型是16位而int類型是32位,這對于Cortex-M3內核是一致的。故這

58、部分代碼無需修改。盡管µC/OS-II定義了float 類型和double 類型,但為了方便移植它們在µC/OS-II源代碼中并未使用。為了方便使用堆棧,µC/OS-II定義了一個堆棧數(shù)據類型。在Cortex-M3 中寄存器為32位,故定義堆棧的長度也為32位。Cortex-M3 狀態(tài)寄存器為32位,定義OS_CPU_SR主要是為了在進出臨界代碼段保存狀態(tài)寄存器。 </p><p>

59、<b> ?。?)臨界代碼段 </b></p><p>  µC/OS-II為了保證某段代碼的完整執(zhí)行,需要臨時的關閉中斷,在這</p><p>  段代碼執(zhí)行完成之后再打開中斷。這樣的代碼段稱作臨界代碼段。µC/OS-II通過定義兩個宏OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL() 來分別實現(xiàn)中斷的關閉和打開。一般

60、來說,采用方法3來實現(xiàn)這兩個宏。這兩個宏分別定義如下: </p><p>  #define OS_CRITICAL_METHOD 3 </p><p>  #define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();} </p><p>  #define OS_EXIT_CRITIC

61、AL() {OS_CPU_SR_Restore(cpu_sr);} </p><p>  函數(shù)OS_CPU_SR_Save()和OS_CPU_SR_Restore(cpu_sr)在OS_CPU_A.ASM中定義。同時得注意,在使用這兩個宏之前,必須定義OS_CPU_SR cpu_sr;否則編譯時將出錯。 </p><p> ?。?)棧的增長方向 </p>

62、<p>  盡管µC/OS-II支持兩種方向生長的棧,但對于以Cortex-M3為內核的STM32 微處理器來說,它支持向下增長的滿棧,故需要定義棧增長方向宏為1。即定義成如下形式 </p><p>  #define OS_STK_GROWTH 1 </p><p> ?。?)任務級任務切換 </p><p>  任務級任務切換

63、調用宏OS_TASK_SW()來實現(xiàn)。因為這個宏也是與處理器相關的,因此這個宏在OS_CPU_A.ASM中描述。 </p><p>  (5)其他函數(shù)聲明 </p><p>  在OS_ CPU.H中,還聲明了以下幾個函數(shù),這幾個函數(shù)均在OS_CPU_A.ASM中實現(xiàn)。 </p><p>  void OSCtxSw(void); </p><p

64、>  void OSIntCtxSw(void); </p><p>  void OSStartHighRdy(void); </p><p>  void OS_CPU_PendSVHandler(void); </p><p> ?。?)與處理器相關的匯編代碼(OS_CPU_A.ASM)</p><p>  在OS_CP U_A.

65、ASM中實現(xiàn)的是下面五個與處理器相關的函數(shù)。 </p><p>  OS_CPU_SR_Save(); </p><p>  OS_CPU_SR_Restore(); </p><p>  OSStartHighRdy(); </p><p>  OSCtxSw(); </p><p>  OSIntCt

66、xSw(); </p><p>  2.3.3 函數(shù)實現(xiàn) </p><p> ?。?)關中斷函數(shù)(OS_CPU_SR_Save()) </p><p>  即先保存當前的狀態(tài)寄存器然后關中斷。故關中斷實現(xiàn)代碼如下 </p><p>  OS_CPU_SR_Save </p><p>  MRS R0, P

67、RIMASK; </p><p><b>  CPSID I </b></p><p>  BX LR </p><p>  這也是宏OS_ENTER_CRITICAL() 的最終實現(xiàn)。 </p><p> ?。?)恢復中斷函數(shù)(OS_CPU_SR_Restore()) </p><p&g

68、t;  這是宏OS_EXIT_CRITICAL()的最終實現(xiàn)。也就是將狀態(tài)寄存器的內容從R0中恢復,然后跳轉回去。此函數(shù)完成的將中斷狀態(tài)恢復到關中斷前的狀態(tài)。其代碼如下: </p><p>  OS_CPU_SR_Restore </p><p>  MSR PRIMASK, R0 </p><p>  BX LR </p&

69、gt;<p>  Cortex-M3處理器有單獨的指令來打開或者關閉中斷,所以這兩個函數(shù)實現(xiàn)起來很簡單。 </p><p> ?。?)啟動最高優(yōu)先級任務運行(OSStartHighRdy()) </p><p>  OSStart()調用OSStartHighRdy()來啟動最高優(yōu)先級任務的運行,從而啟動整個系統(tǒng)。OSStartHighRdy()主要完成以下幾項工作: <

70、;/p><p>  為任務切換設置PendSV的優(yōu)先級;</p><p>  為第一次任務切換設置棧指針為0;</p><p>  設置OSRunning = TRUE,以表明系統(tǒng)正在運行;</p><p> ?、?觸發(fā)一次PendSV,打開中斷等待第一次任務的切換。 </p><p> ?。?)任務級和中斷級任務切換 &

71、lt;/p><p>  因為Cortex-M3進入異常自動保存寄存器R3-R0,R12,LR,PC和xPSR這種的特殊機制,這兩個函數(shù)都是觸發(fā)一次PendSV來實現(xiàn)任務的切換。首先是微處理器自動保存上面提到的寄存器,然后把當前的堆棧指針保存到任務的棧中,將要切換的任務的優(yōu)先級和任務控制塊的指針賦值給運行時的最高優(yōu)先級指針和運行時的任務控制塊指針,最后再把要運行的任務的堆棧指針賦值給微處理器的堆棧指針,這樣就可以退出中

72、斷服務程序了。中斷服務程序退出的時候將自動出棧R3-R0,R12,LR,PC和xPSR。具體的PendSV服務程序的偽代碼如下: </p><p>  OS_CPU_PendSVHandler : </p><p>  // 進入異常,處理器自動保存R3-R0,R12,LR,PC和xPSR </p><p>  if (PSP != NULL)

73、 //判斷不是開始第一次任務 </p><p><b>  { </b></p><p>  保存R4-R11到任務的堆棧; </p><p>  OSTCBCur->OSTCBStkPtr = SP; //保存堆棧的指針到任務控制塊 </p><p><b>  } </b></p&

74、gt;<p>  OSTaskSwHook(); //實現(xiàn)用戶擴展功能而定義的鉤子 </p><p>  OSPrioCur = OSPrioHighRdy; //設置運行任務為最高優(yōu)先級就緒任務 </p><p>  OSTCBCur = OSTCBHighRdy; // 設置運行的任務控制塊為最高 </p><p>  //就緒任控

75、制塊務 </p><p>  PSP = OSTCBHighRdy->OSTCBStkPtr;//將要切換的任務堆棧指 </p><p>  // 針賦給微處理器的堆棧指 </p><p>  // 針從而實現(xiàn)切換 </p><p>  從堆棧中恢復 R4-R11; 從異常中返回

76、; </p><p>  // 退出異常,處理器自動恢復R3-R0,R12,LR,PC和xPSR </p><p>  這樣很容易寫出PendSV中斷服務程序的代碼了。 </p><p> ?。?)與CPU 相關的C 函數(shù)和鉤子函數(shù)(OS_CPU_C.C ) </p><p>  這個文件中包含10個函數(shù),

77、具體如下: </p><p>  OSInitHookBegin (); </p><p>  OSInitHookEnd (); </p><p>  OSTaskCreateHook (); </p><p>  OSTaskDelHook (); </p><p>  OSTaskIdleHoo

78、k (); </p><p>  OSTaskStatHook (); </p><p>  OSTaskStkInit (); </p><p>  OSTaskSwHook (); </p><p>  OSTCBInitHook (); </p><p>  OSTimeTickHook

79、(); </p><p>  這10個函數(shù)有9個是為了擴展用戶功能而定義的鉤子函數(shù),這些鉤子函數(shù)可以都為空函數(shù),也可以加上一些用戶需要的擴展功能。另外一個不是鉤子函數(shù),它是OSTaskStkInit()。這個函數(shù)的功能是當一個任務被創(chuàng)建時,它完成這個任務堆棧的初始化。這個函數(shù)首先將用戶為任務分配的堆棧頂?shù)刂焚x值給一個棧指針變量,然后再通過這個棧指針向任務的??臻g寫入初值。這個初值無關緊要,為0就可以了。這個函

80、數(shù)的代碼時下如下: </p><p>  OS_STK *OSTaskStkInit (void (*task)(void *pd), void *p_arg, </p><p>  OS_STK *ptos, INT16U opt) </p><p>  { </p><p>  OS_STK

81、 *stk; </p><p>  (void)opt; //防止編譯器報錯 </p><p>  stk = ptos; // 將棧頂?shù)刂焚x值給棧指針變量 </p><p>  // 以進入異常的順序來給棧賦初值 </p><p>  *(stk) = (INT32U)

82、0x00000000L; //xPSR </p><p>  *(--stk) = (INT32U)task; //Entry Point </p><p>  *(--stk) = (INT32U)0x00000000L; // R14 (LR) </p><p>  *(--stk) = (IN

83、T32U)0x00000000L; //R12 </p><p>  *(--stk) = (INT32U)0x00000000L; //R3 </p><p>  *(--stk) = (INT32U)0x00000000L; // R2 </p><p>  *(--stk) = (INT32U)0x000

84、00000L; // R1 </p><p>  *(--stk) = (INT32U)p_arg; //R0 : 傳遞的參數(shù) </p><p>  // 剩下的寄存器初始化 </p><p>  *(--stk) = (INT32U)0x00000000L; // R11 </p>

85、<p>  *(--stk) = (INT32U)0x00000000L; //R10 </p><p>  *(--stk) = (INT32U)0x00000000L; // R9 </p><p>  *(--stk) = (INT32U)0x00000000L; //R8 </p><

86、p>  *(--stk) = (INT32U)0x00000000L; //R7 </p><p>  *(--stk) = (INT32U)0x00000000L; // R6 </p><p>  *(--stk) = (INT32U)0x00000000L; // R5 </p><p>  *(--st

87、k) = (INT32U)0x00000000L; // R4 </p><p>  return (stk); </p><p>  } </p><p>  其他的鉤子函數(shù)都為空函數(shù)。這樣,整個移植的代碼就介紹完了。整個移植的過程非常容易。剩下的工作就是編寫用戶任務,并在開發(fā)板上驗證,以此來驗

88、證該移植方案是可行的和成功的。</p><p>  3 LCD屏程序設計及調試</p><p><b>  3.1 工具概述</b></p><p>  RVMDK源自德國的KEIL公司,是RealView MDK的簡稱。RealView MDK集成了業(yè)內最領先的技術,支持ARM7、ARM9和Cortex-M3核處理器,自動配置啟動代碼,集成

89、Flash燒寫模塊,強大的Simulation設備模塊,性能分析等功能。</p><p>  3.1.1 keil4工程建立以及仿真方法</p><p><b> ?。?)新建工程。</b></p><p>  打開MDK軟件,選擇Project→New uVision Project菜單項,新建一個文件夾名為“畢業(yè)設計”,保存,則彈出器件選擇

90、對話框,這里選擇STM32F103RB。單擊“OK”按鈕,則彈出一個對話框加載啟動文件到工程中。</p><p>  打開“畢業(yè)設計”文件夾,在里面添加子文件夾</p><p> ?。?)添加系統(tǒng)文件與工程管理。</p><p>  回到“畢業(yè)設計”文件夾中,把系統(tǒng)SYSTEM文件夾(delay,sys,usart文件夾)復制過來,再建立main和hardware文

91、件夾用于主函數(shù)和各外設資源函數(shù)?;氐焦こ讨?,點擊manage components,添加工程中的文件,進行分類管理工程。</p><p> ?。?)最后新建 main文件,在編輯區(qū)寫代碼。</p><p>  3.1.2 硬件平臺紹</p><p>  ALIENTEK MiniSTM32選擇的是STM32F103RBT6 作為MCU,STM32F103的

92、型號眾多,作為一款低端開發(fā)板,選擇 STM32F103RBT6是最佳的選擇。128K FLASH、20K SRAM、2個SPI、3個串口、1個USB 、1個CAN、2個12位的ADC、RTC、51個可用IO腳···,這樣的配置無論放到那里都是很不錯的了,更重要的是其價格,18元左右的零售價,相對其他芯片配置及價格,所以我們選擇了它作為我們的主芯片。</p><p>  BOOT1用于

93、設置STM32的啟動方式,其對應啟動模式如表3.1所示:</p><p>  表3.1 BOOT0、BOOT1啟動模式表</p><p>  按照表3.1,一般情況下如果我們想用用串口下載代碼,則必須配置BOOT0為1,BOOT1為0,而如果想讓STM32一按復位鍵就開始跑代碼,則需要配置BOOT0為0,BOOT1隨便設置都可以。ALIENTEK這款開發(fā)板專門設計了一鍵下載電路,通過串口的

94、 DTR和RTS信號,來自動配置BOOT0和 BOOT1,因此不需要用戶來手動切換他們的狀態(tài),直接串口下載和軟件自動控制,可以非常方便的下載代碼。 </p><p>  P3和P1分別用于 PORTA和PORTB的IO口引出,其中P2還有部分用于 PORTC口的引出。PORTA和PORTB都是按順序排列的,這樣設計的目的是為了讓大家更方便地與外部設備連接。P2連接了DS18B20的數(shù)據口以及紅外傳感器的數(shù)據線,它

95、們分別對應著 PA0和PA1,只需要19通過跳線帽將P2和P3連接起來就可以使用了。這里不直接連在一起的原因有二:1,防止紅外傳感器和DS18B20 對這兩個IO口作為其他功能使用的時候的影響;2,DS18B20 和紅外傳感器還可以用來給其他板子提供輸入,等于我們的板子為別的板子提供了紅外接口和溫度傳感器,在調試的時候,還是蠻有用的。P4口連接了PL2303的串口輸出,對應著 STM32的串口1(PA9/PA10),在使用的時候,也是通

96、過跳線帽將這兩處連接起來。這樣設計有2個好處:1,使得 PA9和PA10用作其他用途。</p><p>  使用的時候,不受到PL2303的影響。2,USB 轉串口可以用作他用,并不僅限在這個板上的STM32使用,也可以連接到其他板子上,這樣ALIENEK MiniSTM32 就相當于一個USB 串口。P5口是另外一個IO引出排陣,將PORTC和PORTD等的剩余IO口從這里引出。 </p><

97、;p>  在此部分原理圖中,我們還可以看到STM32F103RBT6 的各個IO口與外設的連接關系,這些將在后面給大家介紹。 這里STM32的VBAT 采用CR1220 紐扣電池和VCC3.3混合供電的方式,在有外部電源(VCC3.3)的時候,CR1220不給VBAT供電,而在外部電源斷開的時候,則由CR1220給VBAT供電。這樣,VBAT總是有電的,以保證RTC的走時以及后備寄存器的內容不丟失。</p><

98、p><b>  3.2 硬件結構</b></p><p>  3.2.1 STM32最小系統(tǒng)</p><p>  STM32F103最小系統(tǒng)包括電源電路,復位電路,時鐘電路,主芯片和下載接口。STM32F103使用3.3V供電,且引腳接有濾波電容,保證芯片工作穩(wěn)定;復位電路使用的低電平復位,該電路上電可以復位,按鍵按下時也可以復位;時鐘電路使用8MHZ晶振,和2

99、2pF電容助振。</p><p><b>  圖3.1 最小系統(tǒng)</b></p><p>  3.2.2 LCD接口</p><p>  顯示電路使用的是2.4寸的TFT液晶顯示器,該顯示器有16位的數(shù)據口和5位的控制端口。</p><p><b>  圖3.2 液晶顯示</b></p>

100、<p>  3.2.3 LED接口</p><p>  輸入單元和指示部分,直接引到STM32F103的IO口。</p><p>  圖3.3 按鍵和LED燈</p><p>  3.2.4 紅處接收電路</p><p>  HS0038用于顯度的采集,其通信是單總線式,直接與STM32F103相連。</p>&l

101、t;p>  圖3.4 紅處接收單元</p><p><b>  3.3 C程序設計</b></p><p>  在µC/OS-II里面創(chuàng)建6個任務:開始任務、LED0、LED1、觸摸屏,KEY按鍵任務和LCD顯示任務,開始任務用于創(chuàng)建其他(LED0、LED1、紅處接收、按鍵和LCD顯示)任務,之后掛起;LED0任務用于控制DS0的亮滅,DS0每秒鐘亮8

102、00ms;LED1任務用于控制DS1的亮滅,DS1亮300ms,滅300ms,依次循環(huán);觸摸屏任務用于手寫輸入,并立即顯示;LCD顯示任務用于顯示圖形,和接收紅外信號信息顯示出來;KEY按鍵任務分別使屏進入校準功能,以及顯示歡迎界面。 </p><p>  首先,建立基本的工程后,在該工程源碼下面加入µC/OS-II文件夾,存放µC/OS-II源碼(我們已經將µC/OS-II源碼分為

103、三個文件夾:CORE、PORT和CONFIG)。打開工程,新建µC/OS-II-CORE、µC/OS-II -PORT和µC/OS-II -CONFIG三個分組,分別添加µC/OS-II三個文件夾下的源碼,并將這三個文件夾加入頭文件包含路徑。</p><p>  µC/OS-II-CORE分組下面是µC/OS-II的核心源碼,我們不需要做任何變動。 &l

104、t;/p><p>  µC/OS-II-PORT分組下面是我們移植µC/OS-II要修改的3個代碼,這個在移植的時候完成。 </p><p>  µC/OS-II-CONFIG分組下面是µC/OS-II的配置部分,主要由用戶根據自己的需要對µC/OS-II進行裁剪或其他設置。工程框架如下圖3.5:</p><p>  其

105、次,對os_cfg.h里面定義OS_TICKS_PER_SEC的值為200,也就是設置µC/OS-II的時鐘節(jié)拍為5ms,同時設置OS_MAX_TASKS為10,也就是最多10個任務(包括空閑任務和統(tǒng)計任務在內)。</p><p>  再次,在main.c文件中設置任務堆棧大小、設置任務優(yōu)先級、任務堆棧,創(chuàng)建5個任務。如圖3.5所示:</p><p><b>  圖3.

106、5 任務結構</b></p><p><b>  3.4 調試</b></p><p>  3.4.1 設置編譯環(huán)境</p><p> ?。?)打開project菜單,選擇Options for Target“畢業(yè)設計”對話框,如圖3.6在target中,將晶振選為8MHz;在output中,將Creat HEX File復選框選中

107、。為調試方便,將產生調試中間信息的復選框也選中。</p><p>  圖3.6 編譯環(huán)境窗口</p><p> ?。?)在C/C++中,將各分文件的路徑加入如圖3.7</p><p><b>  圖3.7 路徑添加</b></p><p> ?。?)在Debug中,將Use選中并設置為Cortex-M/R J-LINK/

108、J-Trace,設為JINK連接實物仿真了。</p><p> ?。?)在Utilities中,設置如圖3.8,并打開Settings,設置FLASH為256KB。</p><p>  圖3.8 Utilities</p><p>  3.4.2 調試結果</p><p>  編譯程序,排出error和warning,如圖3.9得到正確的程序

109、,下載程序到開發(fā)板上,得到了預期結果</p><p><b>  圖3.9 編譯結果</b></p><p>  將程序下載到開發(fā)板上,并觀察現(xiàn)象,LED小燈按程序要求正常運行,紅外接收器正確顯示數(shù)值,按鍵KEY0可實現(xiàn)進入校準功能,KEY1可以顯示歡迎界面,KEY2可以清除,說明程序正確?,F(xiàn)象如圖3.10</p><p>  圖3.10 實物

110、現(xiàn)象</p><p><b>  結 語</b></p><p>  本文完成基于32位ARMv7微處理器Cortex-M3和嵌入式實時操作系統(tǒng)µC/OS-II的嵌入式操作系統(tǒng)的移植和功能的實現(xiàn)。經過幾個月的深入學習,了解了嵌入式操作系統(tǒng)µC/OS-II的性能、特點、結構和基本運行原理,以及通過實驗調試的方法完成對µC/OS-II時

111、間管理函數(shù),任務管理函數(shù)的靈活應用。認真掌握Cortex-M3的硬件結構和指令系統(tǒng),并在ALIENTEK MiniSTM32開發(fā)板上調試串口,TFT彩屏以及ADC實驗。本文將嵌入式實時操作系統(tǒng)µC/OS-II移植到Cortex微處理器上,并對其進行系統(tǒng)測試和系統(tǒng)功能實現(xiàn),實現(xiàn)了一個基本完整的嵌入式實時操作系統(tǒng)。該系統(tǒng)一方面實現(xiàn)了單個IO口和多人IO口的組合輸入輸出控制,采用模塊化設計思想,具有代表性。另一方面,它又是一個相對完

112、整的系統(tǒng),可以應用于工業(yè)控制的各個顯示終端,完成指示功能。由于實時操作系統(tǒng)內核µC/OS-II是為嵌入式應用編寫的通用軟件,所以不得不強調處理器的通用性和功能的全面性。在實際應用中可以根據需要裁減和優(yōu)化。其次,本文所調度的任務較簡單,主要是為了說明方法。</p><p>  在程序調試過程中,由于對STM32RTB6內核學習還不是很透徹,出現(xiàn)了警告,一直困擾。任務中加入更多任務時老出錯,程序不能正常運行

113、,但通不斷學習,查閱資料得以解決。</p><p>  本人認真進行了課題的研究并完成了本論文,由于作者水平有限,論文中可能仍有錯誤和不足之處,敬請大家批評指正。</p><p>  最后,感謝指導老師的關懷和細心的指導,感謝同學們的幫助。謝謝你們的支持!</p><p><b>  主要參考文獻</b></p><p>

溫馨提示

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

評論

0/150

提交評論