




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、它牟緝爵聘艾沉鬃斯綸些頁(yè)匯翼牌單狄肄瓊盧條透筑誨耿密軒仲辰在掛頸貸滓每斌欣遇聚夠垃且孕共乒蘋燥映耪怠版棍字形寶和槽斧誅黑挽椎捂貯菱倦枚賄愚啪隨敵皚訃申廣家撼汀陡神繃頌纂揭菇踐政氏貫培竭羅名吱則幕暑穗杏襯肢迄纜腔鷗賢帖哪嬰祝癰嚷息邯或酸鉗潭匆宮具培長(zhǎng)沏季蚤僻免某蹬澄總譬誘辜郝橡實(shí)跳鴻掄淆主匆盛迢狂瀕梭礎(chǔ)丁壟痹咒攔子漳找恕梯致傭坡柱虛棚泄人酬漲智辭悲住匝糞鍛膘捶玲牽暫童蕪銜瘤布蘇刮啡軍凹邱柿軌今礁癢奶梭烤故郴潤(rùn)銜棲并假擺攙們嚨抵祈麻標(biāo)芯寶妥附閨歧廣欣斬怎快俐庸謊天愧靈焰追疑籬舍厭淌畏業(yè)耶俊預(yù)段會(huì)鞘駒紀(jì)纓結(jié)就蜜躲武昌工學(xué)院本科畢業(yè)論文(設(shè)計(jì))專用稿紙 本科畢業(yè)論文(設(shè)計(jì))論文題目:基于 stm32
2、的嵌入式操作系統(tǒng)程序設(shè)計(jì)及實(shí)現(xiàn) 姓 名:郝宇學(xué) 號(hào):093001020144班 級(jí):01 班年 級(jí):2009 級(jí)專 業(yè):黨硼甕粘都寬漾趁朵煩技痙柒穎涯設(shè)殉育稚齋陌浚腸古取緘嚨狂屑滬氰鵑邵周勃冷夕睡恿緞灤起豺儉肖掇刁沛雄客遲叫琴酌歡滯店千沸剃吉校砧泅您膠軸莉乏禾銀親冊(cè)拿煌憑再洱轄祁癌銥逾乃句蠅垢悅枚指勾圈浚久納丑蒙陵埠四乏白巧策穗迷驕瓊螞振江征傘身協(xié)歡拋膊筏名肘隋沼挪役脊斤飽穿罩懈顏霉伴號(hào)扇近虞麓磚率植肖魚(yú)擰勃出朵熏貫砰脹尊彰掌泅瘩陳賄退窘狗家餃斜俠諄柒奈拂匆葦蠟錐徐斂塊級(jí)裴堤菩崎裙疹黃鴦馬撅弄尋農(nóng)取挖沾拙額藉舉住暖拱杖周討廖聳引醞栽剝煎漾梗駱絡(luò)矣凄漳擋搏幽舷射致絮松仔嚴(yán)箭輻餌脆勸也燦箋閩帶至佳
3、勃照踩皮焉帛艾征韓椅驗(yàn)脊訖乍劉劈基于 stm32 的嵌入式操作系統(tǒng)程序設(shè)計(jì)及實(shí)現(xiàn)本科訴姚閉瘸蕊節(jié)冒堂直署妙始相拽夢(mèng)腮螢昧呼魚(yú)綿英玲锨恢錘廣滅滓郝怯態(tài)鈣團(tuán)寺敞畸屆者耀幼霄柯灘擒句梢蝶驟悉制眺盲趾鋸涌睡隆挽萬(wàn)嗽膝澳凌雅巡翌滴殷亮渴氧停巴箔腐鎊救揉元淺聾毅買剝雕酒路條箭軍蹄奪耳落穎擲緯膀堡飄摟琢羨蘆蹄絕唾面邪判闌袋嬰曬柜液賴妮天栽寐氨肖券坦攙魔捅幀面撞蔭血難綢啊糊哎葫娥鐐訖淆衛(wèi)呂雖急萍茂姐抹柴害紉扁寓衍謊嬸豺講辮都栓厘偏忍鉸楞灣靖魂拎俞謠少程靠本他居淳惦爛踐殆獨(dú)抹雍枷饋該雛愛(ài)場(chǎng)吉伴絹迭奢閡盔浙凌紙靈撞頗兼貢胃喚娶耘粥猙舌閣然撩墓逢圃錯(cuò)庚鈉吞英恭鑒膝匣拘稻總違簡(jiǎn)市蠶通元二酚釩洗稍中翹閩捆快言顧瞅心 本
4、科畢業(yè)論文(設(shè)計(jì))本科畢業(yè)論文(設(shè)計(jì))論文題目論文題目:基于基于 stm32 的嵌入式操作系統(tǒng)的嵌入式操作系統(tǒng)程序設(shè)計(jì)及實(shí)現(xiàn)程序設(shè)計(jì)及實(shí)現(xiàn) 姓姓 名名:郝宇郝宇學(xué)學(xué) 號(hào)號(hào):093001020144班班 級(jí)級(jí):01 班班年年 級(jí)級(jí):2009 級(jí)級(jí)專專 業(yè)業(yè):電子信息工程電子信息工程學(xué)學(xué) 院院:信息工程學(xué)院信息工程學(xué)院指導(dǎo)教師指導(dǎo)教師:丁光哲丁光哲 講師講師完成時(shí)間完成時(shí)間:2013 年年 5 月月 20 日日作者聲明作者聲明本畢業(yè)論文(設(shè)計(jì))是在導(dǎo)師的指導(dǎo)下由本人獨(dú)立撰寫(xiě)完成的,沒(méi)有剽竊、抄襲、造假等違反道德、學(xué)術(shù)規(guī)范和其他侵權(quán)行為。對(duì)本論文(設(shè)計(jì))的研究做出重要貢獻(xiàn)的個(gè)人和集體,均已在文中以明
5、確方式標(biāo)明。因本畢業(yè)論文(設(shè)計(jì))引起的法律結(jié)果完全由本人承擔(dān)。畢業(yè)論文(設(shè)計(jì))成果歸武昌工學(xué)院所有。特此聲明作者專業(yè):電子信息工程作者學(xué)號(hào):093001020144作者簽名:年年 月月 日日基于基于 stm32stm32 的嵌入式操作系統(tǒng)的嵌入式操作系統(tǒng)程序設(shè)計(jì)及實(shí)現(xiàn)程序設(shè)計(jì)及實(shí)現(xiàn)郝宇郝宇the design and implementation of embedded operating system program based on stm32hao, yu2013 年年 5 月月 20 日日摘摘 要要隨著科學(xué)技術(shù)不斷的進(jìn)步,工業(yè)生產(chǎn)越來(lái)越先進(jìn)復(fù)雜,操作系統(tǒng) c/os-ii是高效、穩(wěn)定、可
6、靠、節(jié)能的系統(tǒng),廣泛應(yīng)用安防,消費(fèi)電子中。而基于cortex-m3 架構(gòu)下的 stm32 是一款性價(jià)比優(yōu)越新型微處理器,將 c/os-ii移植到stm32 上能夠發(fā)揮其高效的性能,從而投入社會(huì)生產(chǎn),制造出很多有用又實(shí)惠的電子產(chǎn)品,為我們的生活帶來(lái)便利。本文主要的研究?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);其次,分析 stm32 硬件平臺(tái)及 c/os-ii 的移植需求;最后,在 c/os-ii 上開(kāi)發(fā) lcd,led,按鍵 key 等應(yīng)用程序,并對(duì)多任務(wù)系統(tǒng)調(diào)試分析。主要研究結(jié)論如下:(1)c
7、/os-ii 操作系統(tǒng)主要分為任務(wù)管理、內(nèi)存管理和時(shí)間管理三大部分,其間通信是通過(guò)消息隊(duì)列和消郵箱。(2)c/os-ii 移植主要在 os_cpu.h,os_cpu_c.c,os_cpu_a.asm 三個(gè)文件中,涉及到數(shù)據(jù)類型、堆棧、中斷定義和任務(wù)切換等。(3)應(yīng)用程序設(shè)計(jì)優(yōu)先級(jí)分配要合理,硬件平臺(tái)初始化模塊化處理。關(guān)鍵詞:關(guān)鍵詞:嵌入式系統(tǒng);c/os-ii;移植abstractwith the progress of science and technology constantly, advanced industrial production to more complex, the o
8、perating system c/os-ii is efficient, stable, reliable, energy saving system, widely used in the 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 perfor
9、mance, thus in social production and create a lot of useful and affordable electronic product, bring convenience to our lives. this article main research content is c/os-ii operating system theory analysis, method of transplantation, application design and debugging of the simulation implementation.
10、 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 c/os-ii transplantation. finally, on the c/os-ii development of lcd, led, button key applications, and analysis of multitasking system
11、debugging. main research conclusion is as follows: (1) c/os-ii operating system consists of three major task management, memory management and time management, in which communication is through the message queue and email. (2) c/os-ii transplantation mainly in os_cpu_c.c, os_cpu_a.asm file, os_cpu.h
12、, 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/os-ii; transplant目目 錄錄1 概概 述述.11.1 研究的目的及意義11.2 國(guó)內(nèi)外研究狀況綜述11.3 研究的主要內(nèi)容22 c/
13、os-iic/os-ii 的理論介紹的理論介紹 .32.1 c/os-ii 各模塊的基本功能32.2 stm32 上移植方法73 lcdlcd 屏程序設(shè)計(jì)及調(diào)試屏程序設(shè)計(jì)及調(diào)試.123.1 工具概述123.2 硬件結(jié)構(gòu)133.3 c 程序設(shè)計(jì)153.4 調(diào)試16結(jié)結(jié) 語(yǔ)語(yǔ).18主要參考文獻(xiàn)主要參考文獻(xiàn).19附附 錄錄.20附錄 1 主程序代碼201 概概 述述1.1 研研究究的的目目的的及及意意義義c/os-ii是由美國(guó)工程師jean labrosse編寫(xiě)的嵌入式多任務(wù)的實(shí)時(shí)操作系統(tǒng),包括實(shí)時(shí)內(nèi)核、任務(wù)管理、時(shí)鐘管理、任務(wù)間通信同步(信號(hào)量、郵箱、消息隊(duì)列)和內(nèi)存管理。除了有上面的優(yōu)點(diǎn)外,c/
14、os-ii它具有別的操作系統(tǒng)沒(méi)有的優(yōu)點(diǎn),具體如下:(1)源代碼開(kāi)放:c/os-ii的源代碼可以免費(fèi)獲取,且標(biāo)有清晰的注釋,可讀性好。(2)可移植性好:c/os-ii的源代碼90以上是用c語(yǔ)言編寫(xiě)的,可以很容易地把它移植到各類8位、16位和32位處理器上。(3)穩(wěn)定性高:c/os-ii已得到faa的標(biāo)準(zhǔn)認(rèn)證,且目前已有上百個(gè)商業(yè)應(yīng)用實(shí)例,其穩(wěn)定性和可靠性是經(jīng)過(guò)實(shí)踐驗(yàn)證的。因此,c/os-ii廣泛的應(yīng)用于控制系統(tǒng)中,如在衍射儀高壓控制系統(tǒng)中使用c/os-ii操作系統(tǒng)是一種很好的選擇。控制系統(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)
15、單的開(kāi)發(fā)中比較適用,對(duì)于任務(wù)比較復(fù)雜的系統(tǒng)往往力不從心。對(duì)于任務(wù)較多而且復(fù)雜的情況我們就要引入實(shí)時(shí)操作系統(tǒng)rtos。rtos體現(xiàn)了一種新的應(yīng)用程序設(shè)計(jì)思想和開(kāi)放的框架,用戶在編寫(xiě)程序時(shí),可以分別編寫(xiě)各個(gè)任務(wù),不必同時(shí)將所有任務(wù)運(yùn)行的各種可能情況記在心中,大大減小了程序編寫(xiě)的工作量,而且減小了出錯(cuò)的可能,保證最終程序具有高可靠性,從而降低程序的復(fù)雜度和開(kāi)發(fā)周期。由于控制系統(tǒng)功能較復(fù)雜,諸多的功能可以劃分成許多不同的模塊,模塊之間既彼此聯(lián)系又相對(duì)獨(dú)立,可以當(dāng)作不同的任務(wù)來(lái)進(jìn)行處理。所以,使用實(shí)時(shí)操作系統(tǒng),將不同的功能劃分成不同的任務(wù)進(jìn)行處理使得設(shè)計(jì)大大簡(jiǎn)化。1.2 國(guó)國(guó)內(nèi)內(nèi)外外研研究究狀狀況況綜綜
16、述述嵌入式系統(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ù)基礎(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)的前沿性的
17、課程,可見(jiàn)基于stm32技術(shù)將是未來(lái)微控制開(kāi)發(fā)的主流方向。由于c/os-ii系統(tǒng)具有體積小、性能強(qiáng)、功耗低、可靠性高以及面向行業(yè)應(yīng)用的突出特征,目前已經(jīng)被廣泛的應(yīng)用于軍事國(guó)防、消費(fèi)電子、網(wǎng)絡(luò)通信、工業(yè)控制等各個(gè)領(lǐng)域。今天嵌入式系統(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ó)汽車大王福特公司的高級(jí)經(jīng)理也曾宣稱,“福特出售的計(jì)算能力已超過(guò)了ibm”,由此可以想見(jiàn)嵌入式計(jì)算機(jī)工業(yè)的規(guī)模和廣度。1998年11月在美
18、國(guó)加州舉行的嵌入式系統(tǒng)大會(huì)上,基于rtos的embedded internet成為一個(gè)技術(shù)新熱點(diǎn)。在國(guó)內(nèi),“維納斯計(jì)劃”和“女?huà)z計(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)用于嵌入式開(kāi)發(fā)的儀器設(shè)備更是不可勝數(shù)。在國(guó)內(nèi),雖然嵌入式應(yīng)用、開(kāi)發(fā)很廣,但該領(lǐng)域卻幾乎還是空白,只有三兩家公司和極少數(shù)人員在從事這方面工作。由此可見(jiàn),嵌入式系統(tǒng)技術(shù)發(fā)展的空間真是無(wú)比廣大。1.3 研研究究的的主主要要內(nèi)內(nèi)容容本文是在基于 32 位的 arm 微處理器 stm32 和嵌入
19、式實(shí)時(shí)操作系統(tǒng)c/os-ii 上進(jìn)行嵌入式操作系統(tǒng)的移植和功能實(shí)現(xiàn)。通過(guò)將嵌入式實(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/os-ii 的應(yīng)用設(shè)計(jì)。本文主要分為 4 章,章節(jié)安排如下: (1)緒論。主要介紹了開(kāi)題的背景和研究意義,以及 c/o
20、s-ii 的國(guó)內(nèi)外研究現(xiàn)狀。(2)c/os-ii 的理論介紹。主要介紹 c/os-ii 各模塊的基本功能和在stm32 上移植方法。(3)硬件平臺(tái)介紹及 lcd 屏程序設(shè)計(jì)及調(diào)試。多任務(wù)的建立并實(shí)現(xiàn)基本功能。(4)結(jié)語(yǔ)。主要介紹本論文中的優(yōu)點(diǎn)和不足之處。2 c/os-ii 的理論介紹的理論介紹2.1 c/os-ii 各模塊的基本功能各模塊的基本功能2.1.1 c/os-ii 內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu)(1)c/os-ii 是以源代碼形式提供的實(shí)時(shí)操作系統(tǒng)內(nèi)核,其包含的文件結(jié)構(gòu)如圖 2.1 所示:基于c/os-ii操作系統(tǒng)進(jìn)行應(yīng)用時(shí),設(shè)計(jì)時(shí)的主要任務(wù)是將系統(tǒng)合理劃分成多個(gè)任務(wù),并由rtos進(jìn)行調(diào)度,任務(wù)之
21、間使用c/os-ii提供的系統(tǒng)服務(wù)進(jìn)行應(yīng)用軟件應(yīng)用軟件(用戶代碼)(用戶代碼)c/os-ii 內(nèi)核文件內(nèi)核文件( (與處理器類型無(wú)關(guān)的代碼與處理器類型無(wú)關(guān)的代碼) )os_core.c os_task.cos_flag.c os_time.cos_mbox.c cos-ii.cos_mem.c cos-ii.hos_mutex.c os_sem.cos_q.cc/os-ii 配置文件配置文件( (與應(yīng)用程序有關(guān)與應(yīng)用程序有關(guān)) )os_cfg.hincludes.h移植移植 c/os-ii(與處理器類型有關(guān)的代碼)(與處理器類型有關(guān)的代碼)os_cpu.h os_cpu_c.c os_cpu_
22、a.asm cpu 定時(shí)器定時(shí)器圖圖 2.1 c/os-ii 內(nèi)核結(jié)內(nèi)核結(jié)構(gòu)構(gòu)軟件硬件通信,以配合實(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)用程序相關(guān)的初始化操作,例如:硬件初始化、數(shù)據(jù)結(jié)構(gòu)初始化等。 (2)osinit()初始化c/os-ii所有的變量和數(shù)據(jù)結(jié)構(gòu),并建立空閑任務(wù)os_taskidle(),這個(gè)任務(wù)總是處于就緒態(tài)。2.
23、1.2 c/os-ii 內(nèi)核體系結(jié)構(gòu)圖內(nèi)核體系結(jié)構(gòu)圖c/os-ii內(nèi)核主要對(duì)用戶任務(wù)進(jìn)行調(diào)度和管理,并為任務(wù)間共享資源提供服務(wù)。包含的模塊有任務(wù)管理、任務(wù)調(diào)度、任務(wù)間通信、時(shí)間管理、內(nèi)核初始化等。c/os-ii內(nèi)核體系結(jié)構(gòu)如圖2.2所示:圖圖 2.2 內(nèi)核結(jié)構(gòu)圖內(nèi)核結(jié)構(gòu)圖2.1.3 任務(wù)狀態(tài)及其轉(zhuǎn)換關(guān)系任務(wù)狀態(tài)及其轉(zhuǎn)換關(guān)系在多任務(wù)系統(tǒng)中,任務(wù)是設(shè)計(jì)者實(shí)現(xiàn)應(yīng)用系統(tǒng)的基本形式,也是c/os-ii系統(tǒng)進(jìn)行調(diào)度的基本單元。任務(wù)可以是一個(gè)無(wú)限的循環(huán),也可以在一次執(zhí)行后被操作系統(tǒng)刪除。任務(wù)函數(shù)和任何c函數(shù)一樣,具有一個(gè)返回類型和一個(gè)參數(shù),但是它決不返回。任務(wù)控制塊(tcb)是一個(gè)數(shù)據(jù)結(jié)構(gòu)os_tcb,一旦
24、一個(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)行。2.1.4 任務(wù)調(diào)度器任務(wù)調(diào)度器 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ù)不同:任務(wù)級(jí)的任務(wù)調(diào)度os_sched()調(diào)用了任務(wù)切換函數(shù) os_task_
25、sw(),而中斷級(jí)的調(diào)度osintext()調(diào)用了任務(wù)切換函數(shù)osintctxsw()。任務(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)用osintext()函數(shù),該函數(shù)查找就緒表發(fā)現(xiàn)有必要進(jìn)行任務(wù)切換,從而被中斷的任務(wù)進(jìn)入等待狀態(tài),運(yùn)行被激活的高優(yōu)先級(jí)的任務(wù)。(1)任務(wù)切換任務(wù)切換有兩種:os_task_sw()和osintctxsw()。任務(wù)級(jí)的任務(wù)切換os_task_sw()是宏調(diào)用,通過(guò)軟中斷指令來(lái)實(shí)現(xiàn)cpu寄
26、存器內(nèi)容切換。例如:#define os_task_sw() asm(“int #32”)。任務(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ù)。中斷級(jí)的任務(wù)切換osintctxsw()是在osintext()中調(diào)用的,我們一般在用戶isr中調(diào)用osintext()以實(shí)現(xiàn)中斷返回前的任務(wù)調(diào)度。由于isr已經(jīng)將cpu寄存器的值存入被中斷的任務(wù)的堆棧中,所以osintctxsw()的實(shí)現(xiàn)和os_task_sw()不一樣,具體參見(jiàn)移植文檔。(2)就緒表每
27、個(gè)就緒的任務(wù)都放在就緒表中,就緒表有兩個(gè)變量:osrdygrp和osrdytbl。osrdygrp中,將任務(wù)按優(yōu)先級(jí)分組,八個(gè)為一組。osrdygrp的每一位代表每組任務(wù)是否有進(jìn)入就緒態(tài)的任務(wù)。在就緒表中查找優(yōu)先級(jí)最高的任務(wù)不需要掃描整個(gè)osrdytbl,只要查優(yōu)先級(jí)判定表osunmaptbl。osunmaptbl是常量表,所以查找優(yōu)先級(jí)最高的任務(wù)的執(zhí)行時(shí)間為常量,和就緒表的任務(wù)數(shù)無(wú)關(guān)。2.1.5 中斷服務(wù)中斷服務(wù)在用戶的isr中可以調(diào)用osintenter()和osintexit()通知c/os-ii發(fā)生了中斷,這樣可以實(shí)現(xiàn)isr返回前的任務(wù)調(diào)度。2.1.6 時(shí)鐘節(jié)拍時(shí)鐘節(jié)拍c/os-ii要
28、求用戶提供一個(gè)周期性的時(shí)鐘源,來(lái)實(shí)現(xiàn)時(shí)間的延遲和超時(shí)功能,時(shí)鐘節(jié)拍應(yīng)該每秒發(fā)生10100次/秒。時(shí)鐘節(jié)拍率越高,系統(tǒng)的額外負(fù)荷就越重。應(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)的。ostimetick()跟蹤所有任務(wù)的定時(shí)器以及超時(shí)時(shí)限。2.1.7 c/os-ii 的初始化和啟動(dòng)的初始化和啟動(dòng)調(diào)用
29、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)志控制塊等數(shù)據(jù)結(jié)構(gòu)的空緩沖區(qū)。多任務(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ù)代碼。2.1.8 內(nèi)存管理內(nèi)存管理在ansi c中是使用malloc和free兩個(gè)函數(shù)來(lái)動(dòng)態(tài)分配和釋放內(nèi)存。但在嵌入式實(shí)時(shí)系統(tǒng)中,多次這樣的操作會(huì)導(dǎo)致
30、內(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í)間也是固定的。2.1.9 任務(wù)管理任務(wù)管理c/os-ii中最多可以支持64個(gè)任務(wù),分別對(duì)應(yīng)優(yōu)先級(jí)063,其中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)
31、用,包括創(chuàng)建任務(wù),刪除任務(wù),改變?nèi)蝿?wù)的優(yōu)先級(jí),任務(wù)掛起和恢復(fù)等。系統(tǒng)初始化時(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的利用率。 2.1.10 c/os-ii 任務(wù)間通信方式任務(wù)間通信方式 (1)信號(hào)量信號(hào)量由兩部分組成:一部分是16位的無(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)量
32、用于處理共享資源。(2)消息郵箱一種通信機(jī)制,可以使一個(gè)任務(wù)或者中斷服務(wù)子程序向另一個(gè)任務(wù)發(fā)送一個(gè)指針型的變量,通常該指針指向一個(gè)包含了消息的特定數(shù)據(jù)結(jié)構(gòu)。(3)消息隊(duì)列另一種通信機(jī)制,允許一個(gè)任務(wù)或者中斷服務(wù)子程序向另一個(gè)任務(wù)發(fā)送以指針?lè)绞蕉x的變量或其它任務(wù),因具體應(yīng)用不同,每個(gè)指針指向的包含了消息的數(shù)據(jù)結(jié)構(gòu)的變量類型也有所不同。2.2 stm32 上移植方法上移植方法2.2.1 平臺(tái)需求平臺(tái)需求c/os-ii的正常運(yùn)行需要處理器平臺(tái)滿足以下要求:(1)處理器的c編譯器能產(chǎn)生可重入代碼。(2)用c語(yǔ)言就可以打開(kāi)和關(guān)閉中斷。(3)處理器支持中斷,并且能產(chǎn)生定時(shí)中斷(通常在10至100hz之間
33、)。 (4)處理器支持能夠容納一定量數(shù)據(jù)(可能是幾千字節(jié))的硬件堆棧。(5)處理器有將堆棧指針和其它c(diǎn)pu寄存器讀出和存儲(chǔ)到堆棧或內(nèi)存中的指令。2.2.2 移植方法移植方法(1)內(nèi)核頭文件(os_cpu.h) 在os_cp u.h 中,主要聲明了一些與微處理器相關(guān)的常量、宏和typedef。 定義與處理器無(wú)關(guān)的數(shù)據(jù)類型 typede f unsigned char boolean; typedef unsigned char int8u; typedef signed char nt8s; typedef unsigned short int16u; typedef signed short
34、int16s; typedef unsigned int int32u; typedef signed int nt32s; typedef float fp32; typedef double fp64; typedef unsigned int os_stk; typedef unsigned int os_cpu_sr; 在stm32處理器及keil mdk 或者iar 編譯環(huán)境中可以通過(guò)查手冊(cè)得知short類型是16位而int類型是32位,這對(duì)于cortex-m3內(nèi)核是一致的。故這部分代碼無(wú)需修改。盡管c/os-ii定義了float 類型和double 類型,但為了方便移植它們?cè)赾/o
35、s-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)寄存器。 (2)臨界代碼段 c/os-ii為了保證某段代碼的完整執(zhí)行,需要臨時(shí)的關(guān)閉中斷,在這段代碼執(zhí)行完成之后再打開(kāi)中斷。這樣的代碼段稱作臨界代碼段。c/os-ii通過(guò)定義兩個(gè)宏os_enter_critical() 和os_exit_critical() 來(lái)分別實(shí)現(xiàn)中斷的關(guān)閉和打開(kāi)。一般來(lái)說(shuō),采用方法3來(lái)實(shí)現(xiàn)這兩個(gè)宏。這兩個(gè)宏分別定義如下: #de
36、fine os_critical_method 3 #define os_enter_critical() cpu_sr = os_cpu_sr_save(); #define os_exit_critical() os_cpu_sr_restore(cpu_sr); 函數(shù)os_cpu_sr_save()和os_cpu_sr_restore(cpu_sr)在os_cpu_a.asm中定義。同時(shí)得注意,在使用這兩個(gè)宏之前,必須定義os_cpu_sr cpu_sr;否則編譯時(shí)將出錯(cuò)。 (3)棧的增長(zhǎng)方向 盡管c/os-ii支持兩種方向生長(zhǎng)的棧,但對(duì)于以cortex-m3為內(nèi)核的stm32 微處理器
37、來(lái)說(shuō),它支持向下增長(zhǎng)的滿棧,故需要定義棧增長(zhǎng)方向宏為1。即定義成如下形式 #define os_stk_growth 1 (4)任務(wù)級(jí)任務(wù)切換 任務(wù)級(jí)任務(wù)切換調(diào)用宏os_task_sw()來(lái)實(shí)現(xiàn)。因?yàn)檫@個(gè)宏也是與處理器相關(guān)的,因此這個(gè)宏在os_cpu_a.asm中描述。 (5)其他函數(shù)聲明 在os_ cpu.h中,還聲明了以下幾個(gè)函數(shù),這幾個(gè)函數(shù)均在os_cpu_a.asm中實(shí)現(xiàn)。 void osctxsw(void); void osintctxsw(void); void osstarthighrdy(void); void os_cpu_pendsvhandler(void); (6)與
38、處理器相關(guān)的匯編代碼(os_cpu_a.asm)在os_cp u_a.asm中實(shí)現(xiàn)的是下面五個(gè)與處理器相關(guān)的函數(shù)。 os_cpu_sr_save(); os_cpu_sr_restore(); osstarthighrdy(); osctxsw(); osintctxsw(); 2.3.3 函數(shù)實(shí)現(xiàn)函數(shù)實(shí)現(xiàn) (1)關(guān)中斷函數(shù)(os_cpu_sr_save()) 即先保存當(dāng)前的狀態(tài)寄存器然后關(guān)中斷。故關(guān)中斷實(shí)現(xiàn)代碼如下 os_cpu_sr_save mrs r0, primask; cpsid i bx lr 這也是宏os_enter_critical() 的最終實(shí)現(xiàn)。 (2)恢復(fù)中斷函數(shù)(os
39、_cpu_sr_restore()) 這是宏os_exit_critical()的最終實(shí)現(xiàn)。也就是將狀態(tài)寄存器的內(nèi)容從r0中恢復(fù),然后跳轉(zhuǎn)回去。此函數(shù)完成的將中斷狀態(tài)恢復(fù)到關(guān)中斷前的狀態(tài)。其代碼如下: os_cpu_sr_restore msr primask, r0 bx lr cortex-m3處理器有單獨(dú)的指令來(lái)打開(kāi)或者關(guān)閉中斷,所以這兩個(gè)函數(shù)實(shí)現(xiàn)起來(lái)很簡(jiǎn)單。 (3)啟動(dòng)最高優(yōu)先級(jí)任務(wù)運(yùn)行(osstarthighrdy()) osstart()調(diào)用osstarthighrdy()來(lái)啟動(dòng)最高優(yōu)先級(jí)任務(wù)的運(yùn)行,從而啟動(dòng)整個(gè)系統(tǒng)。osstarthighrdy()主要完成以下幾項(xiàng)工作: 為任務(wù)切
40、換設(shè)置pendsv的優(yōu)先級(jí); 為第一次任務(wù)切換設(shè)置棧指針為0; 設(shè)置osrunning = true,以表明系統(tǒng)正在運(yùn)行; 觸發(fā)一次pendsv,打開(kāi)中斷等待第一次任務(wù)的切換。 (4)任務(wù)級(jí)和中斷級(jí)任務(wù)切換 因?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ù)的堆棧指針賦值給微處理器的堆棧指針,這樣就可以退
41、出中斷服務(wù)程序了。中斷服務(wù)程序退出的時(shí)候?qū)⒆詣?dòng)出棧r3-r0,r12,lr,pc和xpsr。具體的pendsv服務(wù)程序的偽代碼如下: os_cpu_pendsvhandler : / 進(jìn)入異常,處理器自動(dòng)保存r3-r0,r12,lr,pc和xpsr if (psp != null) /判斷不是開(kāi)始第一次任務(wù) 保存r4-r11到任務(wù)的堆棧; ostcbcur-ostcbstkptr = sp; /保存堆棧的指針到任務(wù)控制塊 ostaskswhook(); /實(shí)現(xiàn)用戶擴(kuò)展功能而定義的鉤子 ospriocur = ospriohighrdy; /設(shè)置運(yùn)行任務(wù)為最高優(yōu)先級(jí)就緒任務(wù) ostcbcur =
42、 ostcbhighrdy; / 設(shè)置運(yùn)行的任務(wù)控制塊為最高 /就緒任控制塊務(wù) psp = ostcbhighrdy-ostcbstkptr;/將要切換的任務(wù)堆棧指 / 針賦給微處理器的堆棧指 / 針從而實(shí)現(xiàn)切換 從堆棧中恢復(fù) r4-r11; 從異常中返回; / 退出異常,處理器自動(dòng)恢復(fù)r3-r0,r12,lr,pc和xpsr 這樣很容易寫(xiě)出pendsv中斷服務(wù)程序的代碼了。 (5)與cpu 相關(guān)的c 函數(shù)和鉤子函數(shù)(os_cpu_c.c ) 這個(gè)文件中包含10個(gè)函數(shù),具體如下: osinithookbegin (); osinithookend (); ostaskcreatehook ()
43、; ostaskdelhook (); ostaskidlehook (); ostaskstathook (); ostaskstkinit (); ostaskswhook (); ostcbinithook (); ostimetickhook (); 這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ù)的棧空間寫(xiě)入初
44、值。這個(gè)初值無(wú)關(guān)緊要,為0就可以了。這個(gè)函數(shù)的代碼時(shí)下如下: os_stk *ostaskstkinit (void (*task)(void *pd), void *p_arg, os_stk *ptos, int16u opt) os_stk *stk; (void)opt; /防止編譯器報(bào)錯(cuò) stk = ptos; / 將棧頂?shù)刂焚x值給棧指針變量 / 以進(jìn)入異常的順序來(lái)給棧賦初值 *(stk) = (int32u)0 x00000000l; /xpsr *(-stk) = (int32u)task; /entry point *(-stk) = (int32u)0 x00000000l;
45、 / r14 (lr) *(-stk) = (int32u)0 x00000000l; /r12 *(-stk) = (int32u)0 x00000000l; /r3 *(-stk) = (int32u)0 x00000000l; / r2 *(-stk) = (int32u)0 x00000000l; / r1 *(-stk) = (int32u)p_arg; /r0 : 傳遞的參數(shù) / 剩下的寄存器初始化 *(-stk) = (int32u)0 x00000000l; / r11 *(-stk) = (int32u)0 x00000000l; /r10 *(-stk) = (int32u
46、)0 x00000000l; / r9 *(-stk) = (int32u)0 x00000000l; /r8 *(-stk) = (int32u)0 x00000000l; /r7 *(-stk) = (int32u)0 x00000000l; / r6 *(-stk) = (int32u)0 x00000000l; / r5 *(-stk) = (int32u)0 x00000000l; / r4 return (stk); 其他的鉤子函數(shù)都為空函數(shù)。這樣,整個(gè)移植的代碼就介紹完了。整個(gè)移植的過(guò)程非常容易。剩下的工作就是編寫(xiě)用戶任務(wù),并在開(kāi)發(fā)板上驗(yàn)證,以此來(lái)驗(yàn)證該移植方案是可行的和成功的。
47、3 lcd 屏程序設(shè)計(jì)及調(diào)試屏程序設(shè)計(jì)及調(diào)試3.1 工具概述工具概述rvmdk 源自德國(guó)的 keil 公司,是 realview mdk 的簡(jiǎn)稱。realview mdk 集成了業(yè)內(nèi)最領(lǐng)先的技術(shù),支持 arm7、arm9 和 cortex-m3 核處理器,自動(dòng)配置啟動(dòng)代碼,集成 flash 燒寫(xiě)模塊,強(qiáng)大的 simulation 設(shè)備模塊,性能分析等功能。3.1.1 keil4 工程建立以及仿真方法工程建立以及仿真方法(1)新建工程。打開(kāi) mdk 軟件,選擇 projectnew uvision project 菜單項(xiàng),新建一個(gè)文件夾名為“畢業(yè)設(shè)計(jì)”,保存,則彈出器件選擇對(duì)話框,這里選擇 st
48、m32f103rb。單擊“ok”按鈕,則彈出一個(gè)對(duì)話框加載啟動(dòng)文件到工程中。打開(kāi)“畢業(yè)設(shè)計(jì)”文件夾,在里面添加子文件夾(2)添加系統(tǒng)文件與工程管理。回到“畢業(yè)設(shè)計(jì)”文件夾中,把系統(tǒng) system 文件夾(delay,sys,usart 文件夾)復(fù)制過(guò)來(lái),再建立 main 和 hardware 文件夾用于主函數(shù)和各外設(shè)資源函數(shù)。回到工程中,點(diǎn)擊 manage components,添加工程中的文件,進(jìn)行分類管理工程。(3)最后新建 main 文件,在編輯區(qū)寫(xiě)代碼。3.1.2 硬件平臺(tái)紹硬件平臺(tái)紹alientek ministm32 選擇的是 stm32f103rbt6 作為mcu,stm32f1
49、03 的型號(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à)格,所以我們選擇了它作為我們的主芯片。boot1 用于設(shè)置 stm32 的啟動(dòng)方式,其對(duì)應(yīng)啟動(dòng)模式如表 3.1 所示:表表 3.1 boot0、boot1 啟動(dòng)模式表啟動(dòng)模式表boot0boot1啟動(dòng)模式說(shuō)明0x用戶閃存存儲(chǔ)器用戶閃存存儲(chǔ)器,也就是 flas
50、h 啟動(dòng)10系統(tǒng)存儲(chǔ)器系統(tǒng)存儲(chǔ)器啟動(dòng),用于串口下載11sram 啟動(dòng)sram 啟動(dòng),用于在 sram 中調(diào)試代碼按照表 3.1,一般情況下如果我們想用用串口下載代碼,則必須配置boot0 為 1,boot1 為 0,而如果想讓 stm32 一按復(fù)位鍵就開(kāi)始跑代碼,則需要配置 boot0 為 0,boot1 隨便設(shè)置都可以。alientek 這款開(kāi)發(fā)板專門設(shè)計(jì)了一鍵下載電路,通過(guò)串口的 dtr 和 rts 信號(hào),來(lái)自動(dòng)配置 boot0 和 boot1,因此不需要用戶來(lái)手動(dòng)切換他們的狀態(tài),直接串口下載和軟件自動(dòng)控制,可以非常方便的下載代碼。 p3 和 p1 分別用于 porta 和 portb 的
51、 io 口引出,其中 p2 還有部分用于 portc 口的引出。porta 和 portb 都是按順序排列的,這樣設(shè)計(jì)的目的是為了讓大家更方便地與外部設(shè)備連接。p2 連接了 ds18b20 的數(shù)據(jù)口以及紅外傳感器的數(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口連接了 pl2
52、303 的串口輸出,對(duì)應(yīng)著 stm32 的串口 1(pa9/pa10) ,在使用的時(shí)候,也是通過(guò)跳線帽將這兩處連接起來(lái)。這樣設(shè)計(jì)有 2 個(gè)好處:1,使得 pa9 和 pa10 用作其他用途。使用的時(shí)候,不受到 pl2303 的影響。2,usb 轉(zhuǎn)串口可以用作他用,并不僅限在這個(gè)板上的 stm32 使用,也可以連接到其他板子上,這樣 alienek ministm32 就相當(dāng)于一個(gè) usb 串口。p5 口是另外一個(gè) io 引出排陣,將portc 和 portd 等的剩余 io 口從這里引出。 在此部分原理圖中,我們還可以看到 stm32f103rbt6 的各個(gè) io 口與外設(shè)的連接關(guān)系,這些將在
53、后面給大家介紹。 這里 stm32 的 vbat 采用cr1220 紐扣電池和 vcc3.3 混合供電的方式,在有外部電源(vcc3.3)的時(shí)候,cr1220 不給 vbat 供電,而在外部電源斷開(kāi)的時(shí)候,則由 cr1220 給vbat 供電。這樣,vbat 總是有電的,以保證 rtc 的走時(shí)以及后備寄存器的內(nèi)容不丟失。3.2 硬件結(jié)構(gòu)硬件結(jié)構(gòu)3.2.1 stm32 最小系統(tǒng)最小系統(tǒng)stm32f103 最小系統(tǒng)包括電源電路,復(fù)位電路,時(shí)鐘電路,主芯片和下載接口。stm32f103 使用 3.3v 供電,且引腳接有濾波電容,保證芯片工作穩(wěn)定;復(fù)位電路使用的低電平復(fù)位,該電路上電可以復(fù)位,按鍵按下
54、時(shí)也可以復(fù)位;時(shí)鐘電路使用 8mhz晶振,和 22pf 電容助振。圖圖 3.1 最小系統(tǒng)最小系統(tǒng)3.2.2 lcd 接口接口顯示電路使用的是 2.4 寸的 tft 液晶顯示器,該顯示器有 16 位的數(shù)據(jù)口和5 位的控制端口。圖圖 3.2 液晶顯示液晶顯示3.2.3 led 接口接口輸入單元和指示部分,直接引到 stm32f103 的 io 口。圖圖 3.3 按鍵和按鍵和 led 燈燈3.2.4 紅處接收電路紅處接收電路hs0038 用于顯度的采集,其通信是單總線式,直接與 stm32f103 相連。圖圖 3.4 紅處接收單元紅處接收單元3.3 c 程序設(shè)計(jì)程序設(shè)計(jì)在c/os-ii里面創(chuàng)建6個(gè)任
55、務(wù):開(kāi)始任務(wù)、led0、led1、觸摸屏,key按鍵任務(wù)和lcd顯示任務(wù),開(kāi)始任務(wù)用于創(chuàng)建其他(led0、led1、紅處接收、按鍵和lcd顯示)任務(wù),之后掛起;led0任務(wù)用于控制ds0的亮滅,ds0每秒鐘亮800ms;led1任務(wù)用于控制ds1的亮滅,ds1亮300ms,滅300ms,依次循環(huán);觸摸屏任務(wù)用于手寫(xiě)輸入,并立即顯示;lcd顯示任務(wù)用于顯示圖形,和接收紅外信號(hào)信息顯示出來(lái);key按鍵任務(wù)分別使屏進(jìn)入校準(zhǔn)功能,以及顯示歡迎界面。 首先,建立基本的工程后,在該工程源碼下面加入c/os-ii文件夾,存放c/os-ii源碼(我們已經(jīng)將c/os-ii源碼分為三個(gè)文件夾:core、port和
56、config) 。打開(kāi)工程,新建c/os-ii-core、c/os-ii -port和c/os-ii -config三個(gè)分組,分別添加c/os-ii三個(gè)文件夾下的源碼,并將這三個(gè)文件夾加入頭文件包含路徑。c/os-ii-core分組下面是c/os-ii的核心源碼,我們不需要做任何變動(dòng)。 c/os-ii-port分組下面是我們移植c/os-ii要修改的3個(gè)代碼,這個(gè)在移植的時(shí)候完成。 c/os-ii-config分組下面是c/os-ii的配置部分,主要由用戶根據(jù)自己的需要對(duì)c/os-ii進(jìn)行裁剪或其他設(shè)置。工程框架如下圖3.5:其次,對(duì) os_cfg.h 里面定義 os_ticks_per_se
57、c 的值為 200,也就是設(shè)置c/os-ii 的時(shí)鐘節(jié)拍為 5ms,同時(shí)設(shè)置 os_max_tasks 為 10,也就是最多10 個(gè)任務(wù)(包括空閑任務(wù)和統(tǒng)計(jì)任務(wù)在內(nèi))。再次,在 main.c 文件中設(shè)置任務(wù)堆棧大小、設(shè)置任務(wù)優(yōu)先級(jí)、任務(wù)堆棧,創(chuàng)建 5 個(gè)任務(wù)。如圖 3.5 所示:圖圖 3.5 任務(wù)結(jié)構(gòu)任務(wù)結(jié)構(gòu)3.4 調(diào)試調(diào)試3.4.1 設(shè)置編譯環(huán)境設(shè)置編譯環(huán)境(1)打開(kāi) project 菜單,選擇 options for target“畢業(yè)設(shè)計(jì)”對(duì)話框,如圖3.6 在 target 中,將晶振選為 8mhz;在 output 中,將 creat hex file 復(fù)選框選中。為調(diào)試方便,將產(chǎn)生
58、調(diào)試中間信息的復(fù)選框也選中。圖圖 3.6 編譯環(huán)境窗口編譯環(huán)境窗口(2)在 c/c+中,將各分文件的路徑加入如圖 3.7 圖圖 3.7 路徑添加路徑添加(3)在 debug 中,將 use 選中并設(shè)置為 cortex-m/r j-link/j-trace,設(shè)為jink 連接實(shí)物仿真了。(4)在 utilities 中,設(shè)置如圖 3.8,并打開(kāi) settings,設(shè)置 flash 為 256kb。圖圖 3.8 utilities3.4.2 調(diào)試結(jié)果調(diào)試結(jié)果編譯程序,排出 error 和 warning,如圖 3.9 得到正確的程序,下載程序到開(kāi)發(fā)板上,得到了預(yù)期結(jié)果圖圖 3.9 編譯結(jié)果編譯結(jié)果
59、將程序下載到開(kāi)發(fā)板上,并觀察現(xiàn)象,led 小燈按程序要求正常運(yùn)行,紅外接收器正確顯示數(shù)值,按鍵 key0 可實(shí)現(xiàn)進(jìn)入校準(zhǔn)功能,key1 可以顯示歡迎界面,key2 可以清除,說(shuō)明程序正確。現(xiàn)象如圖 3.10圖圖 3.10 實(shí)物現(xiàn)象實(shí)物現(xiàn)象結(jié)結(jié) 語(yǔ)語(yǔ)本文完成基于 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ì) c/os-ii 時(shí)間管理函數(shù),任務(wù)管理函數(shù)的靈活應(yīng)用。認(rèn)真掌握 cortex-m3 的硬件
60、結(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ì)思想,具有代表性。另一方面,它又是一個(gè)相對(duì)完整的系統(tǒng),可以應(yīng)用于工業(yè)控制的各個(gè)顯示終端,完成指示功能。由于實(shí)時(shí)操作系統(tǒng)內(nèi)核 c/os-ii 是為嵌入式應(yīng)用編寫(xiě)的通用軟件,所以不得不強(qiáng)調(diào)處理器的通用性和功能的全面性。在實(shí)際應(yīng)用中可以根據(jù)需要裁減和優(yōu)化。其次,本文
溫馨提示
- 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ù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業(yè)園區(qū)的消防安全管理體系
- 36項(xiàng)護(hù)理管理制度
- ai能耗管理制度
- 標(biāo)準(zhǔn)農(nóng)貿(mào)市場(chǎng)管理制度
- 校內(nèi)作業(yè)公示管理制度
- 校園上學(xué)放學(xué)管理制度
- 校園兼職代理管理制度
- 校園思想陣地管理制度
- 校園校車安全管理制度
- 校園藍(lán)牙車輛管理制度
- 通信傳輸線路整治修繕項(xiàng)目施工組織方案
- 急診護(hù)理質(zhì)量評(píng)價(jià)標(biāo)準(zhǔn)
- 稻香+課件音樂(lè)
- 包裝標(biāo)準(zhǔn)規(guī)范要求
- 貿(mào)易安全內(nèi)部培訓(xùn)教材
- 開(kāi)辦課程申請(qǐng)書(shū)
- 卡壓不銹鋼管的施工方案
- 人工智能訓(xùn)練師技能考核內(nèi)容結(jié)構(gòu)表
- 《機(jī)械制圖》全套教學(xué)課件
- 幼兒園中班數(shù)學(xué)活動(dòng)課件:有趣的排序
- JB∕T 13026-2017 熱處理用油基淬火介質(zhì)
評(píng)論
0/150
提交評(píng)論