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

下載本文檔

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

文檔簡介

嵌入式系統(tǒng)綜合設(shè)計實習(xí)題目:串口通訊實現(xiàn)單片機播放視頻班級:學(xué)號:姓名:組員:指導(dǎo)老師:目錄引言嵌入式系統(tǒng)2.1 嵌入式系統(tǒng)概述2.2 嵌入式操作系統(tǒng)IAP15F2K61S2硬件平臺μC/OS-II操作系統(tǒng)基于IAP15F2K61S2單片機的μ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文件μC/OS-II應(yīng)用程序設(shè)計系統(tǒng)調(diào)試總結(jié)參考文獻附錄1、引言嵌入式操作系統(tǒng)近年來備受人們的關(guān)注, 其開發(fā)出來的產(chǎn)品應(yīng)用到生活的各個角落,隨著嵌入式技術(shù)的發(fā)展前景日益廣闊, 相信會有更多的嵌入式操作系統(tǒng)軟件出現(xiàn)。uC/OS-II 作為嵌入式操作系統(tǒng)的一種,它以高可靠性、穩(wěn)定性和實時性占有著一定的嵌入式系統(tǒng)市場。其結(jié)構(gòu)簡潔,可剪裁,移植性強,源代碼開放。而STC15系列單片機加密性強,低功耗,超低價,高速,高可靠,強抗靜電,強抗干擾等特點,占有51系列單片機一定的市場。本次課題是移植 C/OS-II到IAP15F2K61S2單片機上,并且設(shè)計一個程序利用串口通信來使IAP15F2K61S2單片機實現(xiàn)播放視頻。2、嵌入式系統(tǒng)2.1嵌入式系統(tǒng)概述嵌入式系統(tǒng)(Embeddedsystem),是一種“完全嵌入受控器件內(nèi)部,為特定應(yīng)用而設(shè)計的專用計算機系統(tǒng)”,根據(jù)英國電氣工程師協(xié)會(U.K.InstitutionofElectricalEngineer)的定義,嵌入式系統(tǒng)為控制、監(jiān)視或輔助設(shè)備、機器或用于工廠運作的設(shè)備。與個人計算機這樣的通用計算機系統(tǒng)不同,嵌入式系統(tǒng)通常執(zhí)行的是帶有特定要求的預(yù)先定義的任務(wù)。由于嵌入式系統(tǒng)只針對一項特殊的任務(wù),設(shè)計人員能夠?qū)λM行優(yōu)化,減小尺寸降低成本。嵌入式系統(tǒng)是用來控制或者監(jiān)視機器、裝置、工廠等大規(guī)模設(shè)備的系統(tǒng)。國內(nèi)普遍認(rèn)同的嵌入式系統(tǒng)定義為:以應(yīng)用為中心,以計算機技術(shù)為基礎(chǔ),軟硬件可裁剪,適應(yīng)應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗等嚴(yán)格要求的專用計算機系統(tǒng)。通常,嵌入式系統(tǒng)是一個控制程序存儲在ROM中的嵌入式處理器控制板。事實上,所有帶有數(shù)字接口的設(shè)備,如手表、微波爐、錄像機、汽車等,都使用嵌入式系統(tǒng),有些嵌入式系統(tǒng)還包含操作系統(tǒng),但大多數(shù)嵌入式系統(tǒng)都是由單個程序?qū)崿F(xiàn)整個控制邏輯。2.2嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)(EmbeddedOperatingSystem,簡稱:EOS)是指用于嵌入式系統(tǒng)的操作系統(tǒng)。嵌入式操作系統(tǒng)是一種用途廣泛的系統(tǒng)軟件,通常包括與硬件相關(guān)的底層驅(qū)動軟件、系統(tǒng)內(nèi)核、設(shè)備驅(qū)動接口、通信協(xié)議、圖形界面、標(biāo)準(zhǔn)化瀏覽器等。嵌入式操作系統(tǒng)負(fù)責(zé)嵌入式系統(tǒng)的全部軟、硬件資源的分配、任務(wù)調(diào)度,控制、協(xié)調(diào)并發(fā)活動。它必須體現(xiàn)其所在系統(tǒng)的特征,能夠通過裝卸某些模塊來達到系統(tǒng)所要求的功能。目前在嵌入式領(lǐng)域廣泛使用的操作系統(tǒng)有:嵌入式實時操作系統(tǒng)μC/OS-II、嵌入式Linux、WindowsEmbedded、VxWorks等,以及應(yīng)用在智能手機和平板電腦的Android、iOS等。嵌入式操作系統(tǒng)應(yīng)用廣泛,其中的uC/OS-II嵌入式實時操作系統(tǒng)以高可靠性、穩(wěn)定性和實時性占有著一定的嵌入式系統(tǒng)市場。由于其結(jié)構(gòu)簡潔,可剪裁,移植性強,源代碼開放,故非常適合初次接觸嵌入式實時操作系統(tǒng)的人員進行學(xué)習(xí)[1]。3、IAP15F2K61S2硬件平臺芯片使用宏晶公司最新STC15系列IAP15F2K61S2芯片。ISP/IAP在系統(tǒng)可編程/在應(yīng)用可編程,無需編程器,無需仿真器。增強型8051CPU,1T,單時鐘/機器周期,速度比普通8051快8-12倍。61K字節(jié)片內(nèi)片內(nèi)Flash程序存儲器,擦寫次數(shù)10萬次以上。片內(nèi)大容量2048字節(jié)的SRAM。大容量片內(nèi)EEPROM,擦寫次數(shù)10萬次數(shù)以上。共8通道10位高速ADC,速度可達30萬次/秒,3路PWM還可當(dāng)3路D/A使用。共3通道捕獲/比較單元(CCP/PWM/PCA)。內(nèi)部高可靠復(fù)位,8級可選復(fù)位門檻電壓,徹底省掉外部復(fù)位電路。內(nèi)部高精度R/C時鐘,內(nèi)部時鐘從5MHz~35MHz可選,相當(dāng)于普通8051的60MHz~420MHz。兩組高速異步串行通信端口(可同時使用),可在5組管腳之間進行切換,分時復(fù)用可當(dāng)5組串口使用。一組高速異步串行通信端口SPI[2]。IAP15F2K61S2系統(tǒng)板特點:1)、保險電路:自動保險絲,防止電流過大,損壞內(nèi)部單片機電路。2)、USB下載電路:CH340T下載芯片,一條USB線就可以實現(xiàn)供電、下載、串口通訊,方便穩(wěn)定。3)、自動冷啟動電路:板子持續(xù)使用自動冷啟動電路,不用來回?fù)軇娱_關(guān)上電,下載方便,增加了開關(guān)的使用率。4)1602/12864接口電路:可以直接插接液晶模塊,方便穩(wěn)定 [3]。4、μC/OS-II 操作系統(tǒng)μC/OS-II的前身是μC/OS,最早出自于1992年美國嵌入式系統(tǒng)專家JeanJ.Labrosse在《嵌入式系統(tǒng)編程》雜志的5月和6月刊上刊登的文章連載,并把μC/OS的源碼發(fā)布在該雜志的BBS上。μC/OS和μC/OS-II是專門為計算機的嵌入式應(yīng)用設(shè)計的,絕大部分代碼是用C語言編寫的。CPU硬件相關(guān)部分是用匯編語言編寫的、總量約200行的匯編語言部分被壓縮到最低限度,為的是便于移植到任何一種其它的CPU上。用戶只要有標(biāo)準(zhǔn)的ANSI的C交叉編譯器,有匯編器、連接器等軟件工具,就可以將μC/OS-II嵌人到開發(fā)的產(chǎn)品中。μC/OS-II具有執(zhí)行效率高、占用空間小、實時性能優(yōu)良和可擴展性強等特點,最小內(nèi)核可編譯至2KB。μC/OS-II已經(jīng)移植到了幾乎所有知名的CPU上。嚴(yán)格地說uC/OS-II只是一個實時操作系統(tǒng)內(nèi)核,它僅僅包含了任務(wù)調(diào)度,任務(wù)管理,時間管理,內(nèi)存管理和任務(wù)間的通信和同步等基本功能。沒有提供輸入輸出管理,文件系統(tǒng),網(wǎng)絡(luò)等額外的服務(wù)。但由于uC/OS-II良好的可擴展性和源碼開放,這些非必須的功能完全可以由用戶自己根據(jù)需要分別實現(xiàn)。uC/OS-II目標(biāo)是實現(xiàn)一個基于優(yōu)先級調(diào)度的搶占式的實時內(nèi)核,并在這個內(nèi)核之上提供最基本的系統(tǒng)服務(wù),如信號量,郵箱,消息隊列,內(nèi)存管理,中斷管理等。μC/OS-II可以大致分成核心、任務(wù)處理、時間處理、任務(wù)同步與通信,CPU的移植等5個部分。1)核心部分(OSCore.c)是操作系統(tǒng)的處理核心,包括操作系統(tǒng)初始化、操作系統(tǒng)運行、中斷進出的前導(dǎo)、時鐘節(jié)拍、任務(wù)調(diào)度、事件處理等多部分。能夠維持系統(tǒng)基本工作的部分都在這里。任務(wù)處理部分(OSTask.c)任務(wù)處理部分中的內(nèi)容都是與任務(wù)的操作密切相關(guān)的。包括任務(wù)的建立、刪除、掛起、恢復(fù)等等。因為μC/OS-II是以任務(wù)為基本單位調(diào)度的,所以這部分內(nèi)容也相當(dāng)重要。3)時鐘部分(OSTime.c)[4]。μC/OS-II中的最小時鐘單位是timetick(時鐘節(jié)拍)。任務(wù)延時等操作是在這里完成的。任務(wù)同步和通信部分為事件處理部分,包括信號量、郵箱、郵箱隊列、事件標(biāo)志等部分;主要用于任務(wù)間的互相聯(lián)系和對臨界資源的訪問。與CPU的接口部分是指μC/OS-II針對所使用的CPU的移植部分。由于μC/OS-II是一個通用性的操作系統(tǒng),所以對于關(guān)鍵問題上的實現(xiàn),還是需要根據(jù)具體CPU的具體內(nèi)容和要求作相應(yīng)的移植。這部分內(nèi)容由于牽涉到SP等系統(tǒng)指針,所以通常用匯編語言編寫。主要包括中斷級任務(wù)切換的底層實現(xiàn)、任務(wù)級任務(wù)切換的底層實現(xiàn)、時鐘節(jié)拍的產(chǎn)生和處理、中斷的相關(guān)處理部分等內(nèi)容5、基于IAP15F2K61S2單片機的μC/OS-II 移植所謂移植,就是使一個實時內(nèi)核能在某個微處理器或微控制器上運行。為了方便移植,大部分的μC/OS-Ⅱ代碼是用C語言寫的;但仍需要用C和匯編語言寫一些與處理器相關(guān)的代碼,這是因為μC/OS-Ⅱ在讀寫處理器寄存器時只能通過匯編語言來實現(xiàn)。由于μC/OS-Ⅱ在設(shè)計時就已經(jīng)充分考慮了可移植性,所以μC/OS-Ⅱ的移植相對來說是比較容易的[5]。μC/OS系統(tǒng)移植主要是要修改與處理器相關(guān)的文件:OS_CPU.,HOS_CPU_C,.COS_CPU_A.ASM。由于是在keilC51下編譯因此還需要將不需要的功能刪減掉,因此還需要修改OS_CFG.H文件。在這些文件中OS_CPU.H的內(nèi)容是相關(guān)的數(shù)據(jù)類型、關(guān)中斷、任務(wù)堆棧方向、任務(wù)切換宏定義等。OS_CPU_C.主C要是關(guān)于OSTaskStkInit()函數(shù)和系統(tǒng)中斷定時器的編寫。OS_CFG.H這個文件系統(tǒng)中相關(guān)功能的配置文件,如果要用到郵箱,信號等功能,都要在這個頭文件中把相關(guān)宏設(shè)置為 1。5.1、修改OS_CPU.H文件首先修改的是OS_CPU.H文件,根據(jù)IAP15F2K61S2單片機的信息這是一個16位處理器,并且堆棧為 8bit,因此關(guān)于數(shù)據(jù)類型應(yīng)該修改為以下這樣:typedefunsignedcharBOOLEAN;typedefunsignedcharINT8U;/*無符號8位數(shù)*/typedefsignedcharINT8S;/*有符號8位數(shù)*/typedefunsignedintINT16U;/*無符號16位數(shù)*/typedefsignedintINT16S;/*有符號16位數(shù)*/typedefunsignedlongINT32U;/*無符號32位數(shù)*/typedefsignedlongINT32S;/*有符號32位數(shù)*/typedeffloatFP32;/*單精度浮點數(shù)*/typedefdoubleFP64;/*雙精度浮點數(shù)*/typedef unsignedchar OS_STK; /* 棧單元寬度為8比特*/μC/OS-Ⅱ代碼從不使用 C的short,int 和long等數(shù)據(jù)類型,因為它們是與編譯器相關(guān)的,不可移植。相反的, INT16U、INT16S這些都是可移植而且很直觀的數(shù)據(jù)類型,例如INT16U數(shù)據(jù)類型總是代表16位的無符號整數(shù)。在移植過程中不同的處理器有不同字長,例如在16位處理器上unsignedint代表的是16位無符號整型,但是在32位處理器上unsignedint確實代表32位無符號整型。因此在移植過程中就需要對這些數(shù)據(jù)類型進行相應(yīng)的修改。用戶必須將任務(wù)堆棧的數(shù)據(jù)類型告訴給 μC/OS-Ⅱ。這個過程是通過 OS_STK聲明正確的C數(shù)據(jù)類型來完成的。如果用戶的處理器上的堆棧成員是 8位的,并且用戶的編譯文件指定字符型為 8位數(shù),那么就應(yīng)該將OS_STK聲明位無符號字符型數(shù)據(jù)類型。所有的任務(wù)堆棧都必須用 OS_STK來聲明數(shù)據(jù)類型。定義好數(shù)據(jù)類型后,還有兩點需要定義好。一是堆棧的成長方向,如果是由下往上成長則OS_STK_GROWTH置0,如果是由上往下成長則 OS_STK_GROWTH置1。二是關(guān)于中斷的設(shè)置,與所有的實時內(nèi)核一樣, μC/OS-Ⅱ需要先禁止中斷再訪問代碼的臨界段,并且在訪問完畢后重新允許中斷。這就使得 μC/OS-Ⅱ能夠保護臨界段代碼免受多任務(wù)或中斷服務(wù)例程的破壞。這次使用的 IAP15F2K61S2單片機堆棧成長方式為由下往上成長,而中斷允許總控位為 EA,EA=0表示關(guān)所有中斷,EA=1表示開所有中斷。因此相應(yīng)代碼修改如下:#defineOS_ENTER_CRITICAL()EA=0 /*#defineOS_EXIT_CRITICAL() EA=1 /*#defineOS_STK_GROWTH0/*STC-15堆棧從下往上增長

關(guān)中斷*/開中斷*/1=向下,0=向上*/最后,由于IAP15F2K61S2單片機是沒有軟中斷指令的,因此任務(wù)切換宏OS_TASK_SW()的定義如下:#defineOS_TASK_SW()OSCtxSw()/*因為沒有軟中斷指令,所以用程序調(diào)用代替。*/5.2、修改OS_CPU_C.文C件接下來是修改OS_CPU_C.文C件,這個文件要求用戶編寫六個簡單的C函數(shù):OSTaskStkInit()、OSTaskCreateHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook()、OSTimeTickHook(),其中只需修改任務(wù)堆棧初始化函數(shù)OSTaskStkInit(),其它函數(shù)是對系統(tǒng)內(nèi)核擴展時用的,必須聲明但沒必要包含代碼。用戶堆棧初始化時從下向上依次保存:硬件棧大小15,即兩個任務(wù)返回地址和13個寄存器、任務(wù)的地址低8位和高8位以及13個寄存器。不用保存SP,任務(wù)切換時根據(jù)用戶堆棧長度計算得出。相應(yīng)的代碼編寫如下: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指向的為用戶棧的棧底,向上生長,依次存儲*/*stk++=(0xFF+1);/*仿真棧棧頂指針C_IBP*//*simulatedstacksize==0*/*stk++=2+13;/*硬件棧大小15,兩個任務(wù)返回地址和13個寄存器*/*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個函數(shù)為鉤掛函數(shù),在需要添加附加功能時可以編寫相應(yīng)的代碼。μC/OS-II中每個任務(wù)都有自己的任務(wù)堆棧,在任務(wù)創(chuàng)建初期由函數(shù)OSTaskStkInit()初始化。任務(wù)堆棧中保存了任務(wù)代碼的起始地址和一些與CPU寄存器相關(guān)的內(nèi)容,這樣一旦滿足任務(wù)的運行條件就可以從起始的狀態(tài)“無縫”地執(zhí)行該任務(wù)。除此之外還要編寫一個時鐘節(jié)拍中斷函數(shù)0中斷函數(shù),具體代碼如下:voidOSTickISR()interrupt1/* 定時器{

OSTickISR(),將其定義為定時器0中斷函數(shù)*/TL0=TIMER_24M_25MS_L;TH0=TIMER_24M_25MS_H;OSIntEnter();OSTimeTick(); /*維持操作系統(tǒng)內(nèi)部的時鐘OSIntExit(); /*使高優(yōu)先級的任務(wù)就緒

*/*/}5.3、修改OS_CPU_A.ASM文件接下來是修改OS_CPU_A.ASM文件,這里需要改寫四個匯編語言函數(shù):OSStartHighRdy() ,OSCtxSw(),OSIntCtxSw(),OSTickISR()。其中OSStartHighRdy()功能為使就緒態(tài)任務(wù)中優(yōu)先級最高的任務(wù)開始運行,即獲取當(dāng)前就緒的最高優(yōu)先級任務(wù)的堆棧指針。OSCtxSw()功能為完成任務(wù)級切換。先保存當(dāng)前任務(wù)堆棧的內(nèi)容,然后恢復(fù)最高優(yōu)先級任務(wù)的系統(tǒng)堆棧。OSIntCtxSw()功能為完成中斷級切換,該函數(shù)由OSIntExit()調(diào)用。在調(diào)用函數(shù)OSIntCtxSw()之前,已經(jīng)保存了被終止運行程序相關(guān)寄存器的值到中斷的任務(wù)堆棧中,此處只需恢復(fù)待運行任務(wù)的系統(tǒng)堆棧。OSTickISR()功能是為系統(tǒng)提供一個時鐘源,實現(xiàn)時間的延遲和超時功能,該函數(shù)已在OS_CPU_C.中C定義具體實現(xiàn)方法。關(guān)于OS_CPU_A.ASM文件的內(nèi)容詳情見附錄。5.4、修改OS_CFG.H文件為了盡可能地縮短代碼的大小,因此除必要功能外將其他的功能屏蔽掉,其中需要屏蔽的功能有:OS_TASK_STAT_、ENOS_MBOX_、ENOS_MEM_、ENOS_Q_EN、OS_SEM_EN、OS_TASK_CHANGE_PRIO、OSENTASK_CREATE_EXT、OSEN_TASK_DEL_、ENOS_TASK_SUSPEND。EN即:#defineXXXX0//XXXX為需要屏蔽的功能具體代碼如下:#defineOS_CPU_HOOKS_EN1/*為1時,使用系統(tǒng)提供的函數(shù) */#defineOS_TASK_STAT_EN0/*統(tǒng)計任務(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,禁止使用消息隊列*/#defineOS_SEM_EN0/*設(shè)置為0,禁止使用信號量功能*/#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,為以后擴展任務(wù)預(yù)留空間,即:#defineOS_MAX_TASKS5修改任務(wù)最低優(yōu)先級為 20,即:#defineOS_LOWEST_PRIO20因為定時器設(shè)定為 20毫秒,所以修改系統(tǒng)時鐘節(jié)拍為 50:#defineOS_TICKS_PER_SEC505.5、修改STARTUP.ASM文件設(shè)置小模式仿真棧允許,即設(shè)置IBPSTACK為1;設(shè)置小模式下的仿真棧的棧頂指針為0xFF+1。6、μC/OS-II 應(yīng)用程序設(shè)計這次實習(xí)的程序設(shè)計我們小組是打算通過串口通訊連續(xù)發(fā)送圖片實現(xiàn)播放視頻的功能,其中我主要是負(fù)責(zé)12864顯示模塊的程序編寫。通過查詢12864的中文手冊,我發(fā)現(xiàn)12864顯示圖形時水平方向X是以字節(jié)為單位,而垂直方向Y是以位為單位。12864顯示時將屏幕分為上下兩部分,上部分由左往右分為0X80~0X87八個塊,其中每個塊是兩個字節(jié),由上往下分為0~31行;而下部分由左往右分為0X88~0X8F八個塊,其中每個塊是兩個字節(jié),由上往下分為0~31行。下圖為12864顯示時的坐標(biāo)定義因此當(dāng)把圖片寫進12864時,需要將上下兩部分分開寫,而且每一行寫16個字節(jié),具體代碼如下:voidlcdwpic(char*pic_addr){chari,j;for(i=0;i<32;i++)// 上部分寫圖片{lcdwc(0x80+i); // 先寫入垂直坐標(biāo)值lcdwc(0x80); // 寫入水平坐標(biāo)值for(j=0;j<16;j++) // 再寫入16字節(jié)的數(shù)據(jù)lcdwd(*pic_addr++);}for(i=0;i<32;i++)// 下部分寫圖片{lcdwc(0x80+i); // 先寫入垂直坐標(biāo)值lcdwc(0x88); // 寫入水平坐標(biāo)值for(j=0;j<16;j++) // 再寫入16字節(jié)的數(shù)據(jù)lcdwd(*pic_addr++);}}另外由于需要傳輸很多張圖片進行顯示, 因此需要定義一個可以修改數(shù)據(jù)的數(shù)組來充當(dāng)圖片的臨時存放數(shù)組,因為需要顯示的圖片是128*64分辨率,每一張圖片是1024字節(jié),所以數(shù)組大小為1024。即:ucharxdatapictmp[1024]={0};因為一張圖片是1024字節(jié),因此需要讓pictmp[]數(shù)組存滿才將圖片顯示出來,所以定義一個計數(shù)的變量當(dāng)傳完1024字節(jié)在調(diào)用寫圖片函數(shù),而且存數(shù)據(jù)進pictmp[]中時需要先將串口中斷關(guān)閉,具體代碼如下:voidISP_Check(unsignedchartmp){ES=0;pictmp[count]= tmp;count++;if(count==1024){count=0;lcdwpic(pictmp);}ES=1;}因為是串口通訊,所以編寫一個串行中斷函數(shù)用來處理數(shù)據(jù)的接收,函數(shù)中定義一個變量負(fù)責(zé)將SBUF寄存器中的數(shù)據(jù)取出,并且將數(shù)據(jù)存進圖片臨時存放數(shù)組pictmp[] ,具體代碼如下:voidSerial_int(void)interrupt4using1/*組1*/

函數(shù)為串行中斷,使用寄存器{unsignedchartmp;if(RI){tmp=SBUF;ISP_Check(tmp);RI=0;}}本次串口通訊需要在晶振為11.0592MHz,波特率為115200bps下執(zhí)行,因此需要定義一個初始化函數(shù)設(shè)定波特率并且將串口中斷以及總中斷打開,代碼如下:voidUartInit(void)//115200bps@11.0592MHz{PCON&=0x7F;//波特率不倍速SCON=0x50;//8位數(shù)據(jù),可變波特率AUXR|=0x40;//定時器1時鐘為Fosc,即1TAUXR&=0xFE;//串口1選擇定時器1為波特率發(fā)生器TMOD&=0x0F;//清除定時器1模式位TMOD|=0x20;//設(shè)定定時器1為8位自動重裝方式TL1=0xFD;//設(shè)定定時初值TH1=0xFD;//設(shè)定定時器重裝值ET1=0;//禁止定時器1中斷TR1=1;//啟動定時器1ES=1;//開串口中斷EA=1;//開總中斷}7、系統(tǒng)調(diào)試關(guān)于μC/OS-II系統(tǒng)經(jīng)過編寫兩個小任務(wù)測試可以正常運行,但是串口通訊顯示視頻程序經(jīng)同組人員測試,由于程序?qū)崟r性過高加到μC/OS-II系統(tǒng)后無法正常運行,經(jīng)過與老師商量決定放棄將程序加進μC/OS-II系統(tǒng)當(dāng)中,串口通訊程序直接單獨運行。關(guān)于程序中的12864顯示模塊,一開始是直接使用同組人員編寫的匯編接口,但是經(jīng)測試發(fā)現(xiàn)寫圖片速度太快,12864顯示屏的速度無法跟上造成顯示錯誤,因此決定用C語言編寫寫圖片函數(shù)。重新編寫的寫圖片函數(shù),一開始每次寫圖片都是先關(guān)閉圖形顯示,寫完后才打開圖形顯示,但是經(jīng)調(diào)試發(fā)現(xiàn)這樣子會出現(xiàn)閃屏,初步推斷是由于頻繁開關(guān)圖形顯示造成,后面將寫圖片程序中的開關(guān)圖形顯示命令去除發(fā)現(xiàn)問題解決。8、總結(jié)經(jīng)過這三個星期的實習(xí),我學(xué)習(xí)到了μC/OS-II是一個什么樣的系統(tǒng),也了解了如何將μC/OS-II移植到單片機當(dāng)中,雖然后面程序無法加到系統(tǒng)當(dāng)中有些可惜,但是還是學(xué)到了很多東西。另外對于12864顯示屏也有了進一步的認(rèn)識,對于12864是怎么顯示的也有了更詳細(xì)的了解。這次實習(xí)不僅讓我學(xué)到了很多東西,還讓我學(xué)會了通過與組員的溝通討論來解決遇到的問題。參考文獻劉偉偉,魏同宇,孫衛(wèi)兵.μC/OS-II在單片STC89系列單片機上的移植實現(xiàn)IAP15F2K61S2系列單片機器件手冊.宏晶公司康燕萍.實習(xí)指導(dǎo)書[4] 百度百科ucosii 詞條[5] 嵌入式實時操作系統(tǒng) uCOS-II.邵貝貝譯附錄:OS_CPU_A.ASMNAME OS_CPU_A==========================================; ------------------SEGMENT--------------==========================================?PR?OSStartHighRdy?OS_CPU_ASEGMENTCODE?PR?OSCtxSw?OS_CPU_ASEGMENTCODE===========================================; ------------------EXTRN------------------===========================================EXTRNXDATA(OSTCBHighRdy)EXTRNXDATA(OSTCBCur)EXTRNXDATA(OSPrioCur)===========================================; ------------------PUBLIC-----------------===========================================PUBLICOSStartHighRdyPUBLICOSCtxSwPUBLICOSIntCtxSw===========================================; ------------------STACK------------------===========================================;TheSEGMENT?STACKwillcombinedwillstackdefinedinstartup.asm?STACKSEGMENTIDATARSEG?STACKStkBottom:===========================================; ------------------FUNCTIONS--------------===========================================; -------------------------------------------; --------------OSStartHighRdy()-----------; -------------------------------------------RSEG?PR?OSStartHighRdy?OS_CPU_AOSStartHighRdy:;-----------------;OSRunning=TURE;-----------------;becauseEAisnotenabled.whereinOSStartHighRdysetOSRunningtotrueisnotimportantMOVDPH,#HIGH(OSRunning)MOVDPL,#LOW(OSRunning)MOVA,#1MOVX @DPTR,A;-----------------;TR0=1;-----------------SETB TR0OSCPUARstStk:;-----------------;GetOSTCBHighRdy->OSTCBStkPtrtoDPTR;-----------------;highbyteisatlowaddress;MoveOSTCBHighRdytodptrMOVDPH,#HIGH(OSTCBHighRdy)MOVDPL,#LOW(OSTCBHighRdy)MOVX A,@DPTRMOVR0,AINCDPTRMOVX A,@DPTRMOVDPH,R0MOVDPL,A;MoveOSTCBStkPtrtodptrMOVX A,@DPTRMOVR0,AINCDPTRMOVX A,@DPTRMOVDPH,R0MOVDPL,A;-----------------;restorestack;-----------------;restore?C_IBPMOVX A,@DPTRMOV?C_IBP,A;restoresimulatedstackJZOSCPUASmltRstOver;simulatedstacksize==0,thatis?C_IBP==0x100DECA

;LetR0pointto?C_IBP-1MOVR0,ACPLA

;caculatecopyrotationtimes,storeinR1MOVR1,AOSCPUASmltRstStk:INCR0INCDPTRMOVX A,@DPTRMOV@R0,ADJNZ R1,OSCPUASmltRstStkOSCPUASmltRstOver:;restoresp,sp=#stkBottom-1+"Hardwarestacksize".INCDPTRMOVX A,@DPTR ;nowhardwarestacksizeisstoredinAMOVR0,#StkBottom-1 ;start ofhardwarestackdefined bykeilcMOVR1,A ;storerotationtimesinR1ADDA,R0 ;spMOVSP,A;restorehardwarestack

system;stacktopisathighaddress;HardStkwillneverbeemptyOSCPUARstHardStk:INCR0INCDPTRMOVX A,@DPTRMOV@R0,ADJNZ R1,OSCPUARstHardStk;restoreregistersPOP07POP06POP05POP04SETB EA;afterstart,enableEARETI;;;

-----------------------------------------------------------------------OSCtxSw()--------------------------------------------------------------------RSEG?PR?OSCtxSw?OS_CPU_AOSCtxSw:;-----------------pushregisters;-----------------PUSHACCPUSHBPUSHDPHPUSHDPLPUSHPSWPUSH00PUSH01PUSH02PUSH03PUSH04PUSH05PUSH06PUSH07OSCPUAUniformCtxSw:;assumeregisterispushedtohardwarestack,intheformatasdiscriptedatthebeginningofthisfile;BeforejumpOSCPUAUniformCtxSw,OSCtxSworOSIntCtxSwmustfirstpushregisterstohardwarestackasthisformat.;----------------------;GetOSTCBCurRdy->OSTCBStkPtrtoDPTR;-----------------------;highbyteisatlowaddress;OSTCBCurRdytodptrMOVDPH,#HIGH(OSTCBCur)MOVDPL,#LOW(OSTCBCur)MOVX A,@DPTRMOVR0,AINCDPTRMOVX A,@DPTRMOVDPH,R0MOVDPL,A;OSTCBStkPtrtodptrMOVX A,@DPTRMOVR0,AINCDPTRMOVX A,@DPTRMOVDPH,R0MOVDPL,A;--------------------;savestack;--------------------;store?C_IBPMOVA,?C_IBPMOVX @DPTR,A;storesimulatedstackJZ OSCPUASmltSaveOver;simulatedstacksize==0,thatisA==0x100MOVR0,AOSCPUASmltSave:INCDPTRMOVA,@R0MOVX @DPTR,AINCR0CJNE R0,#0,OSCPUASmltSaveOSCPUASmltSaveOver:;storespsizeINCDPTRMOVA,SPCLRCSUBB A,#StkBottom-1MOVX @DPTR,A;storehardware

溫馨提示

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

評論

0/150

提交評論