【RTX操作系统教程】第5章 RTX操作系统库方式移植(超级简单)
第5章 RTX操作系統(tǒng)庫方式移植(超級簡單)
原文來源:http://forum.armfly.com/forum.php?mod=viewthread&tid=16596&highlight=RTX%B2%D9%D7%F7%CF%B5%CD%B3%BD%CC%B3%CC
本章教程為大家將介紹RTX操作系統(tǒng)庫方式移植,庫方式的移植超級簡單,應該是所有RTOS里面最簡單的了,僅需簡單的兩步就可以完成。
本章教程含Cortex-M3內核的STM32F103的移植和Cortex-M4內核的STM32F407移植。
5.1移植前準備工作說明
5.2 STM32F103移植RTX系統(tǒng)
5.3 STM32F407移植RTX系統(tǒng)
5.4 總結
5.1移植前準備工作說明
1. RTX系統(tǒng)軟件開發(fā)平臺僅支持MDK,建議使用MDK4.74,因為后面的例子都是以MDK4.74為平臺。
2. 找一個簡單的工程,最好是跑馬燈之類的,越簡單越好,我們就在這個簡單的工程上面移植即可。
3. 大家使用的簡單工程里面不能有SysTick,PendSV和SVC三個系統(tǒng)中斷的使用,因為RTX系統(tǒng)要使用這三個中斷。
5.2STM32F103移植RTX系統(tǒng)
5.2.1 RTX操作系統(tǒng)移植
首先準備好一個簡單的裸機工程模板,工程模板的制作就不做講解了,這里的重點是教大家移植RTX系統(tǒng)。準備好的工程模板如下圖5.1所示(大家也可以制作其它任意的工程模板,不限制):
圖5.1 工程模板
準備好工程模板后,就可以開始移植了,移植過程比較簡單,需要兩步就可以完成了:
u第1步:使能RTX
u第2步:添加RTX系統(tǒng)的配置文件,配置文件在MDK的安裝目錄C:\Keil_v474\ARM\RL\RTX\Config
下面,文件名RTX_Conf_CM.c,下面將這個文件復制到MDK工程的User文件夾下面,并添加到MDK工程上
通過這兩步,RTX操作系統(tǒng)的移植就完成了。
5.2.2 RTX操作系統(tǒng)配置說明
RTX操作系統(tǒng)的配置工作是通過配置文件RTX_Conf_CM.c實現(xiàn)。在MDK工程中打開文件RTX_Conf_CM.c,可以看到如下圖5.2所示的工程配置向導:
圖5.2 RTX的配置向導
uTask Configuration
lNumber of concurrent running tasks
參數(shù)范圍0 – 250
表示同時運行的最大任務數(shù),這個數(shù)值一定要大于等于用戶實際創(chuàng)建的任務數(shù),空閑任務不包含在這個里面。比如當前的數(shù)值是6,就表示用戶最多可以創(chuàng)建6個任務。
lNumber of tasks with user-provided stack
參數(shù)范圍0 – 250
表示自定義任務堆棧的任務數(shù),如果這個參數(shù)定義為0的話,表示所有的任務都是使用的配置向導里面第三個參數(shù)Task statck size大小。比如:
Numberof concurrent running tasks = 6
Numberof tasks with user-provided stack = 0
表示允許用戶創(chuàng)建6個任務,所有的6個任務都是分配第三個參數(shù)Task statck size大小的任務堆棧空間。
Numberof concurrent running tasks = 6
Numberof tasks with user-provided stack = 3
表示允許用戶創(chuàng)建6個任務,其中3個任務是用戶自定義任務堆棧大小,另外3個任務是用的第三個參數(shù)Task statck size大小的任務堆棧空間。
lTask statck size
表示系統(tǒng)分配的任務堆棧大小,單位字節(jié)。
lCheck for the stack overflow
選擇是否使能任務堆棧監(jiān)測,選上單選框表示使能,取消單選框表示禁能。
lRun in privileged mode
選擇是否使能特權級模式,選上單選框表示使能任務工作在特權級模式,取消單選框表示任務工作在非特權級模式。特權級和非特權級在第九章有詳細講解。
uTick Timer Configuration
lHardware timer
CoreSysTick表示選擇系統(tǒng)滴答定時器,因為M3/M4內核帶有滴答定時器,一般情況下都是選用滴答定時器作為系統(tǒng)時鐘節(jié)拍。
PeripheralTimer表示使用外設定時器。
lTimer clock value
表示定時器主頻,單位Hz。
lTimer tick value
表示系統(tǒng)時鐘節(jié)拍周期,單位us。
uSystem Configuration
lRound-Robin Task switching
選擇是否使能時間片調度,選上單選框表示使能時間片調度,取消單選框表示不使用時間片調度。
lRound-Robin Timeout [ticks]
范圍1 – 1000。
表示時間片的大小,單位是系統(tǒng)時鐘節(jié)拍個數(shù)。
lNumber of user timers
范圍1 – 250。
表示用戶定時器個數(shù),即軟定時器個數(shù)。
lISR FIFO Queue size
表示ISR FIFO隊列大小。中斷服務程序中調用以isr_ 開頭的函數(shù)時,會將請求類型存到此緩沖中。
5.2.3 RTX操作系統(tǒng)應用實例
通過上面對RTX操作系統(tǒng)的配置講解,這里將其修改為如下圖5.3所示的配置:
圖5.3 RTX的配置向導
相對默認配置,修改了上圖紅色箭頭所示的三個地方:
1. 任務運行在特權級模式。
2. 滴答定時器主頻72MHz,這個也是STM32F103的主頻。
3. 系統(tǒng)時鐘節(jié)拍周期1ms。
修改好配置后,在main.c文件中添加如下代碼,代碼中簡單的創(chuàng)建了兩個用戶任務:
AppTaskLED任務 :LED閃爍。
AppTaskStart任務:啟動任務,也是最高優(yōu)先級任務,這里實現(xiàn)LED閃爍。
#include "bsp.h" /* 底層硬件驅動 */#include "RTL.h"/*********************************************************************************************************** 函數(shù)聲明***********************************************************************************************************/static void AppTaskCreate (void);__task void AppTaskLED(void);__task void AppTaskStart(void);/*********************************************************************************************************** 變量***********************************************************************************************************/static uint64_t AppTaskLEDStk[256/8]; /* 任務棧 */static uint64_t AppTaskStartStk[512/8]; /* 任務棧 *//* 任務句柄 */OS_TID HandleTaskLED = NULL;/*********************************************************************************************************** 函 數(shù) 名: main* 功能說明: 標準c程序入口。* 形 參: 無* 返 回 值: 無**********************************************************************************************************/int main (void){ /* 初始化外設 */ bsp_Init(); /* 創(chuàng)建啟動任務 */ os_sys_init_user (AppTaskStart, /* 任務函數(shù) */ 2, /* 任務優(yōu)先級 */ &AppTaskStartStk, /* 任務棧 */ sizeof(AppTaskStartStk)); /* 任務棧大小,單位字節(jié)數(shù) */ while(1);}/*********************************************************************************************************** 函 數(shù) 名: AppTaskLED* 功能說明: LED閃爍* 形 參: 無* 返 回 值: 無* 優(yōu) 先 級: 1(數(shù)值越小優(yōu)先級越低,這個跟uCOS相反)**********************************************************************************************************/__task void AppTaskLED(void){ while(1) { bsp_LedToggle(2); bsp_LedToggle(3); os_dly_wait(200); }}/*********************************************************************************************************** 函 數(shù) 名: AppTaskStart* 功能說明: 啟動任務,也就是最高優(yōu)先級任務。* 形 參: 無* 返 回 值: 無* 優(yōu) 先 級: 2**********************************************************************************************************/__task void AppTaskStart(void){ AppTaskCreate(); while(1) { bsp_LedToggle(1); bsp_LedToggle(4); os_dly_wait(500); }}/*********************************************************************************************************** 函 數(shù) 名: AppTaskCreate* 功能說明: 創(chuàng)建應用任務* 形 參: 無* 返 回 值: 無**********************************************************************************************************/static void AppTaskCreate (void){ HandleTaskLED = os_tsk_create_user(AppTaskLED, /* 任務函數(shù) */ 1, /* 任務優(yōu)先級 */ &AppTaskLEDStk, /* 任務棧 */ sizeof(AppTaskLEDStk));/* 任務棧大小,單位字節(jié)數(shù) */}
復制代碼
按照第三章的3.4小節(jié)中介紹的調試方法,可以看到如下圖5.4所示的任務執(zhí)行狀態(tài):
圖5.4 RTX的調試信息組件
除了創(chuàng)建的兩個用戶任務以外,還有空閑任務,這個任務是系統(tǒng)創(chuàng)建的。至此,RTX的庫方式移植的工程就可以運行了。
5.3STM32F407移植RTX系統(tǒng)
5.3.1 RTX操作系統(tǒng)移植
首先準備好一個簡單的裸機工程模板,工程模板的制作就不做講解了,這里的重點是教大家移植RTX系統(tǒng)。準備好的工程模板如下圖5.5所示(大家也可以制作其它任意的工程模板,不限制):
圖5.5 工程模板
準備好工程模板后,就可以開始移植了,移植過程比較簡單,需要兩步就可以完成了:
u第1步:使能RTX
u第2步:添加RTX系統(tǒng)的配置文件,配置文件在MDK的安裝目錄C:\Keil_v474\ARM\RL\RTX\Config
下面,文件名RTX_Conf_CM.c,下面將這個文件復制到MDK工程的User文件夾下面,并添加到MDK工程上
通過這兩步,RTX操作系統(tǒng)的移植就完成了。
5.3.2 RTX操作系統(tǒng)配置說明
RTX操作系統(tǒng)的配置工作是通過配置文件RTX_Conf_CM.c實現(xiàn)。在MDK工程中打開文件RTX_Conf_CM.c,可以看到如下圖5.6所示的工程配置向導:
圖5.6 RTX的配置向導
uTask Configuration
lNumber of concurrent running tasks
參數(shù)范圍0 – 250
表示同時運行的最大任務數(shù),這個數(shù)值一定要大于等于用戶實際創(chuàng)建的任務數(shù),空閑任務不包含在這個里面。比如當前的數(shù)值是6,就表示用戶最多可以創(chuàng)建6個任務。
lNumber of tasks with user-provided stack
參數(shù)范圍0 – 250
表示自定義任務堆棧的任務數(shù),如果這個參數(shù)定義為0的話,表示所有的任務都是使用的配置向導里面第三個參數(shù)Task statck size大小。比如:
Numberof concurrent running tasks = 6
Numberof tasks with user-provided stack = 0
表示允許用戶創(chuàng)建6個任務,所有的6個任務都是分配第三個參數(shù)Task statck size大小的任務堆棧空間。
Numberof concurrent running tasks = 6
Numberof tasks with user-provided stack = 3
表示允許用戶創(chuàng)建6個任務,其中3個任務是用戶自定義任務堆棧大小,另外3個任務是用的第三個參數(shù)Task statck size大小的任務堆棧空間。
lTask statck size
表示系統(tǒng)分配的任務堆棧大小,單位字節(jié)。
lCheck for the stack overflow
選擇是否使能任務堆棧監(jiān)測,選上單選框表示使能,取消單選框表示禁能。
lRun in privileged mode
選擇是否使能特權級模式,選上單選框表示使能任務工作在特權級模式,取消單選框表示任務工作在非特權級模式。特權級和非特權級在第九章有詳細講解。
uTick Timer Configuration
lHardware timer
CoreSysTick表示選擇系統(tǒng)滴答定時器,因為M3/M4內核帶有滴答定時器,一般情況下都是選用滴答定時器作為系統(tǒng)時鐘節(jié)拍。
PeripheralTimer表示使用外設定時器。
lTimer clock value
表示定時器主頻,單位Hz。
lTimer tick value
表示系統(tǒng)時鐘節(jié)拍周期,單位us。
uSystem Configuration
lRound-Robin Task switching
選擇是否使能時間片調度,選上單選框表示使能時間片調度,取消單選框表示不使用時間片調度。
lRound-Robin Timeout [ticks]
范圍1 – 1000。
表示時間片的大小,單位是系統(tǒng)時鐘節(jié)拍個數(shù)。
lNumber of user timers
范圍1 – 250。
表示用戶定時器個數(shù),即軟定時器個數(shù)。
lISR FIFO Queue size
表示ISR FIFO隊列大小。中斷服務程序中調用以isr_ 開頭的函數(shù)時,會將請求類型存到此緩沖中。
5.3.3 RTX操作系統(tǒng)應用實例
通過上面對RTX操作系統(tǒng)的配置講解,這里將其修改為如下圖5.7所示配置:
圖5.7 RTX的配置向導
相對默認配置,修改了上圖紅色箭頭所示的三個地方:
1. 任務運行在特權級模式。
2. 滴答定時器主頻168MHz,這個也是STM32F407的主頻。
3. 系統(tǒng)時鐘節(jié)拍周期1ms。
修改好配置后,在main.c文件中添加如下代碼,代碼中簡單的創(chuàng)建了兩個用戶任務:
AppTaskLED任務 :LED閃爍。
AppTaskStart任務:啟動任務,也是最高優(yōu)先級任務,這里實現(xiàn)LED閃爍。
#include "bsp.h" /* 底層硬件驅動 */#include "RTL.h"/*********************************************************************************************************** 函數(shù)聲明***********************************************************************************************************/static void AppTaskCreate (void);__task void AppTaskLED(void);__task void AppTaskStart(void);/*********************************************************************************************************** 變量***********************************************************************************************************/static uint64_t AppTaskLEDStk[256/8]; /* 任務棧 */static uint64_t AppTaskStartStk[512/8]; /* 任務棧 *//* 任務句柄 */OS_TID HandleTaskLED = NULL;/*********************************************************************************************************** 函 數(shù) 名: main* 功能說明: 標準c程序入口。* 形 參: 無* 返 回 值: 無**********************************************************************************************************/int main (void){ /* 初始化外設 */ bsp_Init(); /* 創(chuàng)建啟動任務 */ os_sys_init_user (AppTaskStart, /* 任務函數(shù) */ 2, /* 任務優(yōu)先級 */ &AppTaskStartStk, /* 任務棧 */ sizeof(AppTaskStartStk)); /* 任務棧大小,單位字節(jié)數(shù) */ while(1);}/*********************************************************************************************************** 函 數(shù) 名: AppTaskLED* 功能說明: LED閃爍* 形 參: 無* 返 回 值: 無* 優(yōu) 先 級: 1(數(shù)值越小優(yōu)先級越低,這個跟uCOS相反)**********************************************************************************************************/__task void AppTaskLED(void){ while(1) { bsp_LedToggle(2); bsp_LedToggle(3); os_dly_wait(200); }}/*********************************************************************************************************** 函 數(shù) 名: AppTaskStart* 功能說明: 啟動任務,也就是最高優(yōu)先級任務。* 形 參: 無* 返 回 值: 無* 優(yōu) 先 級: 2**********************************************************************************************************/__task void AppTaskStart(void){ AppTaskCreate(); while(1) { bsp_LedToggle(1); bsp_LedToggle(4); os_dly_wait(500); }}/*********************************************************************************************************** 函 數(shù) 名: AppTaskCreate* 功能說明: 創(chuàng)建應用任務* 形 參: 無* 返 回 值: 無**********************************************************************************************************/static void AppTaskCreate (void){ HandleTaskLED = os_tsk_create_user(AppTaskLED, /* 任務函數(shù) */ 1, /* 任務優(yōu)先級 */ &AppTaskLEDStk, /* 任務棧 */ sizeof(AppTaskLEDStk));/* 任務棧大小,單位字節(jié)數(shù) */}
復制代碼
按照第三章的3.4小節(jié)中介紹的調試方法,可以看到如下圖5.8所示的任務執(zhí)行狀態(tài):
圖5.8 RTX的調試信息組件
除了創(chuàng)建的兩個用戶任務以外,還有空閑任務,這個任務是系統(tǒng)創(chuàng)建的。至此,RTX的庫方式移植的工程就可以運行了。
5.4總結
本章節(jié)為大家講解了庫移植方法,移植比較簡單。另一個重要內容是系統(tǒng)配置向導文件的說明,這個比較重要,初學者要好好熟悉下。
總結
以上是生活随笔為你收集整理的【RTX操作系统教程】第5章 RTX操作系统库方式移植(超级简单)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 空调过滤网里的海绵可以不要吗(如何选择空
- 下一篇: 【网络安全设备系列】4、漏洞扫描设备