徐自遠(yuǎn)
【摘要】本文介紹了MDK軟件自帶的基于時間輪轉(zhuǎn)的RTX操作系統(tǒng)在STM32F103RB芯片上的移植方法,并詳細(xì)描述了具體的移植過程和使用方法。并用一個LED輪換閃爍的實例演示了其具體應(yīng)用方法并對其操作系統(tǒng)函數(shù)庫做了簡單介紹。最后通過與其他同類操作系統(tǒng)的橫向比較,分析了其優(yōu)缺點(diǎn)及應(yīng)用范圍。
【關(guān)鍵詞】RT?鄄RTX STM32 嵌入式操作系統(tǒng) MDK Cotex?鄄M3 ARM
【中圖分類號】G64 【文獻(xiàn)標(biāo)識碼】A 【文章編號】2095-3089(2015)12-0248-02
RL?鄄RTX操作系統(tǒng)是MDK官方內(nèi)置的一個實時操作系統(tǒng)。其內(nèi)核是一個基于時間片輪轉(zhuǎn)的實時操作系統(tǒng),可以同時運(yùn)行多函數(shù)或是任務(wù)。在嵌入式系統(tǒng)中嵌入實時操作系統(tǒng)是現(xiàn)在硬件開發(fā)的趨勢,對比前后臺循環(huán)方案與狀態(tài)機(jī)方案其優(yōu)點(diǎn)在于既增加了程序的可讀性,同時又提高了系統(tǒng)運(yùn)行的效率。
1.RL-RTX操作系統(tǒng)介紹
RL?鄄RTX操作系統(tǒng)可以自由地調(diào)度系統(tǒng)資源,比如CPU和內(nèi)存,并且提供一種任務(wù)間通信機(jī)制。 RTX內(nèi)核是一個強(qiáng)大的實時操作系統(tǒng),可以很容易地使用和運(yùn)行基于 ARM7?鄄TDMI、ARM9 或是 Cortex?鄄M3 CPU 內(nèi)核的微控制器。
RTX程序使用標(biāo)準(zhǔn)的C結(jié)構(gòu)編寫,運(yùn)用RealViewR 編譯器進(jìn)行編譯。在RTX.H頭文件定義了RTX函數(shù)以及宏,可以讓輕松地聲明任務(wù)并達(dá)到實時操作系統(tǒng)所有特性。
RL?鄄RTX操作系統(tǒng)內(nèi)核大致可分為任務(wù)管理、任務(wù)調(diào)度器、阻塞管理,任務(wù)間通訊管理,定時器管理,設(shè)備底層驅(qū)動6個部分。
2.STM32F103RBT6芯片介紹
STM32系列處理器是為高性能、低成本、低功耗的嵌入式應(yīng)用專門設(shè)計的ARM Cortex?鄄M3內(nèi)核芯片。本文應(yīng)用的STM32F103RBT6芯片為64腳LQFP64封裝。其工作頻率可高達(dá)72MHZ,具有128KB flash, 20KB SRAM 1個CAN總線,1個USB2.0接口,2個SPI,2個I2C接口,資源較為豐富。
3.RL?鄄RTX操作系統(tǒng)在STM32F103RBT6芯片上的移植
本次操作系統(tǒng)移植是基于RL?鄄RTX 4.05版進(jìn)行的。移植操作系統(tǒng)使用軟件編譯環(huán)境為Keil MDK 4.12版。下面對移植過程做詳細(xì)介紹。
1)安裝MDK軟件
從官網(wǎng)下載Keil MDK 4.12版并注冊安裝。
2)下載STM32固件庫工程
在ST官網(wǎng)下載STM32F10x_StdPeriph_Lib_V3.5.0,使用其中工程作為工程模版。
3)建立GPIO工程
依據(jù)ST官方庫的例子,建立一個GPIO/IOToggle 工程。修改IO端口配置與實際使用電路板的IO端口相對應(yīng)。編譯并運(yùn)行成功。
4)移植RTX_Kernel
RTX_Kernel操作系統(tǒng)移植步驟如下:
3.1在main.c最前頭文件引用列中加入“#include
3.2項目選項里,在Target下,Operating system選擇 RTX Kernel。
3.3復(fù)制C:\Keil\ARM\Boards\ST\STM32F10X_EVAL\
RTX_Blinky\RTX_Config.c文件到項目目錄下,并將RTX_Config.c添加到項目中。(MDK安裝在默認(rèn)目錄C盤)
3.4在RTX_Config.c根據(jù)硬件條件配置操作系統(tǒng)參數(shù)
操作系統(tǒng)參數(shù)有很多,在C文件中尋找修改較為復(fù)雜,MDK4.12中可以通過向?qū)砼渲貌僮飨到y(tǒng)的各個參數(shù),其步驟為:①打開RTX_Config.c文件,文件編輯框下方有一個Configuration Wizard選項,點(diǎn)擊它可以看到任務(wù)參數(shù)選項。如圖1所示。
圖 1 任務(wù)參數(shù)配置向?qū)?/p>
①Number of concurrent running tasks 設(shè)置運(yùn)行任務(wù)數(shù)
此選項范圍為0~250個任務(wù),默認(rèn)為6個運(yùn)行任務(wù)。該數(shù)值定義了可同時運(yùn)行的最大任務(wù)數(shù)量,若設(shè)置任務(wù)超過此數(shù)量,則最后一個創(chuàng)建的任務(wù)不會運(yùn)行。
②Number of tasks with user?鄄provided stack 用戶定義堆棧的任務(wù)數(shù)量
此選項范圍為0~250個任務(wù),默認(rèn)為0。此選項可定義一些需要開啟更大堆棧區(qū)域的任務(wù)。
③Task stack size 任務(wù)堆棧區(qū)域大小設(shè)置
范圍為200~4096字節(jié),默認(rèn)堆棧大小為200字節(jié)。此選項為每個任務(wù)分配獨(dú)立的堆棧區(qū)域空間,RTX_Kernel為私有堆棧任務(wù)系統(tǒng),每個任務(wù)有自己私有堆棧區(qū)域,并非像RTX51一樣為公有堆棧任務(wù)系統(tǒng)。若在系統(tǒng)運(yùn)行中出現(xiàn)堆棧區(qū)域溢出的情況則需要增大此參數(shù)。
④Check for the stack overflow 檢查堆棧溢出
注:開啟堆棧溢出檢查的話,會使系統(tǒng)性能降低,建議調(diào)試時開啟,程序調(diào)試完畢后關(guān)閉此選項。
⑤Run in privileged mode運(yùn)行在特權(quán)模式
⑥Timer clock value設(shè)置當(dāng)前MCU運(yùn)行頻率
范圍為1?鄄1000000000HZ,默認(rèn)為6MHz,由于在本系統(tǒng)中使用時鐘頻率為48MHz,所以設(shè)置其為48000000。
⑦Timer tick value為RTX時間片時間
范圍為1?鄄1000000us,默認(rèn)為10000us,即10ms一個時間片,可以修改此參數(shù)來改變?nèi)蝿?wù)輪轉(zhuǎn)的速度。
⑧Round?鄄Robin Task switching 任務(wù)時間片耗盡自動切換開關(guān)
默認(rèn)為開啟。開啟RTX操作系統(tǒng)在某一任務(wù)時間片耗盡后會自動保存本任務(wù)堆棧并切換到其他任務(wù)中去。可點(diǎn)開此選項前的“+”號,在彈出的Round?鄄Robin Timeout 為任務(wù)設(shè)置自動切換時間,默認(rèn)為5個時間片即50ms。
⑨Number of user timers 用戶定時器使用數(shù)
范圍為0~250個,定義可使用的系統(tǒng)定時器數(shù)量。
3.5由于RTX操作系統(tǒng)用到了本芯片中的一些中斷向量,所以要移植RTX操作系統(tǒng)必須在中斷程序stm32f10x_it.c中屏蔽以下三個中斷函數(shù)。其分別是:PendSV_Handler(void),SysTick_Handler(void),SVC_Handler(void)。
至此,RTX系統(tǒng)移植完畢,接下去就能編寫操作系統(tǒng)代碼了。
4.操作系統(tǒng)應(yīng)用實例
圖 2 系統(tǒng)運(yùn)行流程與操作系統(tǒng)運(yùn)行流程對比
操作系統(tǒng)的使用能提高程序編寫的效率,特別是對一些時效管理與系統(tǒng)延時處理方面。使用前后臺循環(huán)編程方式與操作系統(tǒng)運(yùn)行流程對比如圖 4所示。
本次系統(tǒng)移植目標(biāo)是讓兩個LED以不同頻率交替閃爍,要完成此目標(biāo)并讓任務(wù)正常運(yùn)行必須在main.c中添加初始化操作系統(tǒng)的代碼:
1)先在main( )函數(shù)中添加系統(tǒng)初始化函數(shù)os_sys_init (init_task);。用來開啟系統(tǒng)任務(wù)并結(jié)束main函數(shù)的運(yùn)行。此時程序轉(zhuǎn)入init_task任務(wù)中。
2)建立初始化任務(wù)函數(shù)init_task(void)。在程序中編寫初始化函數(shù)init_task( ),區(qū)別于普通的子程序,任務(wù)前需要添加前綴”__task”。在初始化任務(wù)中使用os_tsk_create( )命令創(chuàng)建task1與task2兩個任務(wù),并定義兩個OS_TID型任務(wù)變量id1,id2記錄開啟任務(wù)的返回值。最后使用os_tsk_delete_self ( );命令刪除init_task任務(wù)本身。此時task1,與task2任務(wù)被開啟。操作系統(tǒng)會根據(jù)任務(wù)輪詢機(jī)制依次進(jìn)入task1任務(wù)和task2任務(wù)。
3)建立兩個任務(wù)函數(shù)task1,與task2。
編譯上述代碼,將其下載到目標(biāo)板中,如果LED1與LED2兩個發(fā)光二極管能以不同的頻率閃爍發(fā)光說明移植成功了。
RTX 操作系統(tǒng)的API比較簡單,它是基于時間片來進(jìn)行任務(wù)間輪轉(zhuǎn)調(diào)度的,即相同任務(wù)優(yōu)先級每個任務(wù)分得一定的時間片運(yùn)行時間,運(yùn)行完時間片后保存現(xiàn)場進(jìn)行任務(wù)切換。而其他實時操作系統(tǒng)中uC/OS?鄄II是不支持時間片輪轉(zhuǎn)的,從uC/OS-III開始才支持時間片輪轉(zhuǎn)調(diào)度。
5.RTX操作系統(tǒng)函數(shù)庫簡介
圖 4 RTX 任務(wù)系統(tǒng)組成圖
RTX任務(wù)系統(tǒng)組成圖如圖 4所示。為了深入了解RTX操作系統(tǒng),對下面對每個模塊及其系統(tǒng)函數(shù)做簡單介紹。
(1)任務(wù)創(chuàng)建與調(diào)度:
創(chuàng)建任務(wù):os_tsk_create ( );創(chuàng)建指定任務(wù)。
刪除任務(wù):os_tsk_delete_self ( );刪除任務(wù)本身。
延時: os_dly_wait( ),延時指定數(shù)目的系統(tǒng)節(jié)拍事件。
任務(wù)切換:os_tsk_pass( ),跳出當(dāng)前正在運(yùn)行的任務(wù)。
(2)事件管理:os_evt_wait_and( ), os_evt_wait_or( ), os_evt_set(),isr_evt_set( )
讓一個進(jìn)程等待一個事件,這個事件可以由其它進(jìn)程和中斷觸發(fā)。
(3)郵箱管理:os_mbx_declare( ), os_mbx_init( ),os_mbx_wait( ),os_mbx_send( ), isr_mbx_send( ),建立一個郵箱,里面可以存放一定數(shù)目的消息(比如20條)。進(jìn)程可以等待郵箱隊列,如果郵箱里有消息,則取出,進(jìn)程繼續(xù)執(zhí)行;如果郵箱為空,則繼續(xù)等待。
(3)互斥管理:os_mut_init ( ),os_mut_wait( ) //上鎖,os_mut_release( )//解鎖
設(shè)置進(jìn)程獨(dú)占資源,加鎖,別的進(jìn)程需要等待本進(jìn)程,本進(jìn)程不會被時間輪轉(zhuǎn)切換。
(4)信號量管理:os_sem_init( ), os_sem_send( ), os_sem_wait( ), isr_sem_send( )
信號量與事件類似,進(jìn)程等待的信號量大于0時,進(jìn)程繼續(xù)執(zhí)行,信號量-1。發(fā)送信號量時,信號量+1.
6.RTX操作系統(tǒng)與其他幾種操作系統(tǒng)需求對比
FLASH和RAM的需求對比
RTX是一款優(yōu)秀的基于時間輪轉(zhuǎn)片的微內(nèi)核操作系統(tǒng),適合FLASH和ROM資源不是很足的芯片,特別適合是對成本有要求,無擴(kuò)展ROM和RAM芯片的單片系統(tǒng)中使用。
RTX的使用要比uC/OS容易,如果在Cortex?鄄M3芯片中使用實時操作系統(tǒng)的話,其優(yōu)勢較為明顯。
參考文獻(xiàn):
[1]《STM32自學(xué)筆記》蒙博宇編著, 北京市:北京航空航天大學(xué)出版社, 2012.
[2]《STM32嵌入式微控制器快速上手》陳志旺等編著, 北京市:電子工業(yè)出版社, 2012.