ARM是目前嵌入式領(lǐng)域中應(yīng)用最廣泛的RISC微處理器結(jié)構(gòu),,以低成本、低功耗,、高性能的特點(diǎn)占據(jù)了嵌入式系統(tǒng)應(yīng)用領(lǐng)域的領(lǐng)先地位,,已遍及工業(yè)控制、消費(fèi)類電子產(chǎn)品,、通信系統(tǒng),、網(wǎng)絡(luò)系統(tǒng)、無線系統(tǒng)等各類產(chǎn)品市場,。STM32F103VB是基于ARM新內(nèi)核Cortex-M3的通用微處理器,,STM32V評估板是基于該芯片的學(xué)習(xí)板并集成了仿真調(diào)試器(Ulink_Me),可以方便用戶快速學(xué)習(xí)和開發(fā)用戶程序,。目前常見的嵌入式系統(tǒng)有:WinCE,、Linux、pSoS,、VxWorks和μC/OS-II等,。μC/OS-Ⅱ是專門為嵌入式系統(tǒng)應(yīng)用設(shè)計的,,具有源碼公開、實時性好,、可移植裁剪,、高效穩(wěn)定和教學(xué)科研免費(fèi)使用等特點(diǎn),已經(jīng)成功移植到8,、16,、32和64位等多種微處理器上,廣泛應(yīng)用于照相攝影,、醫(yī)療器械,、音響設(shè)備、工業(yè)機(jī)器人控制,、發(fā)動機(jī)控制,、航空器、高速公路電話系統(tǒng),、自動提款機(jī)等眾多領(lǐng)域,。這里以STM32V評估板為硬件開發(fā)平臺,結(jié)合μC/OS-II嵌入式操作系統(tǒng),,設(shè)計了基于信號量,、消息郵箱的串口通信應(yīng)用程序。
1 信號量,、消息郵箱
μC/OS-II由事件(Event)驅(qū)動,,一般事件包括信號量(Semaphores),、互斥信號量(Mutex semaphores),、消息郵箱(Message Mail boxes)、消息隊列(Message Query),、事件標(biāo)志組(Event Flag Group)等,。其中信號量和消息郵箱作為一種常見的通信機(jī)制,在數(shù)據(jù)通信過程中應(yīng)用最為廣泛,。
1.1 信號量(Semaphores)
μC/OS-II的信號量由2部分組成:一個是信號的計數(shù)值(0~65 535),;另一個是由等待該信號量的任務(wù)組成的等待任務(wù)列表。信號量可用于以下場合:允許一個任務(wù)與其他任務(wù)或中斷同步,;取得共享資源的使用權(quán)(滿足互斥條件),;標(biāo)志事件的發(fā)生。
對信號量一般可以實施以下3種操作:初始化(INITIALIZE)信號量或者稱為創(chuàng)建信號量(CREATE),;等待信號量(WAIT)或者稱為掛起信號量(PEND),;發(fā)送信號量(POST)。
信號量在初始化過程中需要給信號量賦初值,,等待信號量的任務(wù)表(WAWING LIST)應(yīng)清為空,。信號量的使用需要調(diào)用相應(yīng)的函數(shù)并配置其相關(guān)的宏定義,,具體如表1所示。
1.2 消息郵箱(Message Mail boxes)
消息郵箱能使任務(wù)或中斷服務(wù)向另外一個任務(wù)發(fā)送一個指針型的變量,,這個指針指向一個包含指定“消息”的數(shù)據(jù)結(jié)構(gòu),。消息郵箱發(fā)送的不是消息本身,而是消息的地址指針,。
消息郵箱可用于通知一個事件發(fā)生或作為二值信號量使用,。消息郵箱的工作原理是郵箱在初始化時建立一個等待消息的任務(wù)列表,當(dāng)郵箱為空時,,等待消息的任務(wù)就掛起,,并且被加入到等待消息的任務(wù)列表中。當(dāng)郵箱收到消息時,,等待任務(wù)列表中優(yōu)先級最高的任務(wù)或者最先等待消息的任務(wù)得到消息,,且轉(zhuǎn)入就緒并從任務(wù)列表中清除。
對消息郵箱的操作一般有3種:郵箱初始化(INITIALIZE),,或者稱為建立郵箱(CREATE),;發(fā)送消息給郵箱(POST);等待消息進(jìn)入郵箱(PE-ND),;無等待請求郵箱消息(ACCEFT),。
消息郵箱的使用需要調(diào)用相應(yīng)的函數(shù)并配置其相關(guān)的宏定義,具體如表2所示,。
2 硬件開發(fā)設(shè)計
2.1 硬件開發(fā)平臺
以STM32V評估板為硬件開發(fā)平臺,,該評估板采用ST公司32位ARM微處理器STM32F103VB,該芯片最大時鐘頻率72 MHz,,內(nèi)置大容量存儲器包括128 KB的高速Flash和20 K的SRAM,,豐富的外設(shè)接口:80個高速I/O接口,3個USART,,2個I2C,,2個SPI,7通道的DMA,,RTC等,。STM32V開發(fā)板將這些外設(shè)接口全部引出,自帶LCD液晶顯示并集成調(diào)試工具,,用戶可方便設(shè)計,、調(diào)試和查看程序運(yùn)行結(jié)果等。評估板功能模塊組成如圖1所示,,主要包括以下部分:模擬輸入信號部分,、跳線配置、USB電源供給、液晶顯示,、串口通信,、CAN通信、復(fù)位/輸入按鈕,、LED顯示和SD卡存儲,。
2.2 通信電路
計算機(jī)與外界的信息交換稱為通信。通信基本方式分為串行通信和并行通信兩種,。串行通信是指一個數(shù)據(jù)是逐位順序傳送的通信方式,,串行通信有同步和異步兩種基本的通信方式。
其中,,同步通信是通過同步時鐘來實現(xiàn)發(fā)送和接收數(shù)據(jù)的同步,。而異步通信規(guī)定了字符數(shù)據(jù)的傳送格式,即每個數(shù)據(jù)以相同的幀格式傳送,。每一幀信息由起始位,、數(shù)據(jù)位、奇偶校驗位和停止位組成,。依據(jù)起始位在每個字符數(shù)據(jù)開始時使發(fā)送和接收同步,,停止位則作為字符結(jié)束的標(biāo)志。
PC機(jī)的串行通信接口采用的是EIA RS-232E標(biāo)準(zhǔn)串行通信協(xié)議,。在本設(shè)計中,,主控芯片STM32F103VB的接口采用TTL電平,規(guī)定0~0.8 V為“0”電平,,2~5V為“1”電平,,它不能直接與PC機(jī)標(biāo)準(zhǔn)串行通信接口連接,必須設(shè)計TTL電平到RS-232協(xié)議電平信號的轉(zhuǎn)換電路,。串口RS-232電平與STM32F103VB微處理器TTL電平轉(zhuǎn)換由開發(fā)板上的ST3232完成,,接口電路如圖2所示。
3 軟件開發(fā)設(shè)計
選擇RealView MDK軟件作為開發(fā)工具,,它是針對各種嵌入式處理器開發(fā)的軟件開發(fā)工具,。與ARM之前的工具包ADS等相比,,RealView編譯器可將代碼密度提高10%,,性能改善20%,并且支持ARM7,、ARM9和最新的Cortex-M3核處理器,。編程語言可以使用C或者C++語言,支持在線調(diào)試,。
嵌入式實時操作系統(tǒng)μC/OS-Ⅱ可以管理256個任務(wù),,除了系統(tǒng)任務(wù)外,用戶應(yīng)用程序最多可以有248個任務(wù),而中斷嵌套的層數(shù)最多也可以到255層,。任務(wù)創(chuàng)建過程包含了任務(wù)堆棧大小的設(shè)置,、優(yōu)先級分配以及在通信或保持同步過程中使用的信號量和郵箱。在STM32V評估板上通過RS232接口實現(xiàn)了評估板與PC機(jī)的通信,,軟件設(shè)計流程如圖3所示,,在完成相應(yīng)的初始化之后,創(chuàng)建程序設(shè)計中用到的信號量和消息郵箱,,緊接著需要創(chuàng)建應(yīng)用任務(wù),,最后啟動系統(tǒng)。
由該流程圖可以看出:本程序設(shè)計中創(chuàng)建了4個任務(wù),,即LED顯示任務(wù),,液晶顯示任務(wù),串口數(shù)據(jù)發(fā)送任務(wù)和數(shù)據(jù)發(fā)送控制任務(wù),。每一個任務(wù)都要有相應(yīng)的優(yōu)先級和任務(wù)堆??臻g,程序設(shè)計中每個任務(wù)的堆??臻g為512個字節(jié),,優(yōu)先級依次為11,13,,4,,6。
ST公司用標(biāo)準(zhǔn)的ANSI C封裝了ARM微處理器中各個功能寄存器,,為用戶應(yīng)用程序的開發(fā)提供了豐富的固件庫(Firmware),。固件庫方便用戶對底層微處理器外設(shè)進(jìn)行初始化配置,如串口初始化函數(shù)為void USARTConfigurtion(void),,具體代碼如下:
初始化操作包括了時鐘初始化,、中斷初始化,I/O接口初始化,,串口初始化等,。主程序在完成初始化操作后創(chuàng)建信號量、消息郵箱和任務(wù)創(chuàng)建,。由于信號量,、郵箱都是事件類型,所以需用OS_EV-ENT來定義,,信號量,、郵箱的建立由函數(shù)App_EventCreate()完成。
使用信號量和消息郵箱可以保持任務(wù)之間的通信的同步,,串口數(shù)據(jù)發(fā)送任務(wù)App_TaskSendata(void-*p_arg)發(fā)送信號量App_UserIFSem通知數(shù)據(jù)發(fā)送控制任務(wù)App_TaskSendata Ctrl(void*p_arg),,數(shù)據(jù)發(fā)送控制任務(wù)在接收到信號量App_User IFSem后,,發(fā)送消息(www.Real Vie-w.com\n)給指定郵箱App_UserIFMbox,串口調(diào)用數(shù)據(jù)發(fā)送函數(shù)USART_Send Data(),,串口數(shù)據(jù)發(fā)送任務(wù)數(shù)據(jù)發(fā)送完成后發(fā)送通知信號量App_ UserIFSeml給數(shù)據(jù)發(fā)送控制任務(wù),,數(shù)據(jù)發(fā)送控制任務(wù)在接收到發(fā)送完成信號量App_UserIFSeml后,向指定郵箱發(fā)送另一則消息(www.xust. edu.cn\n),,數(shù)據(jù)發(fā)送任務(wù)在接收到消息郵箱后通過串口發(fā)送接收到的消息內(nèi)容給PC機(jī),。具體代碼如下:
圖4為串口通信波特率設(shè)定為9 600 bps和115 200 bps時,在串口小助手中觀察到的程序運(yùn)行后的測試結(jié)果,,結(jié)果表明程序按照預(yù)先設(shè)定好的發(fā)送要求不斷向PC機(jī)發(fā)送數(shù)據(jù),,并且通信穩(wěn)定,在測試過程中未出現(xiàn)亂碼和通信異常中斷情況,,程序設(shè)計達(dá)到了預(yù)期目標(biāo),。通常在工業(yè)現(xiàn)場實際應(yīng)用中需要保證數(shù)據(jù)傳輸?shù)目煽啃裕话愣夹枰跀?shù)據(jù)的發(fā)送和接收端對數(shù)據(jù)進(jìn)行相應(yīng)的數(shù)據(jù)校驗,,常見的數(shù)據(jù)校驗算法是CRC校驗,,可以采用8或16位的CRC校驗方式。在該通信過程中并未使用校驗算法來檢測數(shù)據(jù)傳輸?shù)囊恢滦?,若在?shù)據(jù)傳輸過程中添加相應(yīng)的CRC校驗算法,,就可以最大程度地減少數(shù)據(jù)傳輸?shù)恼`碼率,保證數(shù)據(jù)傳輸?shù)臏?zhǔn)確性,。在后期的研究學(xué)習(xí)中也可以嘗試將其應(yīng)用于工業(yè)現(xiàn)場以測試其工作的可靠性,。
4 結(jié)論
本文以STM32V評估板為硬件開發(fā)平臺,結(jié)合μC/OS-II嵌入式操作系統(tǒng)中信號量和消息郵箱,,設(shè)計了基于信號量,、消息郵箱的串口通信應(yīng)用程序,并通過實驗驗證了該串口應(yīng)用程序在保證任務(wù)間通信同步情況下,,數(shù)據(jù)傳輸具有較好的穩(wěn)定性和可靠性,,達(dá)到了程序設(shè)計預(yù)期目標(biāo)。