專業(yè)實驗嵌入式系統(tǒng)實驗指導(dǎo)書2026版_第1頁
專業(yè)實驗嵌入式系統(tǒng)實驗指導(dǎo)書2026版_第2頁
專業(yè)實驗嵌入式系統(tǒng)實驗指導(dǎo)書2026版_第3頁
專業(yè)實驗嵌入式系統(tǒng)實驗指導(dǎo)書2026版_第4頁
專業(yè)實驗嵌入式系統(tǒng)實驗指導(dǎo)書2026版_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

專業(yè)實驗嵌入式系統(tǒng)實驗指導(dǎo)書2025年3月王恒編-PAGE7-實驗一嵌入式系統(tǒng)ARM驅(qū)動編程一、實驗?zāi)康?.熟悉ARM環(huán)境,學(xué)會ARM仿真器的使用。使用ADS編譯、下載、調(diào)試并跟蹤一段已有的程序,了解嵌入式開發(fā)的基本思想和過程。2.掌握非嵌入式操作系統(tǒng)模式下的ARM編程。3.了解LCD基本概念與原理,熟悉用ARM內(nèi)置的LCD控制器驅(qū)動LCD,掌握延時函數(shù)的使用方法,可以設(shè)計動態(tài)ARM程序。二、實驗內(nèi)容(2學(xué)時)1.本次實驗使用ADS集成開發(fā)環(huán)境。學(xué)習(xí)ARM仿真器的使用和開發(fā)環(huán)境的設(shè)置。下載已經(jīng)編譯好的文件到嵌入式控制器中運行。學(xué)會在程序中設(shè)置斷點,觀察系統(tǒng)內(nèi)存和變量,為調(diào)試應(yīng)用程序打下基礎(chǔ)。2.學(xué)習(xí)LCD顯示器的基本原理,理解其驅(qū)動控制方法。掌握兩種LCD驅(qū)動方式的基本原理和方法。并用編程實現(xiàn)控制LCD顯示的ARM程序。三、預(yù)備知識C語言的基礎(chǔ)知識、程序調(diào)試的基礎(chǔ)知識和方法。四、實驗設(shè)備及工具硬件:ARM嵌入式開發(fā)平臺、用于ARM7TDMI的JTAG仿真器、PC機。軟件:PC機操作系統(tǒng)Win2000、ARMADS1.2集成開發(fā)環(huán)境、仿真器驅(qū)動程序、超級終端通訊程序五、實驗原理1.ARM程序的在線仿真與調(diào)試ADS1.2可以進行ARM程序的編寫和調(diào)試。打開ADS1.2的編輯界面后,可以以工程的方式編寫和組織源代碼。執(zhí)行菜單Project|Make可對工程進行編譯連接。在出現(xiàn)的錯誤/警告窗口中選擇某錯誤/警告信息,ADS會自動打開相應(yīng)源文件并用箭頭指向出錯的文本行。如果某個源文件被修改,重新編譯時ADS會自動同步各文件的日期信息。ARM程序調(diào)試步驟如下:(1)在ADS中執(zhí)行菜單Project|Debug啟動ADS1.2的調(diào)試工具AXD。(2)在AXD中執(zhí)行菜單Options|ConfigureTarget對AXD進行設(shè)置。如圖1B-13所示。選擇ADP即遠程調(diào)試,點Configure按鈕進一步設(shè)置具體參數(shù),如圖1B-14所示。(3)在圖1B-14中點Select按鈕選擇遠程連接為ARMethernetdriver,點Configure按鈕輸入仿真器的IP地址。如果用戶使用的是并行口仿真器,請輸入127.0.0.1即可。(4)等待程序裝載完畢以后,通過Execute|Go菜單以及Execute|Stop(或者工具欄中的相應(yīng)按鈕)運行或暫停程序。程序暫停后在窗口中將顯示出程序暫停的位置。(5)通過Execute|Step菜單(或者工具欄中的相應(yīng)按鈕)可以單步運行程序。也可以使用StepIn、StepOut菜單命令進入或者跳出函數(shù)的調(diào)用。RunToCursor命令運行到光標位置。(6)程序停止后可以通過ProcessorViews|Sources菜單查看源文件,并可在適當位置按F9設(shè)置端點。(7)使用在ProcessorView菜單下的Registers、Variables和Memory命令可以查看工作寄存器或者內(nèi)存變量。可以逐一地嘗試,以方便對程序進行調(diào)試。2.LCD的驅(qū)動方法市面上出售的LCD有兩種驅(qū)動類型:一種是帶有驅(qū)動電路的LCD顯示模塊,這種LCD可以方便地與各種低檔單片機進行接口,如8051系列單片機,但是由于硬件驅(qū)動電路的存在,體積比較大。這種模式常常使用總線方式來驅(qū)動。另一種是LCD顯示屏,沒有驅(qū)動電路,需要與驅(qū)動電路配合使用。特點是體積小,但卻需要另外的驅(qū)動芯片。也可以使用帶有LCD驅(qū)動能力的高檔MCU驅(qū)動,如ARM系列的S3C44BOX。S3C44B0X中具有內(nèi)置的LCD控制器,它具有將顯示緩存(在系統(tǒng)存儲器中)中的LCD圖象數(shù)據(jù)傳輸?shù)酵獠縇CD驅(qū)動電路的邏輯功能。S3C44B0X中內(nèi)置的LCD控制器可支持灰度LCD和彩色LCD。在灰度LCD上,使用基于時間的抖動算法(time-basedditheringalgorithm)和FRC(FrameRateControl)方法,可以支持單色、4級灰度和16級灰度模式的灰度LCD。在彩色LCD上,可以支持256級彩色。對于不同尺寸的LCD,具有不同數(shù)量的垂直和水平象素、數(shù)據(jù)接口的數(shù)據(jù)寬度、接口時間及刷新率,而LCD控制器可以進行編程控制相應(yīng)的寄存器值,以適應(yīng)不同的LCD顯示板。與ARM自帶LCD驅(qū)動器有關(guān)的寄存器可參見S3C44B0X的數(shù)據(jù)手冊。3.延時函數(shù)與嵌入式系統(tǒng)的主函數(shù)寫法voidDelay(inttime)函數(shù)可以實現(xiàn)延時功能,(注意函數(shù)名中的字母D是大寫),其中參數(shù)time是設(shè)定的延時值,單位為0.1ms。例如延時1s,可以調(diào)用:Delay(10000);即可實現(xiàn)。該延時函數(shù)的精度比較高,是采用S3C44B0X芯片內(nèi)部的定時器來實現(xiàn)定時功能的。嵌入式系統(tǒng)的主函數(shù)一般是一個永不結(jié)束或返回的函數(shù)。在程序結(jié)構(gòu)上,寫成一個大循環(huán)。永遠循環(huán)的兩種寫法:while(1){循環(huán)內(nèi)容;}或for(;;){循環(huán)內(nèi)容}LCD顯示配合延時功能,可以實現(xiàn)各種動畫功能。例如一個實現(xiàn)兩幅圖不停的切換的程序框架如下:main(){ 開發(fā)板及必要的初始化;while(1){ LCD_Cls();//清屏畫第一幅圖;LCD_Refresh();//刷新屏幕,只有調(diào)用該函數(shù)液晶屏才會真正顯示所畫內(nèi)容;Delay(20000);//延時2sLCD_Cls();//清屏 畫第二幅圖;LCD_Refresh();Delay(20000);}}如果畫面重畫的速度比較快(例如每秒切換24張),人眼就不會看到重畫過程,從而形成動畫。清屏函數(shù)例子:voidLCD_Cls(){intx,y;for(x=0;x<320;x++)for(y=0;y<240;y++)LCDBuffer[y][x]=0x0;}六、實驗步驟1.將“Exp1LCD驅(qū)動控制實驗”整個文件夾復(fù)制到自己所建的目錄下,將其改為英文名(ADS對中文目錄的支持不好),然后雙擊exp1.mcp文件,便可以打開工程。2.查看LCD的驅(qū)動文件,包括(1)有關(guān)常量與宏(lcd320.h,lcd320.c)#defineLCDWIDTH320#defineLCDHEIGHT240U32*pLCDBuffer16=(U32*)0xc000000;//一級緩存指針U32LCDBuffer[LCDHEIGHT][LCDWIDTH];//二級緩存將其定義為32位是為了與RGB顏色兼容。(2)查看LCD初始化函數(shù)(lcd320.c):設(shè)置各功能寄存器,清空顯示緩存區(qū)。(3)查看LCD刷新函數(shù)(lcd320.c)。此函數(shù)主要是將二級緩存LCDBuffer的數(shù)據(jù)由32位彩色圖形信息轉(zhuǎn)換成8位256色的圖形信息,然后放到pLCDBuffer16指向的一級緩存。轉(zhuǎn)換公式:pixcolor=(pbuf[0]&0xe0)|((pbuf[1]>>3)&0x1c)|(pbuf[2]>>6)。其中,pbuf[0]、pbuf[1]、pbuf[2]是一個象素的32位彩色數(shù)據(jù)的前24位,分別代表R、G、B。(4)查看主函數(shù)(main.c)在LCD上顯示256色圖形的關(guān)鍵是填充二級顯示緩沖,將顯示象素的24位顏色信息寫入LCDBuffer。將RGB三種基本顏色按一定比例混合即可構(gòu)成更復(fù)雜的顏色,每個象素的三種基本顏色分別占一個字節(jié),可以方便的在程序里改寫各基本顏色的數(shù)值,從而改變該象素的混合顏色。例如向位于(x,y)坐標的像素填充紅色,對應(yīng)代碼為:LCDBuffer[x][y]=0xe0;屏幕的左上角為坐標原點,x軸向右依次增加到320,y軸向下依次增加到240.3.將示例程序下載到開發(fā)板上,調(diào)試并查看程序運行結(jié)果。4.在消化吸收示例程序的main.c文件的基礎(chǔ)上,按照老師的現(xiàn)場要求,修改或重寫main.c文件中的main函數(shù),編寫自己的ARM程序,實現(xiàn)LCD顯示和ARM動態(tài)程序設(shè)計。5.編譯、下載與調(diào)試自編程序。七、思考題1)ARM程序在線調(diào)試時主要進行哪些設(shè)置?2)寫出ARM程序設(shè)計中main函數(shù)常用的程序框架。

實驗二嵌入式操作系統(tǒng)程序設(shè)計一、實驗?zāi)康?.了解μC/OS-Ⅱ內(nèi)核的主要結(jié)構(gòu)。2.掌握μC/OS-Ⅱ程序設(shè)計的基本方法。3.學(xué)習(xí)使用嵌入式系統(tǒng)繪圖的API函數(shù)。理解繪圖設(shè)備上下文(DC)在多任務(wù)操作系統(tǒng)中的作用。會使用繪圖設(shè)備上下文(DC)在屏幕上繪制一個圓角矩形和一個圓。了解繪制動畫防止閃爍的基本原理,可以實現(xiàn)無閃爍的動畫。4.學(xué)習(xí)使用系統(tǒng)的消息循環(huán)。掌握如何通過系統(tǒng)的消息循環(huán)來響應(yīng)鍵盤任務(wù)的消息,同時學(xué)會使用圖形模式下的液晶屏文字顯示函數(shù)。二、實驗內(nèi)容(4學(xué)時)1.學(xué)習(xí)μC/OS-Ⅱ的編程方法。2.編寫幾個簡單任務(wù),在超級終端上觀察任務(wù)的切換。3.通過使用嵌入式系統(tǒng)的繪圖API函數(shù),首先,在屏幕上繪制一個圓角矩形和一個整圓。然后,再在屏幕上無閃爍的繪制一個移動的正弦波。4.通過使用消息隊列接收鍵盤任務(wù)發(fā)出的按鍵消息,并把對應(yīng)按鍵的字符顯示在液晶屏和PC機的終端上。三、預(yù)備知識1.掌握在ADS1.2集成開發(fā)環(huán)境中編寫和調(diào)試程序的基本過程。2.了解ARM7處理器的結(jié)構(gòu)。3.了解μC/OS-Ⅱ系統(tǒng)結(jié)構(gòu)。四、實驗設(shè)備及工具硬件:ARM嵌入式開發(fā)平臺、用于ARM7TDMI的JTAG仿真器、PC機。軟件:PC機操作系Win2000、ADS1.2集成開發(fā)環(huán)境、仿真器驅(qū)動程序、超級終端通訊程序。五、實驗原理(一)μC/OS-Ⅱ程序編寫基礎(chǔ)為了使μC/OS-Ⅱ可以正常運行,硬件初始化和配置文件也是必須的。STARTUP目錄下的文件還包括中斷處理,時鐘,串口通信等基本功能函數(shù)。在文件main.c中給出了應(yīng)用程序的基本框架,包括初始化和多任務(wù)的創(chuàng)建,啟動等。在μC/OS-Ⅱ中創(chuàng)建一個任務(wù)的步驟如下:1)在程序開頭定義任務(wù)堆棧,任務(wù)函數(shù)聲明和任務(wù)優(yōu)先級:OS_STKTaskName_Stack[STACKSIZE]={0,};//任務(wù)堆棧voidTaskName(void*Id);//任務(wù)函數(shù)#defineTaskName_PrioN//任務(wù)優(yōu)先級2)在main()函數(shù)中調(diào)用OSStart()函數(shù)之前用下列語句創(chuàng)建任務(wù):OSTaskCreate(TaskName,(void*)0,(OS_STK*)&TaskName_Stack[STACKSIZE-1],TaskName_Prio);OSTaskCreate()函數(shù)的原型是:INT8UOSTaskCreate(void(*task)(void*pd),void*p_arg,OS_STK*ptos,INT8Uprio);需要將任務(wù)函數(shù)TaskName,任務(wù)堆棧TaskName_Stack,任務(wù)優(yōu)先級TaskName_Prio三個參數(shù)傳給OSTaskCreate()函數(shù)。根據(jù)任務(wù)函數(shù)的內(nèi)容決定堆棧大小,宏STACKSIZE定義為4KB,可以在此基數(shù)上乘倍。任務(wù)優(yōu)先級越高,TaskName_Prio值越?。沪藽/OS-Ⅱ可以管理64個任務(wù),由OSInit()創(chuàng)建的空閑任務(wù)的優(yōu)先級最低為63;μC/OS-Ⅱ保留4個最高和4個最低優(yōu)先級,用戶任務(wù)可以使用其余56個優(yōu)先級值。3)編寫任務(wù)函數(shù)內(nèi)容:voidTaskName(void*Id){//添入任務(wù)初始化語句for(;;){//添入任務(wù)循環(huán)內(nèi)容OSTimeDly(SusPendTime);//掛起一定時間,以使其他任務(wù)可以占用CPU}}μC/OS-Ⅱ至少要有一個任務(wù),這里首先創(chuàng)建一個系統(tǒng)任務(wù)SYS_Task,其中由語句OSRunning=TRUE;//使能μC/OS-Ⅱ運行uHALr_InstallSystemTimer();啟動系統(tǒng)時鐘和多任務(wù)切換。為了驗證μC/OS-Ⅱ多任務(wù)切換的進行,再編寫兩個簡單的任務(wù),分別在超級終端上輸出runtask1和runtask2??梢詤⒖糾ain.c的結(jié)構(gòu)創(chuàng)建多個不同功能的任務(wù),觀察個任務(wù)的切換。(二)完善的μC/OS-Ⅱ開發(fā)框架需要說明的是,μC/OS-Ⅱ作為一個實時操作系統(tǒng)只提供了多任務(wù)調(diào)度等基本功能,這在實際應(yīng)用中顯然是不夠的。除了移植好的操作系統(tǒng)內(nèi)核部分,還必須有文件系統(tǒng),全部硬件的驅(qū)動程序,圖形API,控件函數(shù),綜合提高的消息函數(shù)以及幾個系統(tǒng)必須的基本任務(wù),象鍵盤,觸摸屏,LCD刷新等。有了這些,μC/OS-Ⅱ才能實現(xiàn)復(fù)雜的功能。特殊需求的地方還需要像USB通信協(xié)議,TCP/IP協(xié)議等更復(fù)雜的軟件模塊。實驗系統(tǒng)提供的μC/OS-Ⅱ庫文件中包含了上述大部分功能,基于庫的開發(fā)變的非常簡單,在基本的程序框架下應(yīng)用實驗系統(tǒng)提供的豐富API函數(shù)即可。實際開發(fā)中,用戶的工程中無需包括μC/OS-Ⅱ的源代碼,只需要包括庫文件即可。當然,用戶也可以了解庫中部分代碼的源文件,可以根據(jù)自己的需求就行重新編譯,也可以對自己的一系列源文件生成一個專門的庫,方便自己后續(xù)工作。μC/OS-Ⅱ的開發(fā)中,應(yīng)用程序和操作系統(tǒng)是綁在一起編譯的,所生成的system.bin文件是唯一的可執(zhí)行文件,其中包括了所需要的μC/OS-Ⅱ代碼和被用到的驅(qū)動程序等函數(shù)代碼,以及應(yīng)用程序的代碼。system.bin文件是存放在平臺的16MFLASH中的,在系統(tǒng)啟動時由BIOS依靠文件系統(tǒng)從FLASH中讀入到SDRAM中,然后把控制轉(zhuǎn)移到該代碼上,完成所謂的引導(dǎo)。而BIOS是存儲在另外的ROM中的。本實驗提供了基于庫的μC/OS-Ⅱ開發(fā)框架,可以打開工程進行了解。圖3-3是ADS環(huán)境下看到的該框架的文件組成,還可以展開各目錄查看更多的文件信息。圖3-3ADS下框架文件構(gòu)成可以看出,STARTUP下的都是最基本的硬件初始化和配置文件;Ucos_lib.a是ADS環(huán)境下的庫;SRC是用戶編寫的工程文件;μC/OS-Ⅱ下都是系統(tǒng)用到的頭文件,其中ADD下是添加的基本系統(tǒng)任務(wù)和消息函數(shù)的相關(guān)頭文件。INC下主要是硬件驅(qū)動程序的頭文件。Init下的幾個文件是ADS環(huán)境下配置存儲器及堆棧的,和μC/OS-Ⅱ無直接關(guān)系。打開Main.c文件,可以看到一個應(yīng)用工程的基本框架,在這個實驗中,所謂的應(yīng)用很簡單,就是在LCD上顯示“Helloworld!”,大部分代碼都是框架。用戶可以在這些代碼的基礎(chǔ)上進行應(yīng)用開發(fā),創(chuàng)建新任務(wù),編寫必要的函數(shù)。當然,如果針對特定的項目有相對獨立并集中的一些函數(shù)則最好新建源文件和頭文件,以方便管理,這些用戶新建的源文件可以放到SRC目錄下,在編譯環(huán)境下用AddFiles命令加入對應(yīng)位置。下面是Main()函數(shù)中的內(nèi)容:intmain(void){ARMTargetInit();//開發(fā)板初始化OSInit();//操作系統(tǒng)初始化uHALr_ResetMMU();//復(fù)位MMULCD_Init();//初始化LCD模塊LCD_printf("LCDinitializationisOK\n");//向液晶屏輸出數(shù)據(jù)initOSGUI();//初始化圖形界面LoadFont();//調(diào)Unicode字庫LoadConfigSys();//使用config.sys文件配置系統(tǒng)設(shè)置LCD_printf("CreatetaskonμC/OS-Ⅱ...\n");OSTaskCreate(Main_Task,(void*)0,(OS_STK*)&Main_Stack[STACKSIZE*8-1],Main_Task_Prio);//創(chuàng)建系統(tǒng)任務(wù)OSAddTask_Init();//創(chuàng)建系統(tǒng)附加任務(wù)LCD_printf("StartingμC/OS-Ⅱ...\n");LCD_printf("Enteringgraphmode...\n");LCD_ChangeMode(DspGraMode);//變LCD顯示模式為圖形模式InitRtc();//初始化系統(tǒng)時鐘Nand_Rw_Sem=OSSemCreate(1);//創(chuàng)建Nand-Flash讀寫控制權(quán)旗語,初值為1滿足互斥條件OSStart();//操作系統(tǒng)任務(wù)調(diào)度開始//不會執(zhí)行到這里return0;}main()函數(shù)中調(diào)用了必要的初始化函數(shù),創(chuàng)建了系統(tǒng)任務(wù)和用戶任務(wù),然后啟動系統(tǒng)任務(wù)調(diào)度。建議用戶不要改動該函數(shù)中的初始化過程,但可以按本實驗第一部分所述的任務(wù)創(chuàng)建方法來創(chuàng)建更多的任務(wù),注意每個任務(wù)必須具有不同的優(yōu)先級。(三)繪圖的API函數(shù)請查閱附錄API函數(shù),在Display.h中定義了和繪圖顯示有關(guān)的數(shù)據(jù)類型和函數(shù)原型。在μC/OS-Ⅱ系統(tǒng)環(huán)境下,繪圖必須通過使用繪圖設(shè)備上下文(DC)來實現(xiàn)。繪圖設(shè)備上下文(DC)中包括了與繪圖相關(guān)的信息,比如:畫筆的寬度、繪圖的原點等等。這樣,在多任務(wù)系統(tǒng)中,不同的任務(wù)通過不同的繪圖設(shè)備上下文(DC)繪圖才不會互相影響。繪圖設(shè)備上下文(DC)的結(jié)構(gòu)定義如下:typedefstruct{intDrawPointx;intDrawPointy;//繪圖所使用的坐標點intPenWidth;//畫筆寬度U32PenMode;//畫筆模式COLORREFPenColor;//畫筆的顏色intDrawOrgx;//繪圖的坐標原點位置intDrawOrgy;intWndOrgx;//繪圖的窗口坐標位置intWndOrgy;intDrawRangex;//繪圖的區(qū)域范圍intDrawRangey;structRECTDrawRect;//繪圖的有效范圍U8bUpdataBuffer;//是否更新后臺緩沖區(qū)及顯示U32Fontcolor;//字符顏色}DC,*PDC與繪圖設(shè)備上下文(DC)有關(guān)的函數(shù)有:initOSDC()用來初始化系統(tǒng)的DC,為DC動態(tài)內(nèi)存開辟空間;CreateDC()和DestoryDC(PDCpdc)分別用來創(chuàng)建和刪除DC,前者返回所創(chuàng)建的DC指針,后者則釋放DC的內(nèi)存空間。和繪圖有關(guān)的函數(shù)有TextOut(),LineTo(),F(xiàn)illRect(),Circle(),ShowBmp()等常見的圖形函數(shù),用戶可以查看附錄API函數(shù)顯示部分,嘗試使用這些函數(shù)。在μC/OS-Ⅱ操作系統(tǒng)中,液晶顯示屏的刷新是通過Lcd_Fresh_Task任務(wù)完成的,該任務(wù)是在系統(tǒng)附加任務(wù)初始化函數(shù)OSAddTask_Init()中定義的,該函數(shù)開辟了LCD刷新任務(wù),觸摸屏任務(wù),鍵盤任務(wù)等。繪圖首先是在繪圖緩沖區(qū)中完成的,然后系統(tǒng)自動(也可以通過設(shè)置繪圖設(shè)備上下文參數(shù),不讓系統(tǒng)自動刷新)向Lcd_Fresh_Task發(fā)送更新消息。其流程圖如圖4-1所示:圖4-1繪圖流程因為繪圖是在后臺進行的,繪制完成之后,再更新到液晶屏上,所以,在繪圖的時候不用擔心反覆的擦除屏幕會引起屏幕的閃爍,這樣,可以很方便的實現(xiàn)動畫無閃爍的顯示。繪制完一次圖形以后,必須要使用OSTimeDly()給出一定時間的延時(推薦用200),同時使Main_Task任務(wù)主動讓出對CPU的控制權(quán),使Lcd_Fresh_Task任務(wù)可以完成刷新。(四)圖形系統(tǒng)的消息循環(huán)通常在多任務(wù)操作系統(tǒng)中,任務(wù)之間的通訊是通過發(fā)送消息來實現(xiàn)的。消息隊列是μC/OS-Ⅱ操作系統(tǒng)的一種通信機制,它可以使一個任務(wù)或者中斷服務(wù)程序向另一個任務(wù)發(fā)送以指針方式定義的變量。μC/OS-Ⅱ操作系統(tǒng)提供了若干對消息隊列進行操作的函數(shù),例如OSQCreate(),OSQPend(),OSQPost()等,都定義在OS_Q.C中。但是,在將μC/OS-Ⅱ移植到本ARM嵌入式開發(fā)平臺時,對消息隊列相關(guān)函數(shù)又作了提高,使得程序中對消息隊列的使用變得更加簡單易行。請參考附錄API函數(shù)系統(tǒng)消息部分,開發(fā)平臺的消息隊列相關(guān)函數(shù)定義在OSMessage.h中。程序中可以用OSCreateMessage()函數(shù)為某個控件創(chuàng)建消息,用SendMessage()函數(shù)將該消息發(fā)送到消息隊列中,用WaitMessage()函數(shù)等待消息,用DeleteMessage()函數(shù)刪除消息。消息的數(shù)據(jù)結(jié)構(gòu)定義如下:typedefstruct{POS_CtrlpOSCtrl;//消息所發(fā)到的窗口(控件),為NULL時指桌面U32Message;//消息類型U32WParam;//消息參數(shù)U32LParam;//消息參數(shù)}OSMSG,*POSMSG;下面是平臺的基本消息類型定義:#defineOSM_KEY1//鍵盤消息#defineOSM_TOUCH_SCREEN2//觸摸屏消息#defineOSM_SERIAL100//串口收到數(shù)據(jù)的消息#defineOSM_LISTCTRL_SELCHANGE1001//列表框的選擇被改變的消息#defineOSM_LISTCTRL_SELDBCLICK1002//列表框的選擇雙擊消息#defineOSM_BUTTON_CLICK1003//單擊按鈕消息下面是各基本消息類型的參數(shù)說明:MessageWParamLParamOSM_KEY鍵盤掃描碼OSM_TOUCH_SCREEN低16位=觸摸點x坐標值高16位=觸摸點y坐標值觸摸動作OSM_LISTCTRL_SELCHANGECtrlIDCurrentSelOSM_LISTCTRL_SELDBCLICKCtrlIDCurrentSelOSM_BUTTON_CLICKCtrlID對于鍵盤消息來說其類型pMsg->Message=OSM_KEY,參數(shù)pMsg->WParam則是按鍵的鍵碼(pMsg是指向該消息結(jié)構(gòu)體的指針)。鍵盤中斷服務(wù)程序只向鍵盤郵箱(郵箱是μC/OS-Ⅱ的另一種通信機制)中發(fā)送一個消息,通知鍵盤掃描任務(wù)發(fā)生按鍵事件:voidISR_Key(){OSMboxPost(Key_MailBox,(void*)1);}當鍵盤掃描任務(wù)等到該郵箱的消息后就會從鍵盤掃描芯片讀取掃描碼,繼而將該掃描碼對應(yīng)的鍵碼用鍵盤消息發(fā)送到消息隊列:voidKey_Scan_Task(void*Id)//鍵盤掃描任務(wù){(diào)U32key;INT8Uerr;POSMSGpmsg;Uart_Printf("beginkeytask\n");for(;;){OSMboxPend(Key_MailBox,0,&err);key=ZLG7289_ReadKey();if(key>=64)continue;pmsg=OSCreateMessage(NULL,OSM_KEY,KeyBoard_Map[key],0);if(pmsg)SendMessage(pmsg);}}所謂的系統(tǒng)消息循環(huán)如圖4-2所示:圖4-2系統(tǒng)的消息循環(huán)應(yīng)用程序在Main_Task任務(wù)中等待消息,并對該消息進行判斷和處理,如果是鍵盤消息則提取出鍵碼,變換為對應(yīng)字符,然后將其顯示到液晶屏上。在圖形模式下,液晶屏的文字輸出函數(shù)是TextOut(),實際是通過在圖形方式下繪圖完成文字顯示的。此函數(shù)輸出的字符數(shù)組必須是基于雙字節(jié)Unicode編碼的。在程序中可以使用Int2Unicode()和strChar2Unicode()兩個函數(shù)分別將整形數(shù)或ASCII字符轉(zhuǎn)換為Unicode字符串。這部分內(nèi)容請參考附錄API函數(shù),在Ustring.h定義。六、實驗步驟(一)嵌入式操作系統(tǒng)基本程序設(shè)計1.查看實驗示例程序,學(xué)習(xí)μC/OS-Ⅱ任務(wù)創(chuàng)建和延時的程序編寫方法。2.編寫多任務(wù)程序,要求實現(xiàn):任務(wù)1不停的向串口打印“Task1”,任務(wù)2向不同的串口打印“Task2”,任務(wù)3不停的向串口打印“Task3”。打印的規(guī)律為:121213,循環(huán)打印。效果如下:Task1Task2Task1Task2Task1Task33.編譯、調(diào)試所編寫的程序。(二)繪圖的API函數(shù)1、新建工程,將“Exp4-1繪圖的API函數(shù)”中的文件加入工程。2、編輯Main.c文件,在Main_Task任務(wù)中加入代碼。使用操作系統(tǒng)的繪圖API函數(shù),繪制出如圖4-3所示的圖形。圖4-3繪制的圖形提示:1)繪制整個圓可以用Circle函數(shù),繪制直線用LineTo函數(shù),繪制圓弧用ArcTo函數(shù)。調(diào)試的過程中可以在每次調(diào)用繪圖函數(shù)之后調(diào)用OSTimeDly()函數(shù),使系統(tǒng)更新顯示,輸出到液晶屏上。2)為方便繪圖,可使用SetDrawOrg函數(shù)設(shè)置繪圖的原點。3)因為本次實驗不用系統(tǒng)的字符顯示,所以,可以去掉Main()函數(shù)中LoadFont()函數(shù),以節(jié)省系統(tǒng)啟動的時間。3、用ADS1.2編譯、下載并調(diào)試上述程序,檢查運行結(jié)果。4、在屏幕上無閃爍的繪制一個移動的正弦波。提示:1)繪制正弦波等有數(shù)學(xué)表達式的曲線時,可以根據(jù)平面幾何的知識通過數(shù)學(xué)計算得到曲線上點的坐標,然后用線段連起來構(gòu)成整個曲線。兩幀畫面之間可以清屏擦掉原來圖形,然后重畫新圖形。2)因為繪圖需要使用sin()函數(shù),所以需要在main.c中加入#include<math.h>。5、用ADS1.2編譯、下載并調(diào)試上述程序,檢查運行結(jié)果。(三)圖形系統(tǒng)的消息循環(huán)7、新建工程,將“Exp4-2系統(tǒng)的消息循環(huán)”中的文件加入工程。8、編輯Main_Task任務(wù)中的代碼,理解如何實現(xiàn)消息循環(huán)。即:等待消息、處理(響應(yīng))消息、刪除消息。提示:1)使用WaitMessage(0)接收消息,通常等待時間設(shè)置為無限長。2)系統(tǒng)的消息循環(huán)是一個無限循環(huán)。3)收到消息以后(即WaitMessage()函數(shù)返回后),通過判斷消息結(jié)構(gòu)中Message成員來判斷消息類型。如果是鍵盤消息,則Message的值為OSM_KEY,WParam參數(shù)存儲的是按鍵的鍵碼,LParam參數(shù)存儲的是同時按下的功能鍵(如果沒有,則為0)。4)開始等待下一條消息之前必須使用DeleteMessage刪除消息,釋放系統(tǒng)的內(nèi)存空間。9、編寫鍵盤消息響應(yīng)函數(shù)onKey(),處理鍵盤的消息。當有鍵盤消息收到的時候,把按鍵字符顯示在液晶屏上,同時,發(fā)送給PC機的終端。提示:1)通過Uart_Printf()函數(shù)向串行口發(fā)送鍵面字符串。10、用ARMADS1.2編譯、下載并調(diào)試上述程序,檢查運行結(jié)果。12、在學(xué)習(xí)和調(diào)試上述例子程序的基礎(chǔ)上,按照教師現(xiàn)場的要求,編寫一個結(jié)合進程通信和繪圖函數(shù)的綜合程序,要求最終程序能夠通過開發(fā)板自啟動運行。七、思考題1.若循環(huán)打印出序列121213,各任務(wù)的循環(huán)周期和優(yōu)先級應(yīng)如何設(shè)置?2.結(jié)合自己實驗種的體會,談一下μC/OS-Ⅱ有什么優(yōu)勢?

附錄嵌入式系統(tǒng)應(yīng)用編程API函數(shù)1.顯示部分Display.h相關(guān)結(jié)構(gòu):typedefstruct{intDrawPointx;intDrawPointy;//繪圖所使用的坐標點intPenWidth;//畫筆寬度U32PenMode;//畫筆模式COLORREFPenColor;//畫筆的顏色intDrawOrgx;//繪圖的坐標原點位置intDrawOrgy;intWndOrgx;//繪圖的窗口坐標位置intWndOrgy;intDrawRangex;//繪圖的區(qū)域范圍intDrawRangey;structRECTDrawRect;//繪圖的有效范圍U8bUpdataBuffer;//是否更新后臺緩沖區(qū)及顯示U32Fontcolor;//字符顏色}DC,*PDCtypedefstruct{intleft;inttop;intright;intbottom;}structRECT相關(guān)函數(shù):initOSDC定義:voidinitOSDC()功能:初始化系統(tǒng)的繪圖設(shè)備上下文(DC),為DC的動態(tài)分配開辟內(nèi)存空間CreateDC定義:PDCCreateDC()功能:創(chuàng)建一個繪圖設(shè)備上下文(DC),返回指向DC的指針DestoryDC定義:voidDestoryDC(PDCpdc)功能:刪除繪圖設(shè)備上下文(DC),釋放相應(yīng)的資源參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針SetPixel定義:voidSetPixel(PDCpdc,intx,inty,COLORREFcolor)功能:設(shè)置指定點的像素顏色到LCD的后臺緩沖區(qū),LCD范圍以外的點將被忽略參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針x,y:指定的像素座標color:指定的像素的顏色,高8位為空,接下來的24位分別對應(yīng)RGB顏色的8位碼。SetPixelOR定義:voidSetPixelOR(PDCpdc,intx,inty,COLORREFcolor)功能:設(shè)置指定點的像素顏色和LCD的后臺緩沖區(qū)的對應(yīng)點或運算,LCD范圍以外的點將被忽略參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針x,y:指定的像素座標color:指定的像素的顏色,高8位為空,接下來的24位分別對應(yīng)RGB顏色的8位碼。SetPixelAND定義:voidSetPixelAND(PDCpdc,intx,inty,COLORREFcolor)功能:設(shè)置指定點的像素顏色和LCD的后臺緩沖區(qū)的對應(yīng)點與運算,LCD范圍以外的點將被忽略參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針x,y:指定的像素座標color:指定的像素的顏色,高8位為空,接下來的24位分別對應(yīng)RGB顏色的8位碼。SetPixelXOR定義:voidSetPixelXOR(PDCpdc,intx,inty,COLORREFcolor)功能:設(shè)置指定點的像素顏色和LCD的后臺緩沖區(qū)的對應(yīng)點異或運算,LCD范圍以外的點將被忽略參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針x,y:指定的像素座標color:指定的像素的顏色,高8位為空,接下來的24位分別對應(yīng)RGB顏色的8位碼。GetFontHeight定義:intGetFontHeight(U8fnt)功能:返回指定字體的高度參數(shù)說明:fnt:輸出字體的大小型號,可以是表1-1數(shù)值中的一種:表1-1字體大小字體的型號數(shù)值說明FONTSIZE_SMALL1小字體模式,12x12字符FONTSIZE_MIDDLE2中字體模式,16x16字符FONTSIZE_BIG3大字體模式,24x24字符TextOut定義:voidTextOut(PDCpdc,intx,inty,U16*ch,U8bunicode,U8fnt)功能:在LCD屏幕上顯示文字參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針x,y:所輸出文字左上角的屏幕坐標ch:指向輸出文字字符串的指針bunicode:是否為Unicode編碼,如果是TRUE,表示ch指向的字符串為Unicode字符集;如果為FALSE,表示表示ch指向的字符串為GB字符集。fnt:指定字體的大小型號,可以是表1-1數(shù)值中的一種或上表1-2的數(shù)值:表1-2字的顯示方式顯示模式數(shù)值說明FONT_NORMAL0正常顯示FONT_TRANSPARENT4透明背景FONT_BLACKBK8黑底白字TextOutRect定義:voidTextOutRect(PDCpdc,structRECT*prect,U16*ch,U8bunicode,U8fnt,U32outmode)功能:在指定矩形的范圍內(nèi)顯示文字,超出的部分將被裁減參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針prect:所輸出文字的矩形范圍ch:指向輸出文字字符串的指針bunicode:是否為Unicode編碼,如果是TRUE,表示ch指向的字符串為Unicode字符集;如果為FALSE,表示表示ch指向的字符串為GB字符集。fnt:指定字體的大小型號,可以是表1-1數(shù)值中的一種或表1-2的數(shù)值outmode:指定矩形中文字的對齊方式,可以是表1-3中的數(shù)值表1-3矩形中文字的對齊方式對齊方式數(shù)值說明TEXTOUT_LEFT_UP0文字從左上角開始TEXTOUT_MID_X1水平居中TEXTOUT_MID_Y2垂直居中MoveTo定義:voidMoveTo(PDCpdc,intx,inty)功能:把繪圖點移動到指定的坐標參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針x,y:移動畫筆到繪圖點的屏幕坐標LineTo定義:voidLineTo(PDCpdc,intx,inty)功能:在屏幕上畫線。從當前畫筆的位置畫直線到指定的坐標位置,并使畫筆停留在當前指定的位置參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針x,y:直線繪圖目的點的屏幕坐標DrawRectFrame定義:voidDrawRectFrame(PDCpdc,intleft,inttop,intright,intbottom)功能:在屏幕上繪制指定大小的矩形方框。參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針left:繪制矩形的左邊框位置right:繪制矩形的右邊框位置top:繪制矩形的上邊框位置bottom:繪制矩形的下邊框位置DrawRectFrame2定義:voidDrawRectFrame2(PDCpdc,structRECT*rect)功能:在屏幕上繪制指定大小的矩形方框。參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針rect:繪制矩形的位置及大小FillRect定義:voidFillRect(PDCpdc,intleft,inttop,intright,intbottom,U32DrawMode,COLORREFcolor)功能:在屏幕上填充指定大小的矩形。參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針left:繪制矩形的左邊框位置right:繪制矩形的右邊框位置top:繪制矩形的上邊框位置bottom:繪制矩形的下邊框位置DrawMode:矩形的的填充模式和顏色,它的數(shù)值可以是表1-4中的一種和表1-5中的或運算的結(jié)果color:填充的顏色值,高8位為空,接下來的24位分別對應(yīng)RGB顏色的8位碼。表1-4繪圖模式繪圖模式數(shù)值說明GRAPH_MODE_NORMAL0x00普通繪圖模式GRAPH_MODE_OR0x10或繪圖模式GRAPH_MODE_AND0x20與繪圖模式GRAPH_MODE_XOR0x30異或繪圖模式表1-5前景顏色圖形顯示模式數(shù)值說明COLOR_BLACK1黑色前景色COLOR_WHITE0白色前景色FillRect2定義:voidFillRect2(PDCpdc,structRECT*rect,U32DrawMode,COLORREFcolor)功能:在屏幕上填充指定大小的矩形。參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針rect:繪制矩形的位置及大小DrawMode:矩形的的填充模式和顏色,它的數(shù)值可以是表1-4中的一種和表1-5中的或運算的結(jié)果。color:填充的顏色值,高8位為空,接下來的24位分別對應(yīng)RGB顏色的8位碼。ClearScreen定義:voidClearScreen()功能:清除整個屏幕的繪圖緩沖區(qū),即:清空LCDBuffer2SetPenWidth定義:U8SetPenWidth(PDCpdc,U8width)功能:設(shè)置畫筆的寬度,并返回以前的畫筆寬度參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針width:畫筆的寬度,默認值是1,即一個像素點寬SetPenMode定義:voidSetPenMode(PDCpdc,U32mode)功能:設(shè)置畫筆畫圖的模式參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針mode:繪圖的更新模式,可以是表1-4數(shù)值中的一種Circle定義:voidCircle(PDCpdc,intx0,inty0,intr)功能:繪制指定圓心和半徑的圓參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針x0,y0:圓心坐標r:圓的半徑ArcTo定義:voidArcTo(PDCpdc,intx1,inty1,U8arctype,intR)功能:繪制圓弧,從畫筆的當前位置繪制指定圓心的圓弧到給定的位置參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針x1,y1:繪制圓弧的目的位置arctype:圓弧的方向可以是表1-6參數(shù)中的一種:R:圓弧的半徑表1-6圓弧的方向園弧繪制模式數(shù)值說明GRAPH_ARC_BACKWARD0逆時針畫圓GRAPH_ARC_FORWARD1順時針畫圓SetLCDUpdata定義:U8SetLCDUpdata(PDCpdc,U8isUpdata)功能:設(shè)定繪圖的時候是否及時的更新LCD的顯示,返回以前的更新模式參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針isUpdata:是否更新LCD的顯示,可以為TRUE或者FALSE。如果選擇及時更新則每調(diào)用一次繪圖的函數(shù)都要更新LCD的后臺緩沖區(qū)并把后臺緩沖區(qū)復(fù)制到前臺,雖然可以保證繪圖的實時性,但是,總體來講,是降低了繪圖的效率。Draw3DRect定義:voidDraw3DRect(PDCpdc,intleft,inttop,intright,intbotton,COLORREFcolor1,COLORREFcolor2)功能:繪制指定大小和風格的3D邊框的矩形參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針left:繪制矩形的左邊框位置right:繪制矩形的右邊框位置top:繪制矩形的上邊框位置bottom:繪制矩形的下邊框位置color1:左和上的邊框顏色,高8位為空,接下來的24位分別對應(yīng)RGB顏色的8位碼。color2:右和下的邊框顏色,高8位為空,接下來的24位分別對應(yīng)RGB顏色的8位碼。Draw3DRect2定義:voidDraw3DRect2(PDCpdc,structRECTrect,COLORREFcolor1,COLORREFcolor2)功能:繪制指定大小和風格的3D邊框的矩形參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針rect:繪制矩形的位置及大小color1:左和上的邊框顏色,高8位為空,接下來的24位分別對應(yīng)RGB顏色的8位碼。color2:右和下的邊框顏色,高8位為空,接下來的24位分別對應(yīng)RGB顏色的8位碼。GetPenWidth定義:U8GetPenWidth(PDCpdc)功能:返回當前繪圖設(shè)備上下文(DC)畫筆的寬度參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針GetPenMode定義:U32GetPenMode(PDCpdc)功能:返回當前繪圖設(shè)備上下文(DC)畫筆的模式參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針SetPenColor定義:U32SetPenColor(PDCpdc,U32color)功能:設(shè)定畫筆的顏色,返回當前繪圖設(shè)備上下文(DC)畫筆的顏色參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針color:畫筆的顏色,高8位為空,接下來的24位分別對應(yīng)RGB顏色的8位碼。GetPenColor定義:U32GetPenColor(PDCpdc)功能:返回當前繪圖設(shè)備上下文(DC)畫筆的顏色參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針GetBmpSize定義:voidGetBmpSize(charfilename[],int*Width,int*Height)功能:取得指定位圖文件位圖的大小參數(shù)說明:filename[]:位圖文件的文件名Width:位圖的寬Height:位圖的高ShowBmp定義:voidShowBmp(PDCpdc,charfilename[],intx,inty)功能:顯示指定的位圖(Bitmap)文件,到指定的坐標參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針filename[]:顯示的位圖(Bitmap)文件名x,y:顯示位圖的左上角坐標SetDrawOrg定義:voidSetDrawOrg(PDCpdc,intx,inty,int*oldx,int*oldy)功能:設(shè)置繪圖設(shè)備上下文(DC)的原點參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針x,y:設(shè)定的新原點oldx,oldy:返回的以前原點的位置SetDrawRange定義:voidSetDrawRange(PDCpdc,intx,inty,int*oldx,int*oldy)功能:設(shè)置繪圖設(shè)備上下文(DC)的繪圖范圍參數(shù)說明:pdc:指向繪圖設(shè)備上下文(DC)的指針x,y:設(shè)定的橫向、縱向繪圖的范圍,如果x(或者y)為1,則表示x(或者y)方向的比例隨著y(或者x)方向的范圍按比例縮放。如果參數(shù)為-1,表示方向相反oldx,oldy:返回的以前橫向、縱向繪圖的范圍LineToDelay定義:voidLineToDelay(PDCpdc,intx,inty,intticks)功能:在屏幕上畫線。從當前畫筆的位置畫直線到指定的坐標

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論