版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 本科畢業(yè)論文(設(shè)計(jì))</p><p> 論文題目:基于STM32的嵌入式操作系統(tǒng)程序設(shè)計(jì)及實(shí)現(xiàn) </p><p> 姓 名:</p><p> 學(xué) 號(hào):</p><p> 班 級(jí):</p><p> 年 級(jí):2009級(jí)</p><p> 專
2、業(yè):電子信息工程</p><p> 學(xué) 院:信息工程學(xué)院</p><p> 指導(dǎo)教師:</p><p> 完成時(shí)間:2013年5月20日</p><p> 基于STM32的嵌入式操作系統(tǒng)</p><p><b> 程序設(shè)計(jì)及實(shí)現(xiàn)</b></p><p> The
3、 Design and Implementation of embedded operating system program based on STM32</p><p><b> 摘 要</b></p><p> 隨著科學(xué)技術(shù)不斷的進(jìn)步,工業(yè)生產(chǎn)越來(lái)越先進(jìn)復(fù)雜,操作系統(tǒng)µC/OS-II是高效、穩(wěn)定、可靠、節(jié)能的系統(tǒng),廣泛應(yīng)用安防,消費(fèi)電子中。而
4、基于Cortex-M3架構(gòu)下的STM32是一款性價(jià)比優(yōu)越新型微處理器,將µC/OS-II移植到STM32上能夠發(fā)揮其高效的性能,從而投入社會(huì)生產(chǎn),制造出很多有用又實(shí)惠的電子產(chǎn)品,為我們的生活帶來(lái)便利。</p><p> 本文主要的研究?jī)?nèi)容是µC/OS-II操作系統(tǒng)理論分析、移植方法、應(yīng)用程序設(shè)計(jì)及調(diào)試仿真實(shí)現(xiàn)。首先,對(duì)µC/OS-II的理論分析,研究其實(shí)際應(yīng)用及系統(tǒng)結(jié)構(gòu);其次,分析
5、STM32硬件平臺(tái)及µC/OS-II的移植需求;最后,在µC/OS-II上開(kāi)發(fā)LCD,LED,按鍵KEY等應(yīng)用程序,并對(duì)多任務(wù)系統(tǒng)調(diào)試分析。主要研究結(jié)論如下:</p><p> ?。?)µC/OS-II操作系統(tǒng)主要分為任務(wù)管理、內(nèi)存管理和時(shí)間管理三大部分,其間通信是通過(guò)消息隊(duì)列和消郵箱。</p><p> (2)µC/OS-II移植主要在OS_CP
6、U.H,OS_CPU_C.C,OS_CPU_A.ASM三個(gè)文件中,涉及到數(shù)據(jù)類型、堆棧、中斷定義和任務(wù)切換等。</p><p> ?。?)應(yīng)用程序設(shè)計(jì)優(yōu)先級(jí)分配要合理,硬件平臺(tái)初始化模塊化處理。</p><p> 關(guān)鍵詞:嵌入式系統(tǒng);µC/OS-II;移植</p><p><b> Abstract</b></p>
7、<p> With 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 t
8、he security, 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, t
9、hus in social 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, app
10、lication design 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 a
11、nd the demand µ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/O
12、S-II operating 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 transplantatio
13、n mainly in OS_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, ini
14、tialize the modular processing hardware platform. </p><p> Key words: embedded system; µC/OS-II; transplant</p><p><b> 目 錄</b></p><p><b> 1 概 述1<
15、/b></p><p> 1.1 研究的目的及意義1</p><p> 1.2 國(guó)內(nèi)外研究狀況綜述1</p><p> 1.3 研究的主要內(nèi)容2</p><p> 2 µC/OS-II的理論介紹3</p><p> 2.1 µC/OS-II各模塊的基本功能3</p&
16、gt;<p> 2.2 STM32上移植方法7</p><p> 3 LCD屏程序設(shè)計(jì)及調(diào)試12</p><p> 3.1 工具概述12</p><p> 3.2 硬件結(jié)構(gòu)13</p><p> 3.3 C程序設(shè)計(jì)15</p><p><b> 3.4 調(diào)試16<
17、/b></p><p><b> 結(jié) 語(yǔ)18</b></p><p><b> 主要參考文獻(xiàn)19</b></p><p><b> 附 錄20</b></p><p> 附錄1 主程序代碼20</p><p><b>
18、 1 概 述</b></p><p> 1.1 研究的目的及意義</p><p> µC/OS-II是由美國(guó)工程師Jean Labrosse編寫的嵌入式多任務(wù)的實(shí)時(shí)操作系統(tǒng),包括實(shí)時(shí)內(nèi)核、任務(wù)管理、時(shí)鐘管理、任務(wù)間通信同步(信號(hào)量、郵箱、消息隊(duì)列)和內(nèi)存管理。除了有上面的優(yōu)點(diǎn)外,µC/OS-II它具有別的操作系統(tǒng)沒(méi)有的優(yōu)點(diǎn),具體如下:</p&
19、gt;<p> (1)源代碼開(kāi)放:µC/OS-II的源代碼可以免費(fèi)獲取,且標(biāo)有清晰的注釋,可讀性好。</p><p> ?。?)可移植性好:µC/OS-II的源代碼90%以上是用C語(yǔ)言編寫的,可以很容易地把它移植到各類8位、16位和32位處理器上。</p><p> ?。?)穩(wěn)定性高:µC/OS-II已得到FAA的標(biāo)準(zhǔn)認(rèn)證,且目前已有上百個(gè)商業(yè)
20、應(yīng)用實(shí)例,其穩(wěn)定性和可靠性是經(jīng)過(guò)實(shí)踐驗(yàn)證的。</p><p> 因此,µC/OS-II廣泛的應(yīng)用于控制系統(tǒng)中,如在衍射儀高壓控制系統(tǒng)中使用µC/OS-II操作系統(tǒng)是一種很好的選擇??刂葡到y(tǒng)是一個(gè)復(fù)雜的系統(tǒng),它需要多個(gè)系統(tǒng)協(xié)同工作。傳統(tǒng)的系統(tǒng)開(kāi)發(fā)我們往往使用前后臺(tái)的方式,但是這種開(kāi)發(fā)方式在任務(wù)較簡(jiǎn)單的開(kāi)發(fā)中比較適用,對(duì)于任務(wù)比較復(fù)雜的系統(tǒng)往往力不從心。對(duì)于任務(wù)較多而且復(fù)雜的情況我們就要引入實(shí)時(shí)
21、操作系統(tǒng)RTOS。</p><p> RTOS體現(xiàn)了一種新的應(yīng)用程序設(shè)計(jì)思想和開(kāi)放的框架,用戶在編寫程序時(shí),可以分別編寫各個(gè)任務(wù),不必同時(shí)將所有任務(wù)運(yùn)行的各種可能情況記在心中,大大減小了程序編寫的工作量,而且減小了出錯(cuò)的可能,保證最終程序具有高可靠性,從而降低程序的復(fù)雜度和開(kāi)發(fā)周期。由于控制系統(tǒng)功能較復(fù)雜,諸多的功能可以劃分成許多不同的模塊,模塊之間既彼此聯(lián)系又相對(duì)獨(dú)立,可以當(dāng)作不同的任務(wù)來(lái)進(jìn)行處理。所以,使用
22、實(shí)時(shí)操作系統(tǒng),將不同的功能劃分成不同的任務(wù)進(jìn)行處理使得設(shè)計(jì)大大簡(jiǎn)化。</p><p> 1.2 國(guó)內(nèi)外研究狀況綜述</p><p> 嵌入式系統(tǒng)是繼IT網(wǎng)絡(luò)技術(shù)之后,又一個(gè)新的技術(shù)發(fā)展方向。中國(guó)單片機(jī)二十年論壇總結(jié)出,我國(guó)嵌入式起步較早,但總體來(lái)說(shuō)發(fā)展緩慢,和國(guó)外的開(kāi)發(fā)應(yīng)用具有很大的差距,造成這一局面的原因是多方面的。在國(guó)內(nèi)嵌入式系統(tǒng)開(kāi)發(fā)方面,多是一些低層次的應(yīng)用,停留在以前老的技術(shù)基
23、礎(chǔ)之上。例如,經(jīng)典51系列單片機(jī)在上世紀(jì)我國(guó)的工業(yè)信息化改造過(guò)程中發(fā)揮了重要的作用,滲透到生產(chǎn)生活的各個(gè)方面。與此同時(shí)在大學(xué)電類相關(guān)的工科單片機(jī)教學(xué)中,依然是經(jīng)典的51,微機(jī)原理依然是8086/88,這顯然體現(xiàn)不了最新的技術(shù)特征,造成了大學(xué)教育與實(shí)際社會(huì)需要的脫節(jié)。國(guó)外的大部分高校和國(guó)內(nèi)的極少數(shù)大學(xué)相繼開(kāi)設(shè)嵌入式微處理器設(shè)計(jì)等相關(guān)的前沿性的課程,可見(jiàn)基于STM32技術(shù)將是未來(lái)微控制開(kāi)發(fā)的主流方向。由于µC/OS-II系統(tǒng)具有體
24、積小、性能強(qiáng)、功耗低、可靠性高以及面向行業(yè)應(yīng)用的突出特征,目前已經(jīng)被廣泛的應(yīng)用于軍事國(guó)防、消費(fèi)電子、網(wǎng)絡(luò)通信、工業(yè)控制等各個(gè)領(lǐng)域。</p><p> 今天嵌入式系統(tǒng)帶來(lái)的工業(yè)年產(chǎn)值已超過(guò)了1萬(wàn)億美元,1997年來(lái)自美國(guó)嵌入式系統(tǒng)大會(huì)(Embedded System Conference)的報(bào)告指出,未來(lái)5年僅基于嵌入式計(jì)算機(jī)系統(tǒng)的全數(shù)字電視產(chǎn)品,就將在美國(guó)產(chǎn)生一個(gè)每年1500億美元的新市場(chǎng)。美國(guó)汽車大王福特公司
25、的高級(jí)經(jīng)理也曾宣稱,“福特出售的‘計(jì)算能力’已超過(guò)了IBM”,由此可以想見(jiàn)嵌入式計(jì)算機(jī)工業(yè)的規(guī)模和廣度。1998年11月在美國(guó)加州舉行的嵌入式系統(tǒng)大會(huì)上,基于RTOS的Embedded Internet成為一個(gè)技術(shù)新熱點(diǎn)。在國(guó)內(nèi),“維納斯計(jì)劃”和“女媧計(jì)劃”一度鬧得沸沸揚(yáng)揚(yáng),機(jī)頂盒、信息加電這兩年更成了IT熱點(diǎn),而實(shí)際上這些都是嵌入式系統(tǒng)在特定環(huán)境下的一個(gè)特定應(yīng)用。據(jù)調(diào)查,目前國(guó)際上已有兩百多種嵌入式操作系統(tǒng),而各種各樣的開(kāi)發(fā)工具、應(yīng)用
26、于嵌入式開(kāi)發(fā)的儀器設(shè)備更是不可勝數(shù)。在國(guó)內(nèi),雖然嵌入式應(yīng)用、開(kāi)發(fā)很廣,但該領(lǐng)域卻幾乎還是空白,只有三兩家公司和極少數(shù)人員在從事這方面工作。由此可見(jiàn),嵌入式系統(tǒng)技術(shù)發(fā)展的空間真是無(wú)比廣大。</p><p> 1.3 研究的主要內(nèi)容</p><p> 本文是在基于32位的ARM微處理器STM32和嵌入式實(shí)時(shí)操作系統(tǒng)µC/OS-II上進(jìn)行嵌入式操作系統(tǒng)的移植和功能實(shí)現(xiàn)。通過(guò)將嵌入式
27、實(shí)時(shí)操作系統(tǒng)µC/OS-II移植到STM32微處理器上,并對(duì)其進(jìn)行軟件功能的擴(kuò)展和硬件擴(kuò)展,實(shí)現(xiàn)了一個(gè)基本完整的嵌入式實(shí)時(shí)操作系統(tǒng)。建立了基于嵌入式ARM處理器的應(yīng)用軟件體系;將µC/OS-II移植到STM32,建立了嵌入式操作系統(tǒng)研究及µC/OS-II下的開(kāi)發(fā)環(huán)境體系。包括µC/OS-II系統(tǒng)配置、µC/OS-II下的移植、啟動(dòng)、測(cè)試和功能實(shí)現(xiàn)等。完成了基于STM32的µC/
28、OS-II的應(yīng)用設(shè)計(jì)。</p><p> 本文主要分為4章,章節(jié)安排如下: </p><p> ?。?)緒論。主要介紹了開(kāi)題的背景和研究意義,以及µC/OS-II的國(guó)內(nèi)外研究現(xiàn)狀。</p><p> ?。?)
29、81;C/OS-II的理論介紹。主要介紹µC/OS-II各模塊的基本功能和在STM32上移植方法。</p><p> ?。?)硬件平臺(tái)介紹及LCD屏程序設(shè)計(jì)及調(diào)試。多任務(wù)的建立并實(shí)現(xiàn)基本功能。</p><p> ?。?)結(jié)語(yǔ)。主要介紹本論文中的優(yōu)點(diǎn)和不足之處。</p><p> 2 µC/OS-II的理論介紹</p><p
30、> 2.1 µC/OS-II各模塊的基本功能</p><p> 2.1.1 µC/OS-II內(nèi)核結(jié)構(gòu)</p><p> (1)µC/OS-II是以源代碼形式提供的實(shí)時(shí)操作系統(tǒng)內(nèi)核,其包含的文件結(jié)構(gòu)如圖2.1所示:</p><p> 基于µC/OS-II操作系統(tǒng)進(jìn)行應(yīng)用時(shí),設(shè)計(jì)時(shí)的主要任務(wù)是將系統(tǒng)合理劃分成多個(gè)任
31、務(wù),并由RTOS進(jìn)行調(diào)度,任務(wù)之間使用µC/OS-II提供的系統(tǒng)服務(wù)進(jìn)行通信,以配合實(shí)現(xiàn)應(yīng)用系統(tǒng)的功能。與前后臺(tái)系統(tǒng)一樣,基于µC/OS-II的多任務(wù)系統(tǒng)也有一個(gè)main主函數(shù),main函數(shù)由編譯器所帶的C啟動(dòng)程序調(diào)用。在main主函數(shù)中主要實(shí)現(xiàn)µC/OS-II的初始化OSInit()、任務(wù)創(chuàng)建、一些任務(wù)通信方法的創(chuàng)建、µC/OS-II的多任務(wù)啟動(dòng)OSStart()等常規(guī)操作。另外,還有一些應(yīng)用程
32、序相關(guān)的初始化操作,例如:硬件初始化、數(shù)據(jù)結(jié)構(gòu)初始化等。 </p><p> ?。?)OSInit()初始化µC/OS-II所有的變量和數(shù)據(jù)結(jié)構(gòu),并建立空閑任務(wù)OS_TaskIdle(),這個(gè)任務(wù)總是處于就緒態(tài)。</p><p> 2.1.2 µC/OS-II內(nèi)核體系結(jié)構(gòu)圖</p><p> µC/OS-II內(nèi)核主要對(duì)用戶任務(wù)進(jìn)
33、行調(diào)度和管理,并為任務(wù)間共享資源提供服務(wù)。包含的模塊有任務(wù)管理、任務(wù)調(diào)度、任務(wù)間通信、時(shí)間管理、內(nèi)核初始化等。µC/OS-II內(nèi)核體系結(jié)構(gòu)如圖2.2所示:</p><p> 圖2.2 內(nèi)核結(jié)構(gòu)圖</p><p> 2.1.3 任務(wù)狀態(tài)及其轉(zhuǎn)換關(guān)系</p><p> 在多任務(wù)系統(tǒng)中,任務(wù)是設(shè)計(jì)者實(shí)現(xiàn)應(yīng)用系統(tǒng)的基本形式,也是µC/OS-II系統(tǒng)
34、進(jìn)行調(diào)度的基本單元。任務(wù)可以是一個(gè)無(wú)限的循環(huán),也可以在一次執(zhí)行后被操作系統(tǒng)刪除。任務(wù)函數(shù)和任何C函數(shù)一樣,具有一個(gè)返回類型和一個(gè)參數(shù),但是它決不返回。</p><p> 任務(wù)控制塊(TCB)是一個(gè)數(shù)據(jù)結(jié)構(gòu)OS_TCB,一旦一個(gè)任務(wù)創(chuàng)建,就有一個(gè)和它關(guān)聯(lián)的TCB被賦值。當(dāng)任務(wù)的CPU使用權(quán)被剝奪時(shí),它用來(lái)保存該任務(wù)的狀態(tài)。這樣,當(dāng)任務(wù)重新獲得CPU使用權(quán)時(shí),可以從TCB中獲取任務(wù)切換前的信息,準(zhǔn)確的繼續(xù)運(yùn)行。&l
35、t;/p><p> 2.1.4 任務(wù)調(diào)度器 </p><p> µC/OS-II總是運(yùn)行進(jìn)入就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)。任務(wù)調(diào)度器的功能是:在就緒表中查找最高優(yōu)先級(jí)的任務(wù),然后進(jìn)行必要的任務(wù)切換,運(yùn)行該任務(wù)。µC/OS-II的任務(wù)調(diào)度有兩種情況:任務(wù)級(jí)的任務(wù)調(diào)度由OS_Sched()完成;中斷級(jí)的任務(wù)調(diào)度由OSIntExt()完成。這兩種任務(wù)調(diào)度情況調(diào)用的任務(wù)切換函數(shù)不同
36、:任務(wù)級(jí)的任務(wù)調(diào)度OS_Sched()調(diào)用了任務(wù)切換函數(shù) OS_TASK_SW(),而中斷級(jí)的調(diào)度OSIntExt()調(diào)用了任務(wù)切換函數(shù)OSIntCtxSw()。</p><p> 任務(wù)級(jí)的任務(wù)調(diào)度是由于有更高優(yōu)先級(jí)的任務(wù)進(jìn)入就緒態(tài),當(dāng)前的任務(wù)的CPU使用權(quán)被剝奪,發(fā)生了任務(wù)到任務(wù)的切換;中斷級(jí)的調(diào)度是指當(dāng)前運(yùn)行的任務(wù)被中斷打斷,由于ISR運(yùn)行過(guò)程中有更高優(yōu)先級(jí)的任務(wù)被激活進(jìn)入就緒態(tài)。而中斷返回前ISR調(diào)用OS
37、IntExt()函數(shù),該函數(shù)查找就緒表發(fā)現(xiàn)有必要進(jìn)行任務(wù)切換,從而被中斷的任務(wù)進(jìn)入等待狀態(tài),運(yùn)行被激活的高優(yōu)先級(jí)的任務(wù)。</p><p><b> ?。?)任務(wù)切換</b></p><p> 任務(wù)切換有兩種:OS_TASK_SW()和OSIntCtxSw()。任務(wù)級(jí)的任務(wù)切換OS_TASK_SW()是宏調(diào)用,通過(guò)軟中斷指令來(lái)實(shí)現(xiàn)CPU寄存器內(nèi)容切換。例如:#defi
38、ne OS_TASK_SW() asm(“int #32”)。</p><p> 任務(wù)級(jí)的任務(wù)切換過(guò)程:①保存當(dāng)前運(yùn)行的任務(wù)的CPU寄存器值到該任務(wù)的堆棧。如:堆棧指針,程序計(jì)數(shù)器,狀態(tài)寄存器等。②將要運(yùn)行的高優(yōu)先級(jí)的任務(wù)的寄存器值從堆棧恢復(fù)到CPU寄存器。③進(jìn)行TCB的切換,并運(yùn)行任務(wù)。</p><p> 中斷級(jí)的任務(wù)切換OSIntCtxSw()是在OSIntExt()中調(diào)用的,我
39、們一般在用戶ISR中調(diào)用OSIntExt()以實(shí)現(xiàn)中斷返回前的任務(wù)調(diào)度。由于ISR已經(jīng)將CPU寄存器的值存入被中斷的任務(wù)的堆棧中,所以O(shè)SIntCtxSw()的實(shí)現(xiàn)和OS_TASK_SW()不一樣,具體參見(jiàn)移植文檔。</p><p><b> ?。?)就緒表</b></p><p> 每個(gè)就緒的任務(wù)都放在就緒表中,就緒表有兩個(gè)變量:OSRdyGrp和OSRdyTbl
40、[]。OSRdyGrp中,將任務(wù)按優(yōu)先級(jí)分組,八個(gè)為一組。OSRdyGrp的每一位代表每組任務(wù)是否有進(jìn)入就緒態(tài)的任務(wù)。</p><p> 在就緒表中查找優(yōu)先級(jí)最高的任務(wù)不需要掃描整個(gè)OSRdyTbl[],只要查優(yōu)先級(jí)判定表OSUnMapTbl[]。OSUnMapTbl[]是常量表,所以查找優(yōu)先級(jí)最高的任務(wù)的執(zhí)行時(shí)間為常量,和就緒表的任務(wù)數(shù)無(wú)關(guān)。</p><p> 2.1.5 中斷服務(wù)&
41、lt;/p><p> 在用戶的ISR中可以調(diào)用OSIntEnter()和OSIntExit()通知µC/OS-II發(fā)生了中斷,這樣可以實(shí)現(xiàn)ISR返回前的任務(wù)調(diào)度。</p><p> 2.1.6 時(shí)鐘節(jié)拍</p><p> µC/OS-II要求用戶提供一個(gè)周期性的時(shí)鐘源,來(lái)實(shí)現(xiàn)時(shí)間的延遲和超時(shí)功能,時(shí)鐘節(jié)拍應(yīng)該每秒發(fā)生10~100次/秒。時(shí)鐘節(jié)拍
42、率越高,系統(tǒng)的額外負(fù)荷就越重。</p><p> 應(yīng)該在多任務(wù)系統(tǒng)啟動(dòng)后,也就是調(diào)用OSStart()后再開(kāi)啟時(shí)鐘節(jié)拍器。系統(tǒng)設(shè)計(jì)者可以在第1個(gè)開(kāi)始運(yùn)行的任務(wù)中調(diào)用時(shí)鐘節(jié)拍啟動(dòng)函數(shù)。假設(shè)用定時(shí)器TA0作為時(shí)鐘中斷源,那么,在移植過(guò)程中實(shí)現(xiàn)了函數(shù)init_timer_ta0(),此函數(shù)用來(lái)初始化定時(shí)器TA0,并將其打開(kāi)。µC/OS-II中的時(shí)鐘節(jié)拍服務(wù)是在ISR中調(diào)用OSTimeTick()實(shí)現(xiàn)的。OS
43、TimeTick()跟蹤所有任務(wù)的定時(shí)器以及超時(shí)時(shí)限。</p><p> 2.1.7 µC/OS-II的初始化和啟動(dòng)</p><p> 調(diào)用µC/OS-II的服務(wù)之前要先調(diào)用系統(tǒng)初始化函數(shù)OSInit()。OSInit()初始化µC/OS-II所有的變量和數(shù)據(jù)結(jié)構(gòu),并建立空閑任務(wù)。µC/OS-II初始化任務(wù)控制塊、事件控制塊、消息隊(duì)列緩沖、標(biāo)志控
44、制塊等數(shù)據(jù)結(jié)構(gòu)的空緩沖區(qū)。</p><p> 多任務(wù)的啟動(dòng)是通過(guò)調(diào)用OSStart()實(shí)現(xiàn)的。啟動(dòng)之前要至少創(chuàng)建一個(gè)任務(wù)。OSStart()調(diào)用就緒任務(wù)啟動(dòng)函數(shù)OSStartHighRdy(),其功能是將任務(wù)棧的值恢復(fù)到CPU寄存器,并執(zhí)行中斷返回指令,強(qiáng)制執(zhí)行該任務(wù)代碼。</p><p> 2.1.8 內(nèi)存管理</p><p> 在ANSI C中是使用mal
45、loc和free兩個(gè)函數(shù)來(lái)動(dòng)態(tài)分配和釋放內(nèi)存。但在嵌入式實(shí)時(shí)系統(tǒng)中,多次這樣的操作會(huì)導(dǎo)致內(nèi)存碎片,且由于內(nèi)存管理算法的原因,malloc和free的執(zhí)行時(shí)間也是不確定。µC/OS-II中把連續(xù)的大塊內(nèi)存按分區(qū)管理。每個(gè)分區(qū)中包含整數(shù)個(gè)大小相同的內(nèi)存塊,但不同分區(qū)之間的內(nèi)存塊大小可以不同。用戶需要?jiǎng)討B(tài)分配內(nèi)存時(shí),系統(tǒng)選擇一個(gè)適當(dāng)?shù)姆謪^(qū),按塊來(lái)分配內(nèi)存。釋放內(nèi)存時(shí)將該塊放回它以前所屬的分區(qū),這樣能有效解決碎片問(wèn)題,同時(shí)執(zhí)行時(shí)間也是
46、固定的。</p><p> 2.1.9 任務(wù)管理</p><p> µC/OS-II中最多可以支持64個(gè)任務(wù),分別對(duì)應(yīng)優(yōu)先級(jí)0~63,其中0為最高優(yōu)先級(jí)。63為最低級(jí),系統(tǒng)保留了4個(gè)最高優(yōu)先級(jí)的任務(wù)和4個(gè)最低優(yōu)先級(jí)的任務(wù),所有用戶可以使用的任務(wù)數(shù)有56個(gè)。µC/OS-II提供了任務(wù)管理的各種函數(shù)調(diào)用,包括創(chuàng)建任務(wù),刪除任務(wù),改變?nèi)蝿?wù)的優(yōu)先級(jí),任務(wù)掛起和恢復(fù)等。系統(tǒng)初
47、始化時(shí)會(huì)自動(dòng)產(chǎn)生兩個(gè)任務(wù):一個(gè)是空閑任務(wù),它的優(yōu)先級(jí)最低,該任務(wù)僅給一個(gè)整型變量做累加運(yùn)算;另一個(gè)是統(tǒng)計(jì)任務(wù),它的優(yōu)先級(jí)為次低,該任務(wù)負(fù)責(zé)統(tǒng)計(jì)當(dāng)前CPU的利用率。 </p><p> 2.1.10 µC/OS-II任務(wù)間通信方式 </p><p><b> ?。?)信號(hào)量</b></p><p> 信號(hào)量由兩部分組成:一部分是16
48、位的無(wú)符號(hào)整型信號(hào)量的計(jì)數(shù)值;另一部分是由等待該信號(hào)量的任務(wù)組成的等待任務(wù)表。信號(hào)量用于對(duì)共享資源的訪問(wèn),用鑰匙符號(hào),符號(hào)旁數(shù)字代表可用資源數(shù),對(duì)于二值信號(hào)量該值為1。信號(hào)量還可用于表示某事件的發(fā)生,用旗幟符號(hào)表示,符號(hào)旁數(shù)字代表事件已經(jīng)發(fā)生的次數(shù)?;コ庑托盘?hào)量用于處理共享資源。</p><p><b> (2)消息郵箱</b></p><p> 一種通信機(jī)制,可
49、以使一個(gè)任務(wù)或者中斷服務(wù)子程序向另一個(gè)任務(wù)發(fā)送一個(gè)指針型的變量,通常該指針指向一個(gè)包含了消息的特定數(shù)據(jù)結(jié)構(gòu)。</p><p><b> ?。?)消息隊(duì)列</b></p><p> 另一種通信機(jī)制,允許一個(gè)任務(wù)或者中斷服務(wù)子程序向另一個(gè)任務(wù)發(fā)送以指針?lè)绞蕉x的變量或其它任務(wù),因具體應(yīng)用不同,每個(gè)指針指向的包含了消息的數(shù)據(jù)結(jié)構(gòu)的變量類型也有所不同。</p>
50、<p> 2.2 STM32上移植方法</p><p> 2.2.1 平臺(tái)需求</p><p> µC/OS-II的正常運(yùn)行需要處理器平臺(tái)滿足以下要求:</p><p> (1)處理器的C編譯器能產(chǎn)生可重入代碼。</p><p> ?。?)用C語(yǔ)言就可以打開(kāi)和關(guān)閉中斷。</p><p>
51、 ?。?)處理器支持中斷,并且能產(chǎn)生定時(shí)中斷(通常在10至100Hz之間)。 </p><p> ?。?)處理器支持能夠容納一定量數(shù)據(jù)(可能是幾千字節(jié))的硬件堆棧。</p><p> ?。?)處理器有將堆棧指針和其它CPU寄存器讀出和存儲(chǔ)到堆?;騼?nèi)存中的指令。</p><p> 2.2.2 移植方法</p><p> ?。?)內(nèi)核頭文件(O
52、S_CPU.H) </p><p> 在OS_CP U.H 中,主要聲明了一些與微處理器相關(guān)的常量、宏和typedef。 </p><p> 定義與處理器無(wú)關(guān)的數(shù)據(jù)類型 </p><p> typede f unsigned char BOOLEAN; </p><p> typedef unsigned char
53、 INT8U; </p><p> typedef signed char NT8S; </p><p> typedef unsigned short INT16U; </p><p> typedef signed short INT16S; </p><p>
54、typedef unsigned int INT32U; </p><p> typedef signed int NT32S; </p><p> typedef float FP32; </p><p> typedef double FP64;
55、</p><p> typedef unsigned int OS_STK; </p><p> typedef unsigned int OS_CPU_SR; </p><p> 在STM32處理器及keil MDK 或者IAR 編譯環(huán)境中可以通過(guò)查手冊(cè)得知short類型是16位而int類型是32位,這對(duì)于Corte
56、x-M3內(nèi)核是一致的。故這部分代碼無(wú)需修改。盡管µC/OS-II定義了float 類型和double 類型,但為了方便移植它們?cè)?#181;C/OS-II源代碼中并未使用。為了方便使用堆棧,µC/OS-II定義了一個(gè)堆棧數(shù)據(jù)類型。在Cortex-M3 中寄存器為32位,故定義堆棧的長(zhǎng)度也為32位。Cortex-M3 狀態(tài)寄存器為32位,定義OS_CPU_SR主要是為了在進(jìn)出臨界代碼段保存狀態(tài)寄存器。 </p&g
57、t;<p><b> (2)臨界代碼段 </b></p><p> µC/OS-II為了保證某段代碼的完整執(zhí)行,需要臨時(shí)的關(guān)閉中斷,在這</p><p> 段代碼執(zhí)行完成之后再打開(kāi)中斷。這樣的代碼段稱作臨界代碼段。µC/OS-II通過(guò)定義兩個(gè)宏OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL() 來(lái)分別
58、實(shí)現(xiàn)中斷的關(guān)閉和打開(kāi)。一般來(lái)說(shuō),采用方法3來(lái)實(shí)現(xiàn)這兩個(gè)宏。這兩個(gè)宏分別定義如下: </p><p> #define OS_CRITICAL_METHOD 3 </p><p> #define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();} </p><p> #define O
59、S_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);} </p><p> 函數(shù)OS_CPU_SR_Save()和OS_CPU_SR_Restore(cpu_sr)在OS_CPU_A.ASM中定義。同時(shí)得注意,在使用這兩個(gè)宏之前,必須定義OS_CPU_SR cpu_sr;否則編譯時(shí)將出錯(cuò)。 </p><p> (3)棧的增長(zhǎng)方向
60、 </p><p> 盡管µC/OS-II支持兩種方向生長(zhǎng)的棧,但對(duì)于以Cortex-M3為內(nèi)核的STM32 微處理器來(lái)說(shuō),它支持向下增長(zhǎng)的滿棧,故需要定義棧增長(zhǎng)方向宏為1。即定義成如下形式 </p><p> #define OS_STK_GROWTH 1 </p><p> (4)任務(wù)級(jí)任務(wù)切換 </p><p
61、> 任務(wù)級(jí)任務(wù)切換調(diào)用宏OS_TASK_SW()來(lái)實(shí)現(xiàn)。因?yàn)檫@個(gè)宏也是與處理器相關(guān)的,因此這個(gè)宏在OS_CPU_A.ASM中描述。 </p><p> ?。?)其他函數(shù)聲明 </p><p> 在OS_ CPU.H中,還聲明了以下幾個(gè)函數(shù),這幾個(gè)函數(shù)均在OS_CPU_A.ASM中實(shí)現(xiàn)。 </p><p> void OSCtxSw(void); <
62、/p><p> void OSIntCtxSw(void); </p><p> void OSStartHighRdy(void); </p><p> void OS_CPU_PendSVHandler(void); </p><p> ?。?)與處理器相關(guān)的匯編代碼(OS_CPU_A.ASM)</p><p>
63、 在OS_CP U_A.ASM中實(shí)現(xiàn)的是下面五個(gè)與處理器相關(guān)的函數(shù)。 </p><p> OS_CPU_SR_Save(); </p><p> OS_CPU_SR_Restore(); </p><p> OSStartHighRdy(); </p><p> OSCtxSw(); </p><p
64、> OSIntCtxSw(); </p><p> 2.3.3 函數(shù)實(shí)現(xiàn) </p><p> ?。?)關(guān)中斷函數(shù)(OS_CPU_SR_Save()) </p><p> 即先保存當(dāng)前的狀態(tài)寄存器然后關(guān)中斷。故關(guān)中斷實(shí)現(xiàn)代碼如下 </p><p> OS_CPU_SR_Save </p><p>
65、MRS R0, PRIMASK; </p><p><b> CPSID I </b></p><p> BX LR </p><p> 這也是宏OS_ENTER_CRITICAL() 的最終實(shí)現(xiàn)。 </p><p> (2)恢復(fù)中斷函數(shù)(OS_CPU_SR_Restore()) </p
66、><p> 這是宏OS_EXIT_CRITICAL()的最終實(shí)現(xiàn)。也就是將狀態(tài)寄存器的內(nèi)容從R0中恢復(fù),然后跳轉(zhuǎn)回去。此函數(shù)完成的將中斷狀態(tài)恢復(fù)到關(guān)中斷前的狀態(tài)。其代碼如下: </p><p> OS_CPU_SR_Restore </p><p> MSR PRIMASK, R0 </p><p> BX LR
67、 </p><p> Cortex-M3處理器有單獨(dú)的指令來(lái)打開(kāi)或者關(guān)閉中斷,所以這兩個(gè)函數(shù)實(shí)現(xiàn)起來(lái)很簡(jiǎn)單。 </p><p> (3)啟動(dòng)最高優(yōu)先級(jí)任務(wù)運(yùn)行(OSStartHighRdy()) </p><p> OSStart()調(diào)用OSStartHighRdy()來(lái)啟動(dòng)最高優(yōu)先級(jí)任務(wù)的運(yùn)行,從而啟動(dòng)整個(gè)系統(tǒng)。OSStartHighRdy()主要
68、完成以下幾項(xiàng)工作: </p><p> 為任務(wù)切換設(shè)置PendSV的優(yōu)先級(jí);</p><p> 為第一次任務(wù)切換設(shè)置棧指針為0;</p><p> 設(shè)置OSRunning = TRUE,以表明系統(tǒng)正在運(yùn)行;</p><p> ?、?觸發(fā)一次PendSV,打開(kāi)中斷等待第一次任務(wù)的切換。 </p><p> (4)
69、任務(wù)級(jí)和中斷級(jí)任務(wù)切換 </p><p> 因?yàn)镃ortex-M3進(jìn)入異常自動(dòng)保存寄存器R3-R0,R12,LR,PC和xPSR這種的特殊機(jī)制,這兩個(gè)函數(shù)都是觸發(fā)一次PendSV來(lái)實(shí)現(xiàn)任務(wù)的切換。首先是微處理器自動(dòng)保存上面提到的寄存器,然后把當(dāng)前的堆棧指針保存到任務(wù)的棧中,將要切換的任務(wù)的優(yōu)先級(jí)和任務(wù)控制塊的指針賦值給運(yùn)行時(shí)的最高優(yōu)先級(jí)指針和運(yùn)行時(shí)的任務(wù)控制塊指針,最后再把要運(yùn)行的任務(wù)的堆棧指針賦值給微處理器的
70、堆棧指針,這樣就可以退出中斷服務(wù)程序了。中斷服務(wù)程序退出的時(shí)候?qū)⒆詣?dòng)出棧R3-R0,R12,LR,PC和xPSR。具體的PendSV服務(wù)程序的偽代碼如下: </p><p> OS_CPU_PendSVHandler : </p><p> // 進(jìn)入異常,處理器自動(dòng)保存R3-R0,R12,LR,PC和xPSR </p><p> if
71、(PSP != NULL) //判斷不是開(kāi)始第一次任務(wù) </p><p><b> { </b></p><p> 保存R4-R11到任務(wù)的堆棧; </p><p> OSTCBCur->OSTCBStkPtr = SP; //保存堆棧的指針到任務(wù)控制塊 </p><p><b> } <
72、/b></p><p> OSTaskSwHook(); //實(shí)現(xiàn)用戶擴(kuò)展功能而定義的鉤子 </p><p> OSPrioCur = OSPrioHighRdy; //設(shè)置運(yùn)行任務(wù)為最高優(yōu)先級(jí)就緒任務(wù) </p><p> OSTCBCur = OSTCBHighRdy; // 設(shè)置運(yùn)行的任務(wù)控制塊為最高 </p><
73、p> //就緒任控制塊務(wù) </p><p> PSP = OSTCBHighRdy->OSTCBStkPtr;//將要切換的任務(wù)堆棧指 </p><p> // 針賦給微處理器的堆棧指 </p><p> // 針從而實(shí)現(xiàn)切換 </p><p> 從堆棧中恢復(fù) R
74、4-R11; 從異常中返回; </p><p> // 退出異常,處理器自動(dòng)恢復(fù)R3-R0,R12,LR,PC和xPSR </p><p> 這樣很容易寫出PendSV中斷服務(wù)程序的代碼了。 </p><p> ?。?)與CPU 相關(guān)的C 函數(shù)和鉤子函數(shù)(OS_CPU_C.C ) </p><p>
75、這個(gè)文件中包含10個(gè)函數(shù),具體如下: </p><p> OSInitHookBegin (); </p><p> OSInitHookEnd (); </p><p> OSTaskCreateHook (); </p><p> OSTaskDelHook (); </p><p>
76、OSTaskIdleHook (); </p><p> OSTaskStatHook (); </p><p> OSTaskStkInit (); </p><p> OSTaskSwHook (); </p><p> OSTCBInitHook (); </p><p> OS
77、TimeTickHook (); </p><p> 這10個(gè)函數(shù)有9個(gè)是為了擴(kuò)展用戶功能而定義的鉤子函數(shù),這些鉤子函數(shù)可以都為空函數(shù),也可以加上一些用戶需要的擴(kuò)展功能。另外一個(gè)不是鉤子函數(shù),它是OSTaskStkInit()。這個(gè)函數(shù)的功能是當(dāng)一個(gè)任務(wù)被創(chuàng)建時(shí),它完成這個(gè)任務(wù)堆棧的初始化。這個(gè)函數(shù)首先將用戶為任務(wù)分配的堆棧頂?shù)刂焚x值給一個(gè)棧指針變量,然后再通過(guò)這個(gè)棧指針向任務(wù)的棧空間寫入初值。這個(gè)初值無(wú)關(guān)
78、緊要,為0就可以了。這個(gè)函數(shù)的代碼時(shí)下如下: </p><p> OS_STK *OSTaskStkInit (void (*task)(void *pd), void *p_arg, </p><p> OS_STK *ptos, INT16U opt) </p><p> { </p><p&g
79、t; OS_STK *stk; </p><p> (void)opt; //防止編譯器報(bào)錯(cuò) </p><p> stk = ptos; // 將棧頂?shù)刂焚x值給棧指針變量 </p><p> // 以進(jìn)入異常的順序來(lái)給棧賦初值 </p><p> *(st
80、k) = (INT32U)0x00000000L; //xPSR </p><p> *(--stk) = (INT32U)task; //Entry Point </p><p> *(--stk) = (INT32U)0x00000000L; // R14 (LR) </p><p> *
81、(--stk) = (INT32U)0x00000000L; //R12 </p><p> *(--stk) = (INT32U)0x00000000L; //R3 </p><p> *(--stk) = (INT32U)0x00000000L; // R2 </p><p> *(--stk) =
82、(INT32U)0x00000000L; // R1 </p><p> *(--stk) = (INT32U)p_arg; //R0 : 傳遞的參數(shù) </p><p> // 剩下的寄存器初始化 </p><p> *(--stk) = (INT32U)0x00000000L; // R11
83、 </p><p> *(--stk) = (INT32U)0x00000000L; //R10 </p><p> *(--stk) = (INT32U)0x00000000L; // R9 </p><p> *(--stk) = (INT32U)0x00000000L; //R8 <
84、;/p><p> *(--stk) = (INT32U)0x00000000L; //R7 </p><p> *(--stk) = (INT32U)0x00000000L; // R6 </p><p> *(--stk) = (INT32U)0x00000000L; // R5 </p><
85、p> *(--stk) = (INT32U)0x00000000L; // R4 </p><p> return (stk); </p><p> } </p><p> 其他的鉤子函數(shù)都為空函數(shù)。這樣,整個(gè)移植的代碼就介紹完了。整個(gè)移植的過(guò)程非常容易。剩下的工作就是編寫用戶任務(wù),
86、并在開(kāi)發(fā)板上驗(yàn)證,以此來(lái)驗(yàn)證該移植方案是可行的和成功的。</p><p> 3 LCD屏程序設(shè)計(jì)及調(diào)試</p><p><b> 3.1 工具概述</b></p><p> RVMDK源自德國(guó)的KEIL公司,是RealView MDK的簡(jiǎn)稱。RealView MDK集成了業(yè)內(nèi)最領(lǐng)先的技術(shù),支持ARM7、ARM9和Cortex-M3核處理
87、器,自動(dòng)配置啟動(dòng)代碼,集成Flash燒寫模塊,強(qiáng)大的Simulation設(shè)備模塊,性能分析等功能。</p><p> 3.1.1 keil4工程建立以及仿真方法</p><p><b> ?。?)新建工程。</b></p><p> 打開(kāi)MDK軟件,選擇Project→New uVision Project菜單項(xiàng),新建一個(gè)文件夾名為“畢業(yè)設(shè)
88、計(jì)”,保存,則彈出器件選擇對(duì)話框,這里選擇STM32F103RB。單擊“OK”按鈕,則彈出一個(gè)對(duì)話框加載啟動(dòng)文件到工程中。</p><p> 打開(kāi)“畢業(yè)設(shè)計(jì)”文件夾,在里面添加子文件夾</p><p> ?。?)添加系統(tǒng)文件與工程管理。</p><p> 回到“畢業(yè)設(shè)計(jì)”文件夾中,把系統(tǒng)SYSTEM文件夾(delay,sys,usart文件夾)復(fù)制過(guò)來(lái),再建立m
89、ain和hardware文件夾用于主函數(shù)和各外設(shè)資源函數(shù)。回到工程中,點(diǎn)擊manage components,添加工程中的文件,進(jìn)行分類管理工程。</p><p> ?。?)最后新建 main文件,在編輯區(qū)寫代碼。</p><p> 3.1.2 硬件平臺(tái)紹</p><p> ALIENTEK MiniSTM32選擇的是STM32F103RBT6 作為M
90、CU,STM32F103的型號(hào)眾多,作為一款低端開(kāi)發(fā)板,選擇 STM32F103RBT6是最佳的選擇。128K FLASH、20K SRAM、2個(gè)SPI、3個(gè)串口、1個(gè)USB 、1個(gè)CAN、2個(gè)12位的ADC、RTC、51個(gè)可用IO腳···,這樣的配置無(wú)論放到那里都是很不錯(cuò)的了,更重要的是其價(jià)格,18元左右的零售價(jià),相對(duì)其他芯片配置及價(jià)格,所以我們選擇了它作為我們的主芯片。</p><p
91、> BOOT1用于設(shè)置STM32的啟動(dòng)方式,其對(duì)應(yīng)啟動(dòng)模式如表3.1所示:</p><p> 表3.1 BOOT0、BOOT1啟動(dòng)模式表</p><p> 按照表3.1,一般情況下如果我們想用用串口下載代碼,則必須配置BOOT0為1,BOOT1為0,而如果想讓STM32一按復(fù)位鍵就開(kāi)始跑代碼,則需要配置BOOT0為0,BOOT1隨便設(shè)置都可以。ALIENTEK這款開(kāi)發(fā)板專門設(shè)計(jì)
92、了一鍵下載電路,通過(guò)串口的 DTR和RTS信號(hào),來(lái)自動(dòng)配置BOOT0和 BOOT1,因此不需要用戶來(lái)手動(dòng)切換他們的狀態(tài),直接串口下載和軟件自動(dòng)控制,可以非常方便的下載代碼。 </p><p> P3和P1分別用于 PORTA和PORTB的IO口引出,其中P2還有部分用于 PORTC口的引出。PORTA和PORTB都是按順序排列的,這樣設(shè)計(jì)的目的是為了讓大家更方便地與外部設(shè)備連接。P2連接了DS18B20的數(shù)據(jù)口
93、以及紅外傳感器的數(shù)據(jù)線,它們分別對(duì)應(yīng)著 PA0和PA1,只需要19通過(guò)跳線帽將P2和P3連接起來(lái)就可以使用了。這里不直接連在一起的原因有二:1,防止紅外傳感器和DS18B20 對(duì)這兩個(gè)IO口作為其他功能使用的時(shí)候的影響;2,DS18B20 和紅外傳感器還可以用來(lái)給其他板子提供輸入,等于我們的板子為別的板子提供了紅外接口和溫度傳感器,在調(diào)試的時(shí)候,還是蠻有用的。P4口連接了PL2303的串口輸出,對(duì)應(yīng)著 STM32的串口1(PA9/PA1
94、0),在使用的時(shí)候,也是通過(guò)跳線帽將這兩處連接起來(lái)。這樣設(shè)計(jì)有2個(gè)好處:1,使得 PA9和PA10用作其他用途。</p><p> 使用的時(shí)候,不受到PL2303的影響。2,USB 轉(zhuǎn)串口可以用作他用,并不僅限在這個(gè)板上的STM32使用,也可以連接到其他板子上,這樣ALIENEK MiniSTM32 就相當(dāng)于一個(gè)USB 串口。P5口是另外一個(gè)IO引出排陣,將PORTC和PORTD等的剩余IO口從這里引出。 &l
95、t;/p><p> 在此部分原理圖中,我們還可以看到STM32F103RBT6 的各個(gè)IO口與外設(shè)的連接關(guān)系,這些將在后面給大家介紹。 這里STM32的VBAT 采用CR1220 紐扣電池和VCC3.3混合供電的方式,在有外部電源(VCC3.3)的時(shí)候,CR1220不給VBAT供電,而在外部電源斷開(kāi)的時(shí)候,則由CR1220給VBAT供電。這樣,VBAT總是有電的,以保證RTC的走時(shí)以及后備寄存器的內(nèi)容不丟失。<
96、;/p><p><b> 3.2 硬件結(jié)構(gòu)</b></p><p> 3.2.1 STM32最小系統(tǒng)</p><p> STM32F103最小系統(tǒng)包括電源電路,復(fù)位電路,時(shí)鐘電路,主芯片和下載接口。STM32F103使用3.3V供電,且引腳接有濾波電容,保證芯片工作穩(wěn)定;復(fù)位電路使用的低電平復(fù)位,該電路上電可以復(fù)位,按鍵按下時(shí)也可以復(fù)位;時(shí)鐘
97、電路使用8MHZ晶振,和22pF電容助振。</p><p><b> 圖3.1 最小系統(tǒng)</b></p><p> 3.2.2 LCD接口</p><p> 顯示電路使用的是2.4寸的TFT液晶顯示器,該顯示器有16位的數(shù)據(jù)口和5位的控制端口。</p><p><b> 圖3.2 液晶顯示</b&
98、gt;</p><p> 3.2.3 LED接口</p><p> 輸入單元和指示部分,直接引到STM32F103的IO口。</p><p> 圖3.3 按鍵和LED燈</p><p> 3.2.4 紅處接收電路</p><p> HS0038用于顯度的采集,其通信是單總線式,直接與STM32F103相連。&
99、lt;/p><p> 圖3.4 紅處接收單元</p><p><b> 3.3 C程序設(shè)計(jì)</b></p><p> 在µC/OS-II里面創(chuàng)建6個(gè)任務(wù):開(kāi)始任務(wù)、LED0、LED1、觸摸屏,KEY按鍵任務(wù)和LCD顯示任務(wù),開(kāi)始任務(wù)用于創(chuàng)建其他(LED0、LED1、紅處接收、按鍵和LCD顯示)任務(wù),之后掛起;LED0任務(wù)用于控制DS
100、0的亮滅,DS0每秒鐘亮800ms;LED1任務(wù)用于控制DS1的亮滅,DS1亮300ms,滅300ms,依次循環(huán);觸摸屏任務(wù)用于手寫輸入,并立即顯示;LCD顯示任務(wù)用于顯示圖形,和接收紅外信號(hào)信息顯示出來(lái);KEY按鍵任務(wù)分別使屏進(jìn)入校準(zhǔn)功能,以及顯示歡迎界面。 </p><p> 首先,建立基本的工程后,在該工程源碼下面加入µC/OS-II文件夾,存放µC/OS-II源碼(我們已經(jīng)將
101、1;C/OS-II源碼分為三個(gè)文件夾:CORE、PORT和CONFIG)。打開(kāi)工程,新建µC/OS-II-CORE、µC/OS-II -PORT和µC/OS-II -CONFIG三個(gè)分組,分別添加µC/OS-II三個(gè)文件夾下的源碼,并將這三個(gè)文件夾加入頭文件包含路徑。</p><p> µC/OS-II-CORE分組下面是µC/OS-II的核心源碼,我
102、們不需要做任何變動(dòng)。 </p><p> µC/OS-II-PORT分組下面是我們移植µC/OS-II要修改的3個(gè)代碼,這個(gè)在移植的時(shí)候完成。 </p><p> µC/OS-II-CONFIG分組下面是µC/OS-II的配置部分,主要由用戶根據(jù)自己的需要對(duì)µC/OS-II進(jìn)行裁剪或其他設(shè)置。工程框架如下圖3.5:</p>
103、<p> 其次,對(duì)os_cfg.h里面定義OS_TICKS_PER_SEC的值為200,也就是設(shè)置µC/OS-II的時(shí)鐘節(jié)拍為5ms,同時(shí)設(shè)置OS_MAX_TASKS為10,也就是最多10個(gè)任務(wù)(包括空閑任務(wù)和統(tǒng)計(jì)任務(wù)在內(nèi))。</p><p> 再次,在main.c文件中設(shè)置任務(wù)堆棧大小、設(shè)置任務(wù)優(yōu)先級(jí)、任務(wù)堆棧,創(chuàng)建5個(gè)任務(wù)。如圖3.5所示:</p><p>&
104、lt;b> 圖3.5 任務(wù)結(jié)構(gòu)</b></p><p><b> 3.4 調(diào)試</b></p><p> 3.4.1 設(shè)置編譯環(huán)境</p><p> ?。?)打開(kāi)project菜單,選擇Options for Target“畢業(yè)設(shè)計(jì)”對(duì)話框,如圖3.6在target中,將晶振選為8MHz;在output中,將Creat
105、HEX File復(fù)選框選中。為調(diào)試方便,將產(chǎn)生調(diào)試中間信息的復(fù)選框也選中。</p><p> 圖3.6 編譯環(huán)境窗口</p><p> (2)在C/C++中,將各分文件的路徑加入如圖3.7</p><p><b> 圖3.7 路徑添加</b></p><p> (3)在Debug中,將Use選中并設(shè)置為Corte
106、x-M/R J-LINK/J-Trace,設(shè)為JINK連接實(shí)物仿真了。</p><p> (4)在Utilities中,設(shè)置如圖3.8,并打開(kāi)Settings,設(shè)置FLASH為256KB。</p><p> 圖3.8 Utilities</p><p> 3.4.2 調(diào)試結(jié)果</p><p> 編譯程序,排出error和warning
107、,如圖3.9得到正確的程序,下載程序到開(kāi)發(fā)板上,得到了預(yù)期結(jié)果</p><p><b> 圖3.9 編譯結(jié)果</b></p><p> 將程序下載到開(kāi)發(fā)板上,并觀察現(xiàn)象,LED小燈按程序要求正常運(yùn)行,紅外接收器正確顯示數(shù)值,按鍵KEY0可實(shí)現(xiàn)進(jìn)入校準(zhǔn)功能,KEY1可以顯示歡迎界面,KEY2可以清除,說(shuō)明程序正確?,F(xiàn)象如圖3.10</p><p&
108、gt; 圖3.10 實(shí)物現(xiàn)象</p><p><b> 結(jié) 語(yǔ)</b></p><p> 本文完成基于32位ARMv7微處理器Cortex-M3和嵌入式實(shí)時(shí)操作系統(tǒng)µC/OS-II的嵌入式操作系統(tǒng)的移植和功能的實(shí)現(xiàn)。經(jīng)過(guò)幾個(gè)月的深入學(xué)習(xí),了解了嵌入式操作系統(tǒng)µC/OS-II的性能、特點(diǎn)、結(jié)構(gòu)和基本運(yùn)行原理,以及通過(guò)實(shí)驗(yàn)調(diào)試的方法完成對(duì)&
109、#181;C/OS-II時(shí)間管理函數(shù),任務(wù)管理函數(shù)的靈活應(yīng)用。認(rèn)真掌握Cortex-M3的硬件結(jié)構(gòu)和指令系統(tǒng),并在ALIENTEK MiniSTM32開(kāi)發(fā)板上調(diào)試串口,TFT彩屏以及ADC實(shí)驗(yàn)。本文將嵌入式實(shí)時(shí)操作系統(tǒng)µC/OS-II移植到Cortex微處理器上,并對(duì)其進(jìn)行系統(tǒng)測(cè)試和系統(tǒng)功能實(shí)現(xiàn),實(shí)現(xiàn)了一個(gè)基本完整的嵌入式實(shí)時(shí)操作系統(tǒng)。該系統(tǒng)一方面實(shí)現(xiàn)了單個(gè)IO口和多人IO口的組合輸入輸出控制,采用模塊化設(shè)計(jì)思想,具有代表性。
110、另一方面,它又是一個(gè)相對(duì)完整的系統(tǒng),可以應(yīng)用于工業(yè)控制的各個(gè)顯示終端,完成指示功能。由于實(shí)時(shí)操作系統(tǒng)內(nèi)核µC/OS-II是為嵌入式應(yīng)用編寫的通用軟件,所以不得不強(qiáng)調(diào)處理器的通用性和功能的全面性。在實(shí)際應(yīng)用中可以根據(jù)需要裁減和優(yōu)化。其次,本文所調(diào)度的任務(wù)較簡(jiǎn)單,主要是為了說(shuō)明方法。</p><p> 在程序調(diào)試過(guò)程中,由于對(duì)STM32RTB6內(nèi)核學(xué)習(xí)還不是很透徹,出現(xiàn)了警告,一直困擾。任務(wù)中加入更多任務(wù)
111、時(shí)老出錯(cuò),程序不能正常運(yùn)行,但通不斷學(xué)習(xí),查閱資料得以解決。</p><p> 本人認(rèn)真進(jìn)行了課題的研究并完成了本論文,由于作者水平有限,論文中可能仍有錯(cuò)誤和不足之處,敬請(qǐng)大家批評(píng)指正。</p><p> 最后,感謝指導(dǎo)老師的關(guān)懷和細(xì)心的指導(dǎo),感謝同學(xué)們的幫助。謝謝你們的支持!</p><p><b> 主要參考文獻(xiàn)</b></p&
112、gt;<p> [1] 意法半導(dǎo)體. STM32中文參考手冊(cè). 第10版.意法半導(dǎo)體(中國(guó))投資公司,2010.</p><p> [2] 劉軍. 例說(shuō)STM32. 北京:北京航空航天大學(xué)出版社,2011.</p><p> [3] 宋巖(譯). Joseph Yiu.Cortex—M3權(quán)威指南. 北京:北京航空航天大學(xué)出版社,2009.</p><
113、p> [4] 劉榮. 圈圈教你玩USB. 北京:北京航空航天大學(xué)出版社,2009.</p><p> [5] 杜春雷. ARM體系結(jié)構(gòu)與編程. 北京:清華大學(xué)出版社,2003.</p><p> [6] 李寧. ARM開(kāi)發(fā)工具Real View MDK 使用入門. 北京:北京航空航天大學(xué)出</p><p><b> 版社,2008.</
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于stm32的嵌入式操作系統(tǒng)程序設(shè)計(jì)及實(shí)現(xiàn)本科
- 基于STM32的嵌入式點(diǎn)焊系統(tǒng)研究.pdf
- 嵌入式linux操作系統(tǒng)的驅(qū)動(dòng)程序設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于STM32的嵌入式智能相機(jī)系統(tǒng)研發(fā).pdf
- 基于stm32病房呼叫系統(tǒng)畢業(yè)論文
- 基于STM32的嵌入式網(wǎng)絡(luò)控制器設(shè)計(jì).pdf
- 基于STM32的嵌入式uClinux平臺(tái)的研究與實(shí)現(xiàn).pdf
- 基于stm32的智能小車設(shè)計(jì)-畢業(yè)論文
- 基于STM32的ARM嵌入式風(fēng)力擺控制系統(tǒng)設(shè)計(jì).doc
- 基于STM32的嵌入式web服務(wù)器的設(shè)計(jì).pdf
- 畢業(yè)設(shè)計(jì)任務(wù)書-基于stm32的嵌入式系統(tǒng)的硬件設(shè)計(jì)與開(kāi)發(fā)
- 畢業(yè)設(shè)計(jì)任務(wù)書-基于stm32的嵌入式系統(tǒng)的硬件設(shè)計(jì)與開(kāi)發(fā)
- 基于stm32的arm嵌入式風(fēng)力擺控制系統(tǒng)設(shè)計(jì)(含視頻)
- 操作系統(tǒng)程序設(shè)計(jì)-操作系統(tǒng)模擬實(shí)現(xiàn)
- 基于嵌入式系統(tǒng)的聊天程序設(shè)計(jì)
- 基于stm32的脈搏測(cè)量?jī)x設(shè)計(jì)畢業(yè)論文
- 基于stm32的溫度測(cè)量系統(tǒng)畢業(yè)設(shè)計(jì)論文
- 基于stm32的pid閉環(huán)恒壓控制系統(tǒng)設(shè)計(jì)-畢業(yè)論文
- 嵌入式實(shí)時(shí)操作系統(tǒng)ZERTLinux的設(shè)計(jì)及實(shí)現(xiàn).pdf
- 基于stm32的便攜式酒精濃度檢測(cè)儀設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
評(píng)論
0/150
提交評(píng)論