1 MDK RL—RTX和COrtex—M3概述 MDK開發(fā)套件源自德國(guó)Keil公司,是ARM公司目前最新推出的針對(duì)各種嵌入式處理器的軟件開發(fā)工具。MDKRL—IUX是一個(gè)實(shí)時(shí)操作系統(tǒng)(RTOS)內(nèi)核,完全集成在MDK編譯器中。廣泛應(yīng)用于ARM7、ARM9和Cortex-M3設(shè)備中。它可以靈活解決多任務(wù)調(diào)度、維護(hù)和時(shí)序安排等問題。基于RL—I訂X的程序由標(biāo)準(zhǔn)的C語言編寫,由Real—View編譯器進(jìn)行編譯。操作系統(tǒng)依附于C語言使聲明函數(shù)更容易,不需要復(fù)雜的堆棧和變量結(jié)構(gòu)配置,大大簡(jiǎn)化了復(fù)雜的軟件設(shè)計(jì),縮短了項(xiàng)目開發(fā)周期。 Cortex—M3是一個(gè)32位的核。它是首個(gè)基于ARMv7M架構(gòu),主要針對(duì)價(jià)格敏感但又具備高系統(tǒng)效能需求的嵌入式應(yīng)用設(shè)計(jì),如微控制器、汽車車體系統(tǒng)及網(wǎng)絡(luò)裝置等。它內(nèi)核緊湊,性能更高,采用了Thumb一2指令集架構(gòu),中斷時(shí)間更短,標(biāo)準(zhǔn)化內(nèi)存映射,帶有內(nèi)置SysTick的集成式NVIC。 SysTick能定期地產(chǎn)生異常請(qǐng)求,作為系統(tǒng)的時(shí)基,計(jì)時(shí)更準(zhǔn)確。 MDK RL—RTX和Cortex—M3都源自ARM公司。ARM公司將其無縫整合在MDK開發(fā)套件中,因此將RL—RTX移植到Cortex—M3上非常適合。RL—RTX作為一個(gè)全功能的內(nèi)核,可以結(jié)合實(shí)時(shí)軟件庫中的其他組件。例如,加入實(shí)時(shí)庫中RL—Flasht文件系統(tǒng)組件,就可以讀寫標(biāo)準(zhǔn)SD卡和 MMC卡上面的文件;加入RL—TCPnet組件,可應(yīng)用于HTTP Web,ServeI’、TFTP Server和SMTP Client等。可擴(kuò)展性強(qiáng),應(yīng)用廣泛。 2 基于COrtex—M3硬件平臺(tái)的構(gòu)建 STM32F103VB是ST公司基于Cortex—M3的處理器。它有1個(gè)128 KB Flash,1個(gè)20 KB SRAM,4個(gè)16位定時(shí)器,100個(gè)可編程的I/0引腳,具有I2C、SPI、USB、15SART和CAN接口,2路10通道12位A/D轉(zhuǎn)換器,RTC功能模塊,WDT功能和高級(jí)電源管理功能。 系統(tǒng)的數(shù)據(jù)緩存RAM和程序存儲(chǔ)器Flash為芯片自帶,系統(tǒng)外接A/D轉(zhuǎn)換器構(gòu)成控制器。基于Cortex-M3核的最小系統(tǒng)框圖如圖1所示。 基于該平臺(tái),設(shè)計(jì)一個(gè)超溫報(bào)警器。使用美國(guó)半導(dǎo)體Dalias公司的智能溫度傳感器DS18820采樣,LCD顯示溫度數(shù)值,如果短時(shí)間內(nèi)溫度超出正常溫度,蜂鳴器發(fā)出100 dB警報(bào)且LED燈閃爍示警。可以進(jìn)一步在該平臺(tái)上進(jìn)行擴(kuò)展,加入GPS和GPRS模塊,當(dāng)溫度超出設(shè)定范圍時(shí),GPS將現(xiàn)場(chǎng)經(jīng)緯度以及時(shí)間通過GPRS 以短信方式發(fā)送給監(jiān)控中心,GPRS模塊自動(dòng)撥打有關(guān)人員移動(dòng)電話或固定電話報(bào)警。 3 MDK RL—RTX的配置與移植 RL—RTX在任務(wù)管理方面不僅支持搶先式任務(wù)切換,而且支持時(shí)間片輪轉(zhuǎn)切換。在基于時(shí)間片的輪轉(zhuǎn)任務(wù)機(jī)制下,CPIJ的執(zhí)行時(shí)間被劃分為若干時(shí)間片,由 RL—RTX分配一個(gè)時(shí)間片給每個(gè)任務(wù),在該時(shí)間片內(nèi)只執(zhí)行這個(gè)任務(wù)。當(dāng)時(shí)間片到,在下一個(gè)時(shí)間片中無條件地執(zhí)行另外一個(gè)任務(wù)。所有任務(wù)都輪詢一次后,再回頭執(zhí)行第一個(gè)任務(wù)。 RL—RTX最多可以定義256個(gè)任務(wù),所有任務(wù)都可以同時(shí)激活成為就緒態(tài)。RL—RTX用戶任務(wù)具有表1所列的幾個(gè)狀態(tài)。 一般情況下,任務(wù)切換由時(shí)間片控制,但有時(shí)需要用事件控制任務(wù)切換。RL—RTX事件主要有超時(shí)(Timeout)、間隔(Interval)和信號(hào) (Signal)三種。 Timeout:掛起運(yùn)行任務(wù)指定數(shù)量的時(shí)鐘周期,調(diào)用OS_DLY_WAIT函數(shù)的任務(wù)將被掛起,直到延時(shí)結(jié)束才返回到Ready狀態(tài),并可被再次執(zhí)行。延時(shí)時(shí)間由SysTick衡量,可以設(shè)置從1至OxFFFE的任何值。 Interval:時(shí)間間隔,任務(wù)在該時(shí)間間隔中不運(yùn)行,該時(shí)問間隔與任務(wù)執(zhí)行時(shí)間獨(dú)立。 Signal:用于任務(wù)間通信,可以用系統(tǒng)函數(shù)進(jìn)行置位或復(fù)位。如果一個(gè)任務(wù)調(diào)用了wait函數(shù)等待Signal未置位,則該任務(wù)被掛起直到Signal 置位,才返回READY狀態(tài),可再被執(zhí)行。 RL—RTX中主要的系統(tǒng)函數(shù)說明如表2所列。 RL—RTX為每個(gè)任務(wù)都分配了一個(gè)單獨(dú)的堆棧區(qū),各個(gè)任務(wù)所用堆棧位置是動(dòng)態(tài)的,用task_id記錄各堆棧棧底位置。有多個(gè)嵌套子程序調(diào)用或使用大量的動(dòng)態(tài)變量時(shí),自由空間會(huì)被用完。使能棧檢查(Stack Checking),系統(tǒng)會(huì)執(zhí)行OS_STK_0VERFLOW()堆棧錯(cuò)誤函數(shù)進(jìn)行堆棧出錯(cuò)處理。RL—RTX堆棧管理如圖2所示。 RL—RTX選擇Cortex上定時(shí)器1產(chǎn)生周期性中斷,相鄰中斷之間的時(shí)間就是時(shí)間片的長(zhǎng)度。在其中斷服務(wù)程序中進(jìn)行任務(wù)調(diào)度,并判斷執(zhí)行了延遲函數(shù)的任務(wù)的延時(shí)時(shí)間是否到。這種周期性的中斷形成了RL—RTX的時(shí)鐘節(jié)拍。采用Cortex—M3的處理器STM32F103VB的CPU時(shí)鐘頻率為72 MHz,VPBDIV分頻值為4,輸出的時(shí)鐘頻率為18 MHz。系統(tǒng)推薦的時(shí)間片為1~lOO ms。 使用RL—RTX,包含以下幾個(gè)步驟: 第1步,由于RL—RTX集成在MDK開發(fā)套件中,在使用MDK創(chuàng)建工程后,需要在工程中添加RTX內(nèi)核選項(xiàng)。選擇Project→Options for Target,在Operating下拉框中選擇RTX內(nèi)核,使得在編譯時(shí)把RL—RTX所需的庫編譯進(jìn)去。 第2步,在嵌入式應(yīng)用程序的開發(fā)中使用RL—RTX內(nèi)核,須對(duì)其進(jìn)行配置。復(fù)制\Keil\ARM\Startup目錄下RTX_Config.c文件到工程文件夾并添加到工程中。該文件中,部分配置參數(shù)說明如表3所列。 基于Cortex—M3平臺(tái)的超溫報(bào)警器,可以設(shè)計(jì)3個(gè)任務(wù)并發(fā),分別進(jìn)行數(shù)據(jù)采集、數(shù)據(jù)處理和數(shù)據(jù)顯示。3個(gè)任務(wù)較小,系統(tǒng)安排的任務(wù)棧足夠使用,棧的容量以32位無符號(hào)整型定義,容量為64字。選擇硬件平臺(tái)片上定時(shí)器1。 DSl8820具有300 ms的更新速率,在采集數(shù)據(jù)過程中,通過多次采集取平均值,數(shù)據(jù)采集任務(wù)執(zhí)行的時(shí)間為30 ms,數(shù)據(jù)處理任務(wù)執(zhí)行時(shí)間為40 ms,數(shù)據(jù)顯示任務(wù)執(zhí)行時(shí)間為20 ms。根據(jù)公式,對(duì)響應(yīng)時(shí)間的要求:t(響應(yīng)時(shí)間)=N(進(jìn)程數(shù)目)×q(時(shí)間片)。總體響應(yīng)時(shí)間為90 ms,進(jìn)程數(shù)目為3,因此時(shí)間片設(shè)置為30 ms合適。在任務(wù)OS_IDLE_DEMON()中添加休眠代碼,空閑時(shí)系統(tǒng)休眠,降低功耗。 第3步,復(fù)制\Keil\ARM\Startup下Retarget.c文件到工程文件夾中,并添加到工程中。 修改文件,使其包含如下內(nèi)容: 該文件的目的是避免半主機(jī)方式軟件中斷,因?yàn)檫@時(shí)所有中斷都由RL—RTX統(tǒng)一管理。半主機(jī)是用于ARM目標(biāo)的一種機(jī)制,可將來自應(yīng)用程序代碼的輸入/輸出請(qǐng)求傳送至運(yùn)行調(diào)試器的主機(jī)。它由一組已定義的SWI操作來實(shí)現(xiàn)。庫函數(shù)調(diào)用相應(yīng)的SWI(軟件中斷),然后調(diào)試代理程序處理SWI異常,并提供所需的與主機(jī)之間的通信。 4 應(yīng)用設(shè)計(jì) 4.1 多任務(wù)應(yīng)用設(shè)計(jì) 根據(jù)圖1所示的最小系統(tǒng)框圖,采用由表及里 (out—side-in approach)分解應(yīng)用的方法設(shè)計(jì)多任務(wù)。該應(yīng)用的上下文框圖如圖3所示,中間的圈表示軟件應(yīng)用,矩形框表示應(yīng)用的輸入和輸出設(shè)備。箭頭標(biāo)有具體含義名,表示輸入和輸出通信的流程。 根據(jù)上下文框圖以及避免“資源沖突”原則,將對(duì)同一個(gè)外設(shè)的訪問放在同一個(gè)設(shè)備中,無論何時(shí)切換任務(wù),都不會(huì)對(duì)任何獨(dú)立的“外設(shè)”造成影響。 將應(yīng)用分解為4個(gè)任務(wù),RL—RTX的第一個(gè)任務(wù)必須是系統(tǒng)任務(wù)Init Task,該任務(wù)用來初始化其他3個(gè)任務(wù),任務(wù)創(chuàng)建完畢后,3個(gè)任務(wù)都處于READY狀態(tài);第2個(gè)任務(wù)t_phase_ADC Task用來讀取A/D采樣的數(shù)據(jù);第3個(gè)任務(wù)t_phase_DEA Task用來處理采樣的數(shù)據(jù);第4個(gè)任務(wù)t_phase_DIS Task用來將數(shù)據(jù)送到LCD液晶屏上,顯示、控制LED燈閃爍和蜂鳴器高頻報(bào)警。圖4顯示了任務(wù)觸發(fā)的流程。 定義任務(wù): 使用os_tsk_create創(chuàng)建任務(wù)t_phase_ADC、t_phase_DEA、t_phase_DIS。 os_tsk_delete_self刪除自身任務(wù),實(shí)現(xiàn)任務(wù)切換。任務(wù)的創(chuàng)建和初始化是在主函數(shù)中定義的: 任務(wù)初始化完畢后,3個(gè)任務(wù)都處于就緒狀態(tài)。t_phase_ADC任務(wù)用來采樣,多次采樣取平均值,通過給任務(wù)t_phase_DEA發(fā)信號(hào) signal_func(t_phase_DEA),喚醒t_phase_DEA任務(wù)。 os_evt_wait_and進(jìn)行控制。該任務(wù)判斷采樣的數(shù)據(jù)是否在警戒溫度范圍內(nèi),如果出現(xiàn)溫度異常,置標(biāo)志位為1。執(zhí)行完自身任務(wù)后,通過 signal_func(t_phase_DIS),將喚醒t_phase_DIS任務(wù)。 t_phase_DIS任務(wù)用來在LCD液晶屏上顯示溫度值。如果發(fā)現(xiàn)標(biāo)志位為1,則LED燈閃爍和蜂鳴器高頻報(bào)警。 4.2 應(yīng)用設(shè)計(jì)測(cè)試 采用基本RMA可調(diào)度性測(cè)試。式1用來完成系統(tǒng)的基本RMA可調(diào)度性測(cè)試。 這里:Ci為與周期性任務(wù)i相關(guān)的最壞執(zhí)行時(shí)間,Ti為與任務(wù)i相關(guān)的周期,n為任務(wù)的個(gè)數(shù)。 U(n)是利用系數(shù),式1的右邊是理論處理器利用率的上界。如果給定一組任務(wù),其處理器利用率小于理論利用率上界,則這組任務(wù)是可調(diào)度的。U的值隨n的增加而下降;當(dāng)n的值為無限時(shí),最終收斂于69%。 表4總結(jié)了使用RMA進(jìn)行調(diào)度的3個(gè)任務(wù)的特性。 使用式1,該應(yīng)用設(shè)計(jì)處理器利用率計(jì)算如下: 應(yīng)用設(shè)計(jì)總的利用率是27.42%,低于78%的理論邊界。此4個(gè)任務(wù)的系統(tǒng)是可調(diào)度的,該應(yīng)用設(shè)計(jì)是成功的。 結(jié)語 本文描述了如何在Cortex—M3上使用MDK RL—RTX的方法,并給出了一個(gè)簡(jiǎn)單的多任務(wù)應(yīng)用設(shè)計(jì)。可以看出多任務(wù)的程序設(shè)計(jì)被大大簡(jiǎn)化了,它不但滿足多個(gè)任務(wù)的時(shí)間要求,降低了開發(fā)難度,而且程序的可讀性和可維護(hù)性也有了很大的提高。利用MDK RL—RTX構(gòu)建的嵌入式工業(yè)控制系統(tǒng)具有成本低、性能高等特點(diǎn),應(yīng)用廣泛,有著良好的發(fā)展前景。 參考文獻(xiàn) 1. 李寧 ARM 開發(fā)工具RealView MDK使用入門 2008 2. 任哲 ARM 體系結(jié)構(gòu)及其嵌入式處理器 2008 3. Cesar Marquez Chin Identification of arm movements using correlation of electrocorticographic spectral components and kinematic recordings 2007(2) 4. 查看詳情 5. Li Qing Real-time concepts for Embedded Systems 2003 作者:武漢理工大學(xué) 方安平 武永誼 來源:單片機(jī)與嵌入式系統(tǒng)應(yīng)用 2008 (12) |