嵌入式系統(tǒng)綜合設(shè)計(jì)實(shí)習(xí)_第1頁(yè)
嵌入式系統(tǒng)綜合設(shè)計(jì)實(shí)習(xí)_第2頁(yè)
嵌入式系統(tǒng)綜合設(shè)計(jì)實(shí)習(xí)_第3頁(yè)
嵌入式系統(tǒng)綜合設(shè)計(jì)實(shí)習(xí)_第4頁(yè)
嵌入式系統(tǒng)綜合設(shè)計(jì)實(shí)習(xí)_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

嵌入式系統(tǒng)綜合設(shè)計(jì)實(shí)習(xí)題目:串口通訊實(shí)現(xiàn)單片機(jī)播放視頻班級(jí):學(xué)號(hào):姓名:組員:指導(dǎo)老師:

目錄1引言2嵌入式系統(tǒng)2.1嵌入式系統(tǒng)概述2.2嵌入式操作系統(tǒng)3IAP15F2K61S2硬件平臺(tái)4μC/OS-II操作系統(tǒng)5基于IAP15F2K61S2單片機(jī)的μC/OS-II移植5.1修改OS_CPU.H文件5.2修改OS_CPU_C.C文件5.3修改OS_CPU_A.ASM文件5.4修改OS_CFG.H文件5.5修改STARTUP.ASM文件6μC/OS-II應(yīng)用程序設(shè)計(jì)7系統(tǒng)調(diào)試8總結(jié)9參考文獻(xiàn)10附錄

1、引言嵌入式操作系統(tǒng)近年來(lái)備受人們的關(guān)注,其開(kāi)發(fā)出來(lái)的產(chǎn)品應(yīng)用到生活的各個(gè)角落,隨著嵌入式技術(shù)的發(fā)展前景日益廣闊,相信會(huì)有更多的嵌入式操作系統(tǒng)軟件出現(xiàn)。uC/OS-II作為嵌入式操作系統(tǒng)的一種,它以高可靠性、穩(wěn)定性和實(shí)時(shí)性占有著一定的嵌入式系統(tǒng)市場(chǎng)。其結(jié)構(gòu)簡(jiǎn)潔,可剪裁,移植性強(qiáng),源代碼開(kāi)放。而STC15系列單片機(jī)加密性強(qiáng),低功耗,超低價(jià),高速,高可靠,強(qiáng)抗靜電,強(qiáng)抗干擾等特點(diǎn),占有51系列單片機(jī)一定的市場(chǎng)。本次課題是移植C/OS-II到IAP15F2K61S2單片機(jī)上,并且設(shè)計(jì)一個(gè)程序利用串口通信來(lái)使IAP15F2K61S2單片機(jī)實(shí)現(xiàn)播放視頻。2、嵌入式系統(tǒng)2.1嵌入式系統(tǒng)概述嵌入式系統(tǒng)(Embeddedsystem),是一種“完全嵌入受控器件內(nèi)部,為特定應(yīng)用而設(shè)計(jì)的專(zhuān)用計(jì)算機(jī)系統(tǒng)”,根據(jù)英國(guó)電氣工程師協(xié)會(huì)(U.K.InstitutionofElectricalEngineer)的定義,嵌入式系統(tǒng)為控制、監(jiān)視或輔助設(shè)備、機(jī)器或用于工廠運(yùn)作的設(shè)備。與個(gè)人計(jì)算機(jī)這樣的通用計(jì)算機(jī)系統(tǒng)不同,嵌入式系統(tǒng)通常執(zhí)行的是帶有特定要求的預(yù)先定義的任務(wù)。由于嵌入式系統(tǒng)只針對(duì)一項(xiàng)特殊的任務(wù),設(shè)計(jì)人員能夠?qū)λM(jìn)行優(yōu)化,減小尺寸降低成本。嵌入式系統(tǒng)是用來(lái)控制或者監(jiān)視機(jī)器、裝置、工廠等大規(guī)模設(shè)備的系統(tǒng)。國(guó)內(nèi)普遍認(rèn)同的嵌入式系統(tǒng)定義為:以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟硬件可裁剪,適應(yīng)應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積、功耗等嚴(yán)格要求的專(zhuān)用計(jì)算機(jī)系統(tǒng)。通常,嵌入式系統(tǒng)是一個(gè)控制程序存儲(chǔ)在ROM中的嵌入式處理器控制板。事實(shí)上,所有帶有數(shù)字接口的設(shè)備,如手表、微波爐、錄像機(jī)、汽車(chē)等,都使用嵌入式系統(tǒng),有些嵌入式系統(tǒng)還包含操作系統(tǒng),但大多數(shù)嵌入式系統(tǒng)都是由單個(gè)程序?qū)崿F(xiàn)整個(gè)控制邏輯。2.2嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)(EmbeddedOperatingSystem,簡(jiǎn)稱(chēng):EOS)是指用于嵌入式系統(tǒng)的操作系統(tǒng)。嵌入式操作系統(tǒng)是一種用途廣泛的系統(tǒng)軟件,通常包括與硬件相關(guān)的底層驅(qū)動(dòng)軟件、系統(tǒng)內(nèi)核、設(shè)備驅(qū)動(dòng)接口、通信協(xié)議、圖形界面、標(biāo)準(zhǔn)化瀏覽器等。嵌入式操作系統(tǒng)負(fù)責(zé)嵌入式系統(tǒng)的全部軟、硬件資源的分配、任務(wù)調(diào)度,控制、協(xié)調(diào)并發(fā)活動(dòng)。它必須體現(xiàn)其所在系統(tǒng)的特征,能夠通過(guò)裝卸某些模塊來(lái)達(dá)到系統(tǒng)所要求的功能。目前在嵌入式領(lǐng)域廣泛使用的操作系統(tǒng)有:嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II、嵌入式Linux、WindowsEmbedded、VxWorks等,以及應(yīng)用在智能手機(jī)和平板電腦的Android、iOS等。嵌入式操作系統(tǒng)應(yīng)用廣泛,其中的uC/OS-II嵌入式實(shí)時(shí)操作系統(tǒng)以高可靠性、穩(wěn)定性和實(shí)時(shí)性占有著一定的嵌入式系統(tǒng)市場(chǎng)。由于其結(jié)構(gòu)簡(jiǎn)潔,可剪裁,移植性強(qiáng),源代碼開(kāi)放,故非常適合初次接觸嵌入式實(shí)時(shí)操作系統(tǒng)的人員進(jìn)行學(xué)習(xí)[1]。3、IAP15F2K61S2硬件平臺(tái)芯片使用宏晶公司最新STC15系列IAP15F2K61S2芯片。ISP/IAP在系統(tǒng)可編程/在應(yīng)用可編程,無(wú)需編程器,無(wú)需仿真器。增強(qiáng)型8051CPU,1T,單時(shí)鐘/機(jī)器周期,速度比普通8051快8-12倍。61K字節(jié)片內(nèi)片內(nèi)Flash程序存儲(chǔ)器,擦寫(xiě)次數(shù)10萬(wàn)次以上。片內(nèi)大容量2048字節(jié)的SRAM。大容量片內(nèi)EEPROM,擦寫(xiě)次數(shù)10萬(wàn)次數(shù)以上。共8通道10位高速ADC,速度可達(dá)30萬(wàn)次/秒,3路PWM還可當(dāng)3路D/A使用。共3通道捕獲/比較單元(CCP/PWM/PCA)。內(nèi)部高可靠復(fù)位,8級(jí)可選復(fù)位門(mén)檻電壓,徹底省掉外部復(fù)位電路。內(nèi)部高精度R/C時(shí)鐘,內(nèi)部時(shí)鐘從5MHz~35MHz可選,相當(dāng)于普通8051的60MHz~420MHz。兩組高速異步串行通信端口(可同時(shí)使用),可在5組管腳之間進(jìn)行切換,分時(shí)復(fù)用可當(dāng)5組串口使用。一組高速異步串行通信端口SPI[2]。IAP15F2K61S2系統(tǒng)板特點(diǎn):1)、保險(xiǎn)電路:自動(dòng)保險(xiǎn)絲,防止電流過(guò)大,損壞內(nèi)部單片機(jī)電路。2)、USB下載電路:CH340T下載芯片,一條USB線就可以實(shí)現(xiàn)供電、下載、串口通訊,方便穩(wěn)定。3)、自動(dòng)冷啟動(dòng)電路:板子持續(xù)使用自動(dòng)冷啟動(dòng)電路,不用來(lái)回?fù)軇?dòng)開(kāi)關(guān)上電,下載方便,增加了開(kāi)關(guān)的使用率。4)1602/12864接口電路:可以直接插接液晶模塊,方便穩(wěn)定[3]。4、μC/OS-II操作系統(tǒng)μC/OS-II的前身是μC/OS,最早出自于1992年美國(guó)嵌入式系統(tǒng)專(zhuān)家JeanJ.Labrosse在《嵌入式系統(tǒng)編程》雜志的5月和6月刊上刊登的文章連載,并把μC/OS的源碼發(fā)布在該雜志的BBS上。μC/OS和μC/OS-II是專(zhuān)門(mén)為計(jì)算機(jī)的嵌入式應(yīng)用設(shè)計(jì)的,絕大部分代碼是用C語(yǔ)言編寫(xiě)的。CPU硬件相關(guān)部分是用匯編語(yǔ)言編寫(xiě)的、總量約200行的匯編語(yǔ)言部分被壓縮到最低限度,為的是便于移植到任何一種其它的CPU上。用戶(hù)只要有標(biāo)準(zhǔn)的ANSI的C交叉編譯器,有匯編器、連接器等軟件工具,就可以將μC/OS-II嵌人到開(kāi)發(fā)的產(chǎn)品中。μC/OS-II具有執(zhí)行效率高、占用空間小、實(shí)時(shí)性能優(yōu)良和可擴(kuò)展性強(qiáng)等特點(diǎn),最小內(nèi)核可編譯至2KB。μC/OS-II已經(jīng)移植到了幾乎所有知名的CPU上。嚴(yán)格地說(shuō)uC/OS-II只是一個(gè)實(shí)時(shí)操作系統(tǒng)內(nèi)核,它僅僅包含了任務(wù)調(diào)度,任務(wù)管理,時(shí)間管理,內(nèi)存管理和任務(wù)間的通信和同步等基本功能。沒(méi)有提供輸入輸出管理,文件系統(tǒng),網(wǎng)絡(luò)等額外的服務(wù)。但由于uC/OS-II良好的可擴(kuò)展性和源碼開(kāi)放,這些非必須的功能完全可以由用戶(hù)自己根據(jù)需要分別實(shí)現(xiàn)。uC/OS-II目標(biāo)是實(shí)現(xiàn)一個(gè)基于優(yōu)先級(jí)調(diào)度的搶占式的實(shí)時(shí)內(nèi)核,并在這個(gè)內(nèi)核之上提供最基本的系統(tǒng)服務(wù),如信號(hào)量,郵箱,消息隊(duì)列,內(nèi)存管理,中斷管理等。μC/OS-II可以大致分成核心、任務(wù)處理、時(shí)間處理、任務(wù)同步與通信,CPU的移植等5個(gè)部分。1)核心部分(OSCore.c)是操作系統(tǒng)的處理核心,包括操作系統(tǒng)初始化、操作系統(tǒng)運(yùn)行、中斷進(jìn)出的前導(dǎo)、時(shí)鐘節(jié)拍、任務(wù)調(diào)度、事件處理等多部分。能夠維持系統(tǒng)基本工作的部分都在這里。2)任務(wù)處理部分(OSTask.c)任務(wù)處理部分中的內(nèi)容都是與任務(wù)的操作密切相關(guān)的。包括任務(wù)的建立、刪除、掛起、恢復(fù)等等。因?yàn)棣藽/OS-II是以任務(wù)為基本單位調(diào)度的,所以這部分內(nèi)容也相當(dāng)重要。3)時(shí)鐘部分(OSTime.c)μC/OS-II中的最小時(shí)鐘單位是timetick(時(shí)鐘節(jié)拍)。任務(wù)延時(shí)等操作是在這里完成的。4)任務(wù)同步和通信部分為事件處理部分,包括信號(hào)量、郵箱、郵箱隊(duì)列、事件標(biāo)志等部分;主要用于任務(wù)間的互相聯(lián)系和對(duì)臨界資源的訪問(wèn)。5)與CPU的接口部分是指μC/OS-II針對(duì)所使用的CPU的移植部分。由于μC/OS-II是一個(gè)通用性的操作系統(tǒng),所以對(duì)于關(guān)鍵問(wèn)題上的實(shí)現(xiàn),還是需要根據(jù)具體CPU的具體內(nèi)容和要求作相應(yīng)的移植。這部分內(nèi)容由于牽涉到SP等系統(tǒng)指針,所以通常用匯編語(yǔ)言編寫(xiě)。主要包括中斷級(jí)任務(wù)切換的底層實(shí)現(xiàn)、任務(wù)級(jí)任務(wù)切換的底層實(shí)現(xiàn)、時(shí)鐘節(jié)拍的產(chǎn)生和處理、中斷的相關(guān)處理部分等內(nèi)容[4]。5、基于IAP15F2K61S2單片機(jī)的μC/OS-II移植所謂移植,就是使一個(gè)實(shí)時(shí)內(nèi)核能在某個(gè)微處理器或微控制器上運(yùn)行。為了方便移植,大部分的μC/OS-Ⅱ代碼是用C語(yǔ)言寫(xiě)的;但仍需要用C和匯編語(yǔ)言寫(xiě)一些與處理器相關(guān)的代碼,這是因?yàn)棣藽/OS-Ⅱ在讀寫(xiě)處理器寄存器時(shí)只能通過(guò)匯編語(yǔ)言來(lái)實(shí)現(xiàn)。由于μC/OS-Ⅱ在設(shè)計(jì)時(shí)就已經(jīng)充分考慮了可移植性,所以μC/OS-Ⅱ的移植相對(duì)來(lái)說(shuō)是比較容易的[5]。μC/OS系統(tǒng)移植主要是要修改與處理器相關(guān)的文件:OS_CPU.H,OS_CPU_C.C,OS_CPU_A.ASM。由于是在keilC51下編譯因此還需要將不需要的功能刪減掉,因此還需要修改OS_CFG.H文件。在這些文件中OS_CPU.H的內(nèi)容是相關(guān)的數(shù)據(jù)類(lèi)型、關(guān)中斷、任務(wù)堆棧方向、任務(wù)切換宏定義等。OS_CPU_C.C主要是關(guān)于OSTaskStkInit()函數(shù)和系統(tǒng)中斷定時(shí)器的編寫(xiě)。OS_CFG.H這個(gè)文件系統(tǒng)中相關(guān)功能的配置文件,如果要用到郵箱,信號(hào)等功能,都要在這個(gè)頭文件中把相關(guān)宏設(shè)置為1。5.1、修改OS_CPU.H文件首先修改的是OS_CPU.H文件,根據(jù)IAP15F2K61S2單片機(jī)的信息這是一個(gè)16位處理器,并且堆棧為8bit,因此關(guān)于數(shù)據(jù)類(lèi)型應(yīng)該修改為以下這樣:typedefunsignedcharBOOLEAN;typedefunsignedcharINT8U;/*無(wú)符號(hào)8位數(shù)*/typedefsignedcharINT8S;/*有符號(hào)8位數(shù)*/typedefunsignedintINT16U;/*無(wú)符號(hào)16位數(shù)*/typedefsignedintINT16S;/*有符號(hào)16位數(shù)*/typedefunsignedlongINT32U;/*無(wú)符號(hào)32位數(shù)*/typedefsignedlongINT32S;/*有符號(hào)32位數(shù)*/typedeffloatFP32;/*單精度浮點(diǎn)數(shù)*/typedefdoubleFP64;/*雙精度浮點(diǎn)數(shù)*/typedefunsignedcharOS_STK;/*棧單元寬度為8比特*/μC/OS-Ⅱ代碼從不使用C的short,int和long等數(shù)據(jù)類(lèi)型,因?yàn)樗鼈兪桥c編譯器相關(guān)的,不可移植。相反的,INT16U、INT16S這些都是可移植而且很直觀的數(shù)據(jù)類(lèi)型,例如INT16U數(shù)據(jù)類(lèi)型總是代表16位的無(wú)符號(hào)整數(shù)。在移植過(guò)程中不同的處理器有不同字長(zhǎng),例如在16位處理器上unsignedint代表的是16位無(wú)符號(hào)整型,但是在32位處理器上unsignedint確實(shí)代表32位無(wú)符號(hào)整型。因此在移植過(guò)程中就需要對(duì)這些數(shù)據(jù)類(lèi)型進(jìn)行相應(yīng)的修改。用戶(hù)必須將任務(wù)堆棧的數(shù)據(jù)類(lèi)型告訴給μC/OS-Ⅱ。這個(gè)過(guò)程是通過(guò)OS_STK聲明正確的C數(shù)據(jù)類(lèi)型來(lái)完成的。如果用戶(hù)的處理器上的堆棧成員是8位的,并且用戶(hù)的編譯文件指定字符型為8位數(shù),那么就應(yīng)該將OS_STK聲明位無(wú)符號(hào)字符型數(shù)據(jù)類(lèi)型。所有的任務(wù)堆棧都必須用OS_STK來(lái)聲明數(shù)據(jù)類(lèi)型。定義好數(shù)據(jù)類(lèi)型后,還有兩點(diǎn)需要定義好。一是堆棧的成長(zhǎng)方向,如果是由下往上成長(zhǎng)則OS_STK_GROWTH置0,如果是由上往下成長(zhǎng)則OS_STK_GROWTH置1。二是關(guān)于中斷的設(shè)置,與所有的實(shí)時(shí)內(nèi)核一樣,μC/OS-Ⅱ需要先禁止中斷再訪問(wèn)代碼的臨界段,并且在訪問(wèn)完畢后重新允許中斷。這就使得μC/OS-Ⅱ能夠保護(hù)臨界段代碼免受多任務(wù)或中斷服務(wù)例程的破壞。這次使用的IAP15F2K61S2單片機(jī)堆棧成長(zhǎng)方式為由下往上成長(zhǎng),而中斷允許總控位為EA,EA=0表示關(guān)所有中斷,EA=1表示開(kāi)所有中斷。因此相應(yīng)代碼修改如下:#defineOS_ENTER_CRITICAL()EA=0/*關(guān)中斷*/#defineOS_EXIT_CRITICAL()EA=1/*開(kāi)中斷*/#defineOS_STK_GROWTH0/*STC-15堆棧從下往上增長(zhǎng)1=向下,0=向上*/最后,由于IAP15F2K61S2單片機(jī)是沒(méi)有軟中斷指令的,因此任務(wù)切換宏OS_TASK_SW()的定義如下:#defineOS_TASK_SW()OSCtxSw() /*因?yàn)闆](méi)有軟中斷指令,所以用程序調(diào)用代替。*/5.2、修改OS_CPU_C.C文件接下來(lái)是修改OS_CPU_C.C文件,這個(gè)文件要求用戶(hù)編寫(xiě)六個(gè)簡(jiǎn)單的C函數(shù):OSTaskStkInit()、OSTaskCreateHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook()、OSTimeTickHook(),其中只需修改任務(wù)堆棧初始化函數(shù)OSTaskStkInit(),其它函數(shù)是對(duì)系統(tǒng)內(nèi)核擴(kuò)展時(shí)用的,必須聲明但沒(méi)必要包含代碼。用戶(hù)堆棧初始化時(shí)從下向上依次保存:硬件棧大小15,即兩個(gè)任務(wù)返回地址和13個(gè)寄存器、任務(wù)的地址低8位和高8位以及13個(gè)寄存器。不用保存SP,任務(wù)切換時(shí)根據(jù)用戶(hù)堆棧長(zhǎng)度計(jì)算得出。相應(yīng)的代碼編寫(xiě)如下:voidDT_XDATA*OSTaskStkInit(void(DT_CODE*task)(voidDT_XDATA*pd),voidDT_XDATA*ppdata,voidDT_XDATA*ptos,INT16Uopt)REENTRANT{OS_STKDT_XDATA*stk;ppdata=ppdata; opt=opt;stk=(OS_STKDT_XDATA*)ptos;/*ptos指向的為用戶(hù)棧的棧底,向上生長(zhǎng),依次存儲(chǔ)*/*stk++=(0xFF+1);/*仿真棧棧頂指針C_IBP*/ /*simulatedstacksize==0*/*stk++=2+13; /*硬件棧大小15,兩個(gè)任務(wù)返回地址和13個(gè)寄存器*/*stk++=(INT16U)task&0xFF;/*任務(wù)地址低8位 */*stk++=(INT16U)task>>8; /*任務(wù)地址高8位*/*stk++=0x0A;/*ACC */*stk++=0x0B;/*B */*stk++=0xD1;/*DPH */*stk++=0xD0;/*DPL */*stk++=0x00;/*PSW */*stk++=0x00;/*R0 */*stk++=0x01;/*R1 */*stk++=0x02;/*R2 */*stk++=0x03;/*R3 */*stk++=0x04;/*R4 */*stk++=0x05;/*R5 */*stk++=0x06;/*R6 */*stk++=0x07;/*R7 */return((voidDT_XDATA*)ptos); /*notereturnptos,notstk*/}另外5個(gè)函數(shù)為鉤掛函數(shù),在需要添加附加功能時(shí)可以編寫(xiě)相應(yīng)的代碼。μC/OS-II中每個(gè)任務(wù)都有自己的任務(wù)堆棧,在任務(wù)創(chuàng)建初期由函數(shù)OSTaskStkInit()初始化。任務(wù)堆棧中保存了任務(wù)代碼的起始地址和一些與CPU寄存器相關(guān)的內(nèi)容,這樣一旦滿(mǎn)足任務(wù)的運(yùn)行條件就可以從起始的狀態(tài)“無(wú)縫”地執(zhí)行該任務(wù)。除此之外還要編寫(xiě)一個(gè)時(shí)鐘節(jié)拍中斷函數(shù)OSTickISR(),將其定義為定時(shí)器0中斷函數(shù),具體代碼如下:voidOSTickISR()interrupt1/*定時(shí)器0中斷函數(shù)*/{ TL0=TIMER_24M_25MS_L; TH0=TIMER_24M_25MS_H; OSIntEnter(); OSTimeTick(); /*維持操作系統(tǒng)內(nèi)部的時(shí)鐘*/ OSIntExit(); /*使高優(yōu)先級(jí)的任務(wù)就緒*/}5.3、修改OS_CPU_A.ASM文件接下來(lái)是修改OS_CPU_A.ASM文件,這里需要改寫(xiě)四個(gè)匯編語(yǔ)言函數(shù):OSStartHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickISR()。其中OSStartHighRdy()功能為使就緒態(tài)任務(wù)中優(yōu)先級(jí)最高的任務(wù)開(kāi)始運(yùn)行,即獲取當(dāng)前就緒的最高優(yōu)先級(jí)任務(wù)的堆棧指針。OSCtxSw()功能為完成任務(wù)級(jí)切換。先保存當(dāng)前任務(wù)堆棧的內(nèi)容,然后恢復(fù)最高優(yōu)先級(jí)任務(wù)的系統(tǒng)堆棧。OSIntCtxSw()功能為完成中斷級(jí)切換,該函數(shù)由OSIntExit()調(diào)用。在調(diào)用函數(shù)OSIntCtxSw()之前,已經(jīng)保存了被終止運(yùn)行程序相關(guān)寄存器的值到中斷的任務(wù)堆棧中,此處只需恢復(fù)待運(yùn)行任務(wù)的系統(tǒng)堆棧。OSTickISR()功能是為系統(tǒng)提供一個(gè)時(shí)鐘源,實(shí)現(xiàn)時(shí)間的延遲和超時(shí)功能,該函數(shù)已在OS_CPU_C.C中定義具體實(shí)現(xiàn)方法。關(guān)于OS_CPU_A.ASM文件的內(nèi)容詳情見(jiàn)附錄。5.4、修改OS_CFG.H文件為了盡可能地縮短代碼的大小,因此除必要功能外將其他的功能屏蔽掉,其中需要屏蔽的功能有:OS_TASK_STAT_EN、OS_MBOX_EN、OS_MEM_EN、OS_Q_EN、OS_SEM_EN、OS_TASK_CHANGE_PRIO_EN、OS_TASK_CREATE_EXT_EN、OS_TASK_DEL_EN、OS_TASK_SUSPEND_EN。即:#defineXXXX0//XXXX為需要屏蔽的功能具體代碼如下:#defineOS_CPU_HOOKS_EN1/*為1時(shí),使用系統(tǒng)提供的函數(shù)*/#defineOS_TASK_STAT_EN0/*統(tǒng)計(jì)任務(wù)使能,不需要設(shè)為0*/#defineOS_MBOX_EN0/*設(shè)置為0,禁止產(chǎn)生郵箱代碼*/#defineOS_MEM_EN0/*設(shè)置為0,禁止產(chǎn)生內(nèi)存關(guān)系代碼*/#defineOS_Q_EN0/*設(shè)置為0,禁止使用消息隊(duì)列*/#defineOS_SEM_EN0/*設(shè)置為0,禁止使用信號(hào)量功能*/#defineOS_TASK_CHANGE_PRIO_EN0#defineOS_TASK_CREATE_EN1#defineOS_TASK_CREATE_EXT_EN0#defineOS_TASK_DEL_EN0#defineOS_TASK_SUSPEND_EN0另外,將最大任務(wù)數(shù)修改為5,為以后擴(kuò)展任務(wù)預(yù)留空間,即:#defineOS_MAX_TASKS5修改任務(wù)最低優(yōu)先級(jí)為20,即:#defineOS_LOWEST_PRIO20因?yàn)槎〞r(shí)器設(shè)定為20毫秒,所以修改系統(tǒng)時(shí)鐘節(jié)拍為50:#defineOS_TICKS_PER_SEC505.5、修改STARTUP.ASM文件設(shè)置小模式仿真棧允許,即設(shè)置IBPSTACK為1;設(shè)置小模式下的仿真棧的棧頂指針為0xFF+1。6、μC/OS-II應(yīng)用程序設(shè)計(jì)這次實(shí)習(xí)的程序設(shè)計(jì)我們小組是打算通過(guò)串口通訊連續(xù)發(fā)送圖片實(shí)現(xiàn)播放視頻的功能,其中我主要是負(fù)責(zé)12864顯示模塊的程序編寫(xiě)。通過(guò)查詢(xún)12864的中文手冊(cè),我發(fā)現(xiàn)12864顯示圖形時(shí)水平方向X是以字節(jié)為單位,而垂直方向Y是以位為單位。12864顯示時(shí)將屏幕分為上下兩部分,上部分由左往右分為0X80~0X87八個(gè)塊,其中每個(gè)塊是兩個(gè)字節(jié),由上往下分為0~31行;而下部分由左往右分為0X88~0X8F八個(gè)塊,其中每個(gè)塊是兩個(gè)字節(jié),由上往下分為0~31行。下圖為12864顯示時(shí)的坐標(biāo)定義因此當(dāng)把圖片寫(xiě)進(jìn)12864時(shí),需要將上下兩部分分開(kāi)寫(xiě),而且每一行寫(xiě)16個(gè)字節(jié),具體代碼如下:voidlcdwpic(char*pic_addr){ chari,j;for(i=0;i<32;i++)//上部分寫(xiě)圖片 { lcdwc(0x80+i);//先寫(xiě)入垂直坐標(biāo)值 lcdwc(0x80);//寫(xiě)入水平坐標(biāo)值 for(j=0;j<16;j++)//再寫(xiě)入16字節(jié)的數(shù)據(jù) lcdwd(*pic_addr++); }for(i=0;i<32;i++)//下部分寫(xiě)圖片 { lcdwc(0x80+i);//先寫(xiě)入垂直坐標(biāo)值 lcdwc(0x88);//寫(xiě)入水平坐標(biāo)值 for(j=0;j<16;j++)//再寫(xiě)入16字節(jié)的數(shù)據(jù) lcdwd(*pic_addr++);}}另外由于需要傳輸很多張圖片進(jìn)行顯示,因此需要定義一個(gè)可以修改數(shù)據(jù)的數(shù)組來(lái)充當(dāng)圖片的臨時(shí)存放數(shù)組,因?yàn)樾枰@示的圖片是128*64分辨率,每一張圖片是1024字節(jié),所以數(shù)組大小為1024。即:ucharxdatapictmp[1024]={0};因?yàn)橐粡垐D片是1024字節(jié),因此需要讓pictmp[]數(shù)組存滿(mǎn)才將圖片顯示出來(lái),所以定義一個(gè)計(jì)數(shù)的變量當(dāng)傳完1024字節(jié)在調(diào)用寫(xiě)圖片函數(shù),而且存數(shù)據(jù)進(jìn)pictmp[]中時(shí)需要先將串口中斷關(guān)閉,具體代碼如下:voidISP_Check(unsignedchartmp){ ES=0; pictmp[count]= tmp; count++; if(count==1024) { count=0; lcdwpic(pictmp); } ES=1;}因?yàn)槭谴谕ㄓ?,所以編?xiě)一個(gè)串行中斷函數(shù)用來(lái)處理數(shù)據(jù)的接收,函數(shù)中定義一個(gè)變量負(fù)責(zé)將SBUF寄存器中的數(shù)據(jù)取出,并且將數(shù)據(jù)存進(jìn)圖片臨時(shí)存放數(shù)組pictmp[],具體代碼如下:voidSerial_int(void)interrupt4using1 /*函數(shù)為串行中斷,使用寄存器組1*/{ unsignedchartmp; if(RI){tmp=SBUF; ISP_Check(tmp);RI=0;}}本次串口通訊需要在晶振為11.0592MHz,波特率為115200bps下執(zhí)行,因此需要定義一個(gè)初始化函數(shù)設(shè)定波特率并且將串口中斷以及總中斷打開(kāi),代碼如下:voidUartInit(void) //115200bps@11.0592MHz{ PCON&=0x7F; //波特率不倍速 SCON=0x50; //8位數(shù)據(jù),可變波特率 AUXR|=0x40; //定時(shí)器1時(shí)鐘為Fosc,即1T AUXR&=0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器 TMOD&=0x0F; //清除定時(shí)器1模式位 TMOD|=0x20; //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式 TL1=0xFD; //設(shè)定定時(shí)初值 TH1=0xFD; //設(shè)定定時(shí)器重裝值 ET1=0; //禁止定時(shí)器1中斷 TR1=1; //啟動(dòng)定時(shí)器1 ES=1; //開(kāi)串口中斷 EA=1; //開(kāi)總中斷}7、系統(tǒng)調(diào)試關(guān)于μC/OS-II系統(tǒng)經(jīng)過(guò)編寫(xiě)兩個(gè)小任務(wù)測(cè)試可以正常運(yùn)行,但是串口通訊顯示視頻程序經(jīng)同組人員測(cè)試,由于程序?qū)崟r(shí)性過(guò)高加到μC/OS-II系統(tǒng)后無(wú)法正常運(yùn)行,經(jīng)過(guò)與老師商量決定放棄將程序加進(jìn)μC/OS-II系統(tǒng)當(dāng)中,串口通訊程序直接單獨(dú)運(yùn)行。關(guān)于程序中的12864顯示模塊,一開(kāi)始是直接使用同組人員編寫(xiě)的匯編接口,但是經(jīng)測(cè)試發(fā)現(xiàn)寫(xiě)圖片速度太快,12864顯示屏的速度無(wú)法跟上造成顯示錯(cuò)誤,因此決定用C語(yǔ)言編寫(xiě)寫(xiě)圖片函數(shù)。重新編寫(xiě)的寫(xiě)圖片函數(shù),一開(kāi)始每次寫(xiě)圖片都是先關(guān)閉圖形顯示,寫(xiě)完后才打開(kāi)圖形顯示,但是經(jīng)調(diào)試發(fā)現(xiàn)這樣子會(huì)出現(xiàn)閃屏,初步推斷是由于頻繁開(kāi)關(guān)圖形顯示造成,后面將寫(xiě)圖片程序中的開(kāi)關(guān)圖形顯示命令去除發(fā)現(xiàn)問(wèn)題解決。8、總結(jié)經(jīng)過(guò)這三個(gè)星期的實(shí)習(xí),我學(xué)習(xí)到了μC/OS-II是一個(gè)什么樣的系統(tǒng),也了解了如何將μC/OS-II移植到單片機(jī)當(dāng)中,雖然后面程序無(wú)法加到系統(tǒng)當(dāng)中有些可惜,但是還是學(xué)到了很多東西。另外對(duì)于12864顯示屏也有了進(jìn)一步的認(rèn)識(shí),對(duì)于12864是怎么顯示的也有了更詳細(xì)的了解。這次實(shí)習(xí)不僅讓我學(xué)到了很多東西,還讓我學(xué)會(huì)了通過(guò)與組員的溝通討論來(lái)解決遇到的問(wèn)題。參考文獻(xiàn)[1]劉偉偉,魏同宇,孫衛(wèi)兵.μC/OS-II在單片STC89系列單片機(jī)上的移植實(shí)現(xiàn)[2]IAP15F2K61S2系列單片機(jī)器件手冊(cè).宏晶公司[3]康燕萍.實(shí)習(xí)指導(dǎo)書(shū)[4]百度百科ucosii詞條[5]嵌入式實(shí)時(shí)操作系統(tǒng)uCOS-II.邵貝貝譯

附錄:OS_CPU_A.ASM NAME OS_CPU_A; ==========================================; ------------------SEGMENT--------------; ========================================== ?PR?OSStartHighRdy?OS_CPU_A SEGMENTCODE ?PR?OSCtxSw?OS_CPU_A SEGMENTCODE ?PR?OSIntCtxSw?OS_CPU_A SEGMENT CODE; ===========================================; ------------------EXTRN------------------; =========================================== EXTRNXDATA (OSTCBHighRdy) EXTRNXDATA (OSTCBCur) EXTRNXDATA (OSPrioCur)EXTRNXDATA (OSPrioHighRdy) EXTRNXDATA (OSRunning) EXTRNDATA (?C_IBP) EXTRNCODE (_?OSTaskSwHook); ===========================================; ------------------PUBLIC-----------------; =========================================== PUBLIC OSStartHighRdy PUBLIC OSCtxSw PUBLIC OSIntCtxSw; ===========================================; ------------------STACK------------------; ===========================================;TheSEGMENT?STACKwillcombinedwillstackdefinedinstartup.asm ?STACKSEGMENTIDATARSEG?STACKStkBottom:; ===========================================; ------------------FUNCTIONS--------------; ===========================================; -------------------------------------------; --------------OSStartHighRdy()-----------; ------------------------------------------- RSEG?PR?OSStartHighRdy?OS_CPU_AOSStartHighRdy:;-----------------;OSRunning=TURE;-----------------;becauseEAisnotenabled.whereinOSStartHighRdysetOSRunningtotrueisnotimportant MOV DPH,#HIGH(OSRunning) MOV DPL,#LOW(OSRunning) MOV A,#1 MOVX @DPTR,A;-----------------;TR0=1;----------------- SETB TR0OSCPUARstStk:;-----------------;GetOSTCBHighRdy->OSTCBStkPtrtoDPTR;-----------------;highbyteisatlowaddress;MoveOSTCBHighRdytodptr MOV DPH,#HIGH(OSTCBHighRdy) MOV DPL,#LOW(OSTCBHighRdy) MOVX A,@DPTR MOV R0,A INC DPTR MOVX A,@DPTR MOV DPH,R0 MOV DPL,A;MoveOSTCBStkPtrtodptr MOVX A,@DPTR MOV R0,A INC DPTR MOVX A,@DPTR MOV DPH,R0 MOV DPL,A;-----------------;restorestack;-----------------;restore?C_IBP MOVX A,@DPTR MOV ?C_IBP,A;restoresimulatedstack JZ OSCPUASmltRstOver ;simulatedstacksize==0,thatis?C_IBP==0x100 DEC A ;LetR0pointto?C_IBP-1 MOV R0,A CPL A ;caculatecopyrotationtimes,storeinR1 MOV R1,AOSCPUASmltRstStk: INC R0 INC DPTR MOVX A,@DPTR MOV @R0,A DJNZ R1,OSCPUASmltRstStkOSCPUASmltRstOver:;restoresp,sp=#stkBottom-1+"Hardwarestacksize". INC DPTR MOVX A,@DPTR ;nowhardwarestacksizeisstoredinA MOV R0,#StkBottom-1 ;startofhardwarestackdefinedbykeilcsystem MOV R1,A ;storerotationtimesinR1 ADD A,R0 ;sp MOV SP,A;restorehardwarestack;stacktopisathighaddress;HardStkwillneverbeemptyOSCPUARstHardStk: INC R0 INC DPTR MOVX A,@DPTR MOV @R0,A DJNZ R1,OSCPUARstHardStk;restoreregisters POP 07 POP 06 POP 05 POP 04 POP 03 POP 02 POP 01 POP 00 POP PSW POP DPL POP DPH POP B POP ACC ;AisregisterbutACCisdirectram SETB EA ;afterstart,enableEA RETI; --------------------------------------------------; ---------------------OSCtxSw()------------------; -------------------------------------------------- RSEG?PR?OSCtxSw?OS_CPU_AOSCtxSw:;-----------------;pushregisters;----------------- PUSH ACC PUSH B PUSH DPH PUSH DPL PUSH PSW PUSH 00 PUSH 01 PUSH 02 PUSH 03 PUSH 04 PUSH 05 PUSH 06 PUSH 07OSCPUAUniformCtxSw:;assumeregisterispushedtohardwarestack,intheformatasdiscriptedatthebeginningofthisfile;BeforejumpOSCPUAUniformCtxSw,OSCtxSworOSIntCtxSwmustfirstpushregisterstohardwarestackasthisformat.;----------------------;GetOSTCBCurRdy->OSTCBStkPtrtoDPTR;-----------------------;highbyteisatlowaddress;OSTCBCurRdytodptr MOV DPH,#HIGH(OSTCBCur) MOV DPL,#LOW(OSTCBCur) MOVX A,@DPTR MOV R0,A INC DPTR MOVX A,@DPTR MOV DPH,R0 MOV DPL,A;OSTCBStkPtrtodptr MOVX A,@DPTR MOV

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論