徐自遠



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