RTX操作系统库方式移植
生活随笔
收集整理的這篇文章主要介紹了
RTX操作系统库方式移植
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本章教程為大家將介紹RTX操作系統(tǒng)庫方式移植,庫方式的移植超級(jí)簡單,應(yīng)該是所有RTOS里面最簡單的了,僅需簡單的兩步就可以完成。
本章教程含Cortex-M3內(nèi)核的STM32F103的移植和Cortex-M4內(nèi)核的STM32F407移植。
5.1 移植前準(zhǔn)備工作說明
5.2 STM32F103移植RTX系統(tǒng)
5.3 STM32F407移植RTX系統(tǒng)
5.4 ? ? ? ? ?總結(jié)
?
?
5.1 ?移植前準(zhǔn)備工作說明
1. ? ? RTX系統(tǒng)軟件開發(fā)平臺(tái)僅支持MDK,建議使用MDK4.74,因?yàn)楹竺娴睦佣际且訫DK4.74為平臺(tái)。
2. ? ? 找一個(gè)簡單的工程,最好是跑馬燈之類的,越簡單越好,我們就在這個(gè)簡單的工程上面移植即可。
3. ? ? 大家使用的簡單工程里面不能有SysTick,PendSV和SVC三個(gè)系統(tǒng)中斷的使用,因?yàn)镽TX系統(tǒng)
要使用這三個(gè)中斷。
5.2 ? STM32F103移植RTX系統(tǒng)
5.2.1 ? ? ?RTX操作系統(tǒng)移植
首先準(zhǔn)備好一個(gè)簡單的裸機(jī)工程模板,工程模板的制作就不做講解了,這里的重點(diǎn)是教大家移植RTX系統(tǒng)。準(zhǔn)備好的工程模板如下圖5.1所示(大家也可以制作其它任意的工程模板,不限制):
?
圖5.1 工程模板
準(zhǔn)備好工程模板后,就可以開始移植了,移植過程比較簡單,需要兩步就可以完成了:
u ?第1步:使能RTX
?
u ?第2步:添加RTX系統(tǒng)的配置文件,配置文件在MDK的安裝目錄C:\Keil_v474\ARM\RL\RTX\Config
下面,文件名RTX_Conf_CM.c,下面將這個(gè)文件復(fù)制到MDK工程的User文件夾下面,并添加到MDK工程上
?
通過這兩步,RTX操作系統(tǒng)的移植就完成了。
5.2.2 ? ? RTX操作系統(tǒng)配置說明
RTX操作系統(tǒng)的配置工作是通過配置文件RTX_Conf_CM.c實(shí)現(xiàn)。在MDK工程中打開文件RTX_Conf_CM.c,可以看到如下圖5.2所示的工程配置向?qū)?#xff1a;
?
圖5.2 RTX的配置向?qū)?br />u ?Task Configuration
l ?Number of concurrent running tasks
參數(shù)范圍0 – 250
表示同時(shí)運(yùn)行的最大任務(wù)數(shù),這個(gè)數(shù)值一定要大于等于用戶實(shí)際創(chuàng)建的任務(wù)數(shù),空閑任務(wù)不包含在這個(gè)里面。比如當(dāng)前的數(shù)值是6,就表示用戶最多可以創(chuàng)建6個(gè)任務(wù)。
l ?Number of tasks with user-provided stack
參數(shù)范圍0 – 250
表示自定義任務(wù)堆棧的任務(wù)數(shù),如果這個(gè)參數(shù)定義為0的話,表示所有的任務(wù)都是使用的配置向?qū)Ю锩娴谌齻€(gè)參數(shù)Task statck size大小。比如:
Number of concurrent running tasks = 6
Number of tasks with user-provided stack = 0
表示允許用戶創(chuàng)建6個(gè)任務(wù),所有的6個(gè)任務(wù)都是分配第三個(gè)參數(shù)Task statck size大小的任務(wù)堆棧空間。
Number of concurrent running tasks = 6
Number of tasks with user-provided stack = 3
表示允許用戶創(chuàng)建6個(gè)任務(wù),其中3個(gè)任務(wù)是用戶自定義任務(wù)堆棧大小,另外3個(gè)任務(wù)是用的第三個(gè)參數(shù)Task statck size大小的任務(wù)堆棧空間。
l ?Task statck size
表示系統(tǒng)分配的任務(wù)堆棧大小,單位字節(jié)。
l ?Check for the stack overflow
選擇是否使能任務(wù)堆棧監(jiān)測,選上單選框表示使能,取消單選框表示禁能。
l ?Run in privileged mode
選擇是否使能特權(quán)級(jí)模式,選上單選框表示使能任務(wù)工作在特權(quán)級(jí)模式,取消單選框表示任務(wù)工作在非特權(quán)級(jí)模式。特權(quán)級(jí)和非特權(quán)級(jí)在第九章有詳細(xì)講解。
u ?Tick Timer Configuration
l ?Hardware timer
Core SysTick 表示選擇系統(tǒng)滴答定時(shí)器,因?yàn)镸3/M4內(nèi)核帶有滴答定時(shí)器,一般情況下都是選用滴答定時(shí)器作為系統(tǒng)時(shí)鐘節(jié)拍。
Peripheral Timer 表示使用外設(shè)定時(shí)器。
l ?Timer clock value
表示定時(shí)器主頻,單位Hz。
l ?Timer tick value
表示系統(tǒng)時(shí)鐘節(jié)拍周期,單位us。
u ?System Configuration
l ?Round-Robin Task switching
選擇是否使能時(shí)間片調(diào)度,選上單選框表示使能時(shí)間片調(diào)度,取消單選框表示不使用時(shí)間片調(diào)度。
l ?Round-Robin Timeout [ticks]
范圍1 – 1000。
表示時(shí)間片的大小,單位是系統(tǒng)時(shí)鐘節(jié)拍個(gè)數(shù)。
l ?Number of user timers
范圍1 – 250。
表示用戶定時(shí)器個(gè)數(shù),即軟定時(shí)器個(gè)數(shù)。
l ?ISR FIFO Queue size
表示ISR FIFO隊(duì)列大小。中斷服務(wù)程序中調(diào)用以isr_ 開頭的函數(shù)時(shí),會(huì)將請求類型存到此緩沖中。
5.2.3 ? ? RTX操作系統(tǒng)應(yīng)用實(shí)例
通過上面對RTX操作系統(tǒng)的配置講解,這里將其修改為如下圖5.3所示的配置:
?
圖5.3 RTX的配置向?qū)?br />相對默認(rèn)配置,修改了上圖紅色箭頭所示的三個(gè)地方:
1. ? ? 任務(wù)運(yùn)行在特權(quán)級(jí)模式。
2. ? ? 滴答定時(shí)器主頻72MHz,這個(gè)也是STM32F103的主頻。
3. ? ? 系統(tǒng)時(shí)鐘節(jié)拍周期1ms。
修改好配置后,在main.c文件中添加如下代碼,代碼中簡單的創(chuàng)建了兩個(gè)用戶任務(wù):
AppTaskLED任務(wù) :LED閃爍。
AppTaskStart任務(wù):啟動(dòng)任務(wù),也是最高優(yōu)先級(jí)任務(wù),這里實(shí)現(xiàn)LED閃爍。
#include "bsp.h" ? ? ? ? ??
#include "RTL.h"
?
?
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;
?
?
int main (void)
{ ??
? ??
? ? ?bsp_Init();
? ??
? ??
? ? ?os_sys_init_user (AppTaskStart, ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ?2, ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ?&AppTaskStartStk, ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ?sizeof(AppTaskStartStk));
? ? ?while(1);
}
?
?
__task void AppTaskLED(void)
{
? ? while(1)
? ? {
? ? ? ? ?bsp_LedToggle(2);
? ? ? ? ?bsp_LedToggle(3);
? ? ? ? ?os_dly_wait(200);
? ? }
}
?
?
__task void AppTaskStart(void)
{
? ? ?AppTaskCreate();
? ??
? ? while(1)
? ? {
? ? ? ? ?bsp_LedToggle(1);
? ? ? ? ?bsp_LedToggle(4);
? ? ? ? ?os_dly_wait(500);
? ? }
}
?
?
static void AppTaskCreate (void)
{
? ? ?HandleTaskLED = os_tsk_create_user(AppTaskLED, ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1, ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &AppTaskLEDStk, ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sizeof(AppTaskLEDStk));?
}
按照第三章的3.4小節(jié)中介紹的調(diào)試方法,可以看到如下圖5.4所示的任務(wù)執(zhí)行狀態(tài):
?
圖5.4 RTX的調(diào)試信息組件
除了創(chuàng)建的兩個(gè)用戶任務(wù)以外,還有空閑任務(wù),這個(gè)任務(wù)是系統(tǒng)創(chuàng)建的。至此,RTX的庫方式移植的工程就可以運(yùn)行了。
5.3 ?STM32F407移植RTX系統(tǒng)
5.3.1 ? ? RTX操作系統(tǒng)移植
首先準(zhǔn)備好一個(gè)簡單的裸機(jī)工程模板,工程模板的制作就不做講解了,這里的重點(diǎn)是教大家移植RTX系統(tǒng)。準(zhǔn)備好的工程模板如下圖5.5所示(大家也可以制作其它任意的工程模板,不限制):
?
圖5.5 工程模板
準(zhǔn)備好工程模板后,就可以開始移植了,移植過程比較簡單,需要兩步就可以完成了:
u ?第1步:使能RTX
?
u ?第2步:添加RTX系統(tǒng)的配置文件,配置文件在MDK的安裝目錄C:\Keil_v474\ARM\RL\RTX\Config
下面,文件名RTX_Conf_CM.c,下面將這個(gè)文件復(fù)制到MDK工程的User文件夾下面,并添加到MDK工程上
?
通過這兩步,RTX操作系統(tǒng)的移植就完成了。
5.3.2 ? ? RTX操作系統(tǒng)配置說明
RTX操作系統(tǒng)的配置工作是通過配置文件RTX_Conf_CM.c實(shí)現(xiàn)。在MDK工程中打開文件RTX_Conf_CM.c,可以看到如下圖5.6所示的工程配置向?qū)?#xff1a;
?
圖5.6 RTX的配置向?qū)?br />u ?Task Configuration
l ?Number of concurrent running tasks
參數(shù)范圍0 – 250
表示同時(shí)運(yùn)行的最大任務(wù)數(shù),這個(gè)數(shù)值一定要大于等于用戶實(shí)際創(chuàng)建的任務(wù)數(shù),空閑任務(wù)不包含在這個(gè)里面。比如當(dāng)前的數(shù)值是6,就表示用戶最多可以創(chuàng)建6個(gè)任務(wù)。
l ?Number of tasks with user-provided stack
參數(shù)范圍0 – 250
表示自定義任務(wù)堆棧的任務(wù)數(shù),如果這個(gè)參數(shù)定義為0的話,表示所有的任務(wù)都是使用的配置向?qū)Ю锩娴谌齻€(gè)參數(shù)Task statck size大小。比如:
Number of concurrent running tasks = 6
Number of tasks with user-provided stack = 0
表示允許用戶創(chuàng)建6個(gè)任務(wù),所有的6個(gè)任務(wù)都是分配第三個(gè)參數(shù)Task statck size大小的任務(wù)堆棧空間。
Number of concurrent running tasks = 6
Number of tasks with user-provided stack = 3
表示允許用戶創(chuàng)建6個(gè)任務(wù),其中3個(gè)任務(wù)是用戶自定義任務(wù)堆棧大小,另外3個(gè)任務(wù)是用的第三個(gè)參數(shù)Task statck size大小的任務(wù)堆棧空間。
l ?Task statck size
表示系統(tǒng)分配的任務(wù)堆棧大小,單位字節(jié)。
l ?Check for the stack overflow
選擇是否使能任務(wù)堆棧監(jiān)測,選上單選框表示使能,取消單選框表示禁能。
l ?Run in privileged mode
選擇是否使能特權(quán)級(jí)模式,選上單選框表示使能任務(wù)工作在特權(quán)級(jí)模式,取消單選框表示任務(wù)工作在非特權(quán)級(jí)模式。特權(quán)級(jí)和非特權(quán)級(jí)在第九章有詳細(xì)講解。
u ?Tick Timer Configuration
l ?Hardware timer
Core SysTick 表示選擇系統(tǒng)滴答定時(shí)器,因?yàn)镸3/M4內(nèi)核帶有滴答定時(shí)器,一般情況下都是選用滴答定時(shí)器作為系統(tǒng)時(shí)鐘節(jié)拍。
Peripheral Timer 表示使用外設(shè)定時(shí)器。
l ?Timer clock value
表示定時(shí)器主頻,單位Hz。
l ?Timer tick value
表示系統(tǒng)時(shí)鐘節(jié)拍周期,單位us。
u ?System Configuration
l ?Round-Robin Task switching
選擇是否使能時(shí)間片調(diào)度,選上單選框表示使能時(shí)間片調(diào)度,取消單選框表示不使用時(shí)間片調(diào)度。
l ?Round-Robin Timeout [ticks]
范圍1 – 1000。
表示時(shí)間片的大小,單位是系統(tǒng)時(shí)鐘節(jié)拍個(gè)數(shù)。
l ?Number of user timers
范圍1 – 250。
表示用戶定時(shí)器個(gè)數(shù),即軟定時(shí)器個(gè)數(shù)。
l ?ISR FIFO Queue size
表示ISR FIFO隊(duì)列大小。中斷服務(wù)程序中調(diào)用以isr_ 開頭的函數(shù)時(shí),會(huì)將請求類型存到此緩沖中。
5.3.3 ? ? RTX操作系統(tǒng)應(yīng)用實(shí)例
通過上面對RTX操作系統(tǒng)的配置講解,這里將其修改為如下圖5.7所示配置:
?
圖5.7 RTX的配置向?qū)?br />相對默認(rèn)配置,修改了上圖紅色箭頭所示的三個(gè)地方:
1. ? ? 任務(wù)運(yùn)行在特權(quán)級(jí)模式。
2. ? ? 滴答定時(shí)器主頻168MHz,這個(gè)也是STM32F407的主頻。
3. ? ? 系統(tǒng)時(shí)鐘節(jié)拍周期1ms。
修改好配置后,在main.c文件中添加如下代碼,代碼中簡單的創(chuàng)建了兩個(gè)用戶任務(wù):
AppTaskLED任務(wù) :LED閃爍。
AppTaskStart任務(wù):啟動(dòng)任務(wù),也是最高優(yōu)先級(jí)任務(wù),這里實(shí)現(xiàn)LED閃爍。
#include "bsp.h" ? ? ? ? ??
#include "RTL.h"
?
?
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;
?
?
int main (void)
{ ??
? ??
? ? ?bsp_Init();
? ??
? ??
? ? ?os_sys_init_user (AppTaskStart, ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ?2, ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ?&AppTaskStartStk, ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ?sizeof(AppTaskStartStk));
? ? ?while(1);
}
?
?
__task void AppTaskLED(void)
{
? ? while(1)
? ? {
? ? ? ? ?bsp_LedToggle(2);
? ? ? ? ?bsp_LedToggle(3);
? ? ? ? ?os_dly_wait(200);
? ? }
}
?
?
__task void AppTaskStart(void)
{
? ? ?AppTaskCreate();
? ??
? ? while(1)
? ? {
? ? ? ? ?bsp_LedToggle(1);
? ? ? ? ?bsp_LedToggle(4);
? ? ? ? ?os_dly_wait(500);
? ? }
}
?
?
static void AppTaskCreate (void)
{
? ? ?HandleTaskLED = os_tsk_create_user(AppTaskLED, ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1, ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &AppTaskLEDStk, ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sizeof(AppTaskLEDStk));?
}
按照第三章的3.4小節(jié)中介紹的調(diào)試方法,可以看到如下圖5.8所示的任務(wù)執(zhí)行狀態(tài):
?
圖5.8 RTX的調(diào)試信息組件
除了創(chuàng)建的兩個(gè)用戶任務(wù)以外,還有空閑任務(wù),這個(gè)任務(wù)是系統(tǒng)創(chuàng)建的。至此,RTX的庫方式移植的工程就可以運(yùn)行了。
5.4 ?總結(jié)
本章節(jié)為大家講解了庫移植方法,移植比較簡單。另一個(gè)重要內(nèi)容是系統(tǒng)配置向?qū)募恼f明,這個(gè)比較重要,初學(xué)者要好好熟悉下。
本章教程含Cortex-M3內(nèi)核的STM32F103的移植和Cortex-M4內(nèi)核的STM32F407移植。
5.1 移植前準(zhǔn)備工作說明
5.2 STM32F103移植RTX系統(tǒng)
5.3 STM32F407移植RTX系統(tǒng)
5.4 ? ? ? ? ?總結(jié)
?
?
5.1 ?移植前準(zhǔn)備工作說明
1. ? ? RTX系統(tǒng)軟件開發(fā)平臺(tái)僅支持MDK,建議使用MDK4.74,因?yàn)楹竺娴睦佣际且訫DK4.74為平臺(tái)。
2. ? ? 找一個(gè)簡單的工程,最好是跑馬燈之類的,越簡單越好,我們就在這個(gè)簡單的工程上面移植即可。
3. ? ? 大家使用的簡單工程里面不能有SysTick,PendSV和SVC三個(gè)系統(tǒng)中斷的使用,因?yàn)镽TX系統(tǒng)
要使用這三個(gè)中斷。
5.2 ? STM32F103移植RTX系統(tǒng)
5.2.1 ? ? ?RTX操作系統(tǒng)移植
首先準(zhǔn)備好一個(gè)簡單的裸機(jī)工程模板,工程模板的制作就不做講解了,這里的重點(diǎn)是教大家移植RTX系統(tǒng)。準(zhǔn)備好的工程模板如下圖5.1所示(大家也可以制作其它任意的工程模板,不限制):
?
圖5.1 工程模板
準(zhǔn)備好工程模板后,就可以開始移植了,移植過程比較簡單,需要兩步就可以完成了:
u ?第1步:使能RTX
?
u ?第2步:添加RTX系統(tǒng)的配置文件,配置文件在MDK的安裝目錄C:\Keil_v474\ARM\RL\RTX\Config
下面,文件名RTX_Conf_CM.c,下面將這個(gè)文件復(fù)制到MDK工程的User文件夾下面,并添加到MDK工程上
?
通過這兩步,RTX操作系統(tǒng)的移植就完成了。
5.2.2 ? ? RTX操作系統(tǒng)配置說明
RTX操作系統(tǒng)的配置工作是通過配置文件RTX_Conf_CM.c實(shí)現(xiàn)。在MDK工程中打開文件RTX_Conf_CM.c,可以看到如下圖5.2所示的工程配置向?qū)?#xff1a;
?
圖5.2 RTX的配置向?qū)?br />u ?Task Configuration
l ?Number of concurrent running tasks
參數(shù)范圍0 – 250
表示同時(shí)運(yùn)行的最大任務(wù)數(shù),這個(gè)數(shù)值一定要大于等于用戶實(shí)際創(chuàng)建的任務(wù)數(shù),空閑任務(wù)不包含在這個(gè)里面。比如當(dāng)前的數(shù)值是6,就表示用戶最多可以創(chuàng)建6個(gè)任務(wù)。
l ?Number of tasks with user-provided stack
參數(shù)范圍0 – 250
表示自定義任務(wù)堆棧的任務(wù)數(shù),如果這個(gè)參數(shù)定義為0的話,表示所有的任務(wù)都是使用的配置向?qū)Ю锩娴谌齻€(gè)參數(shù)Task statck size大小。比如:
Number of concurrent running tasks = 6
Number of tasks with user-provided stack = 0
表示允許用戶創(chuàng)建6個(gè)任務(wù),所有的6個(gè)任務(wù)都是分配第三個(gè)參數(shù)Task statck size大小的任務(wù)堆棧空間。
Number of concurrent running tasks = 6
Number of tasks with user-provided stack = 3
表示允許用戶創(chuàng)建6個(gè)任務(wù),其中3個(gè)任務(wù)是用戶自定義任務(wù)堆棧大小,另外3個(gè)任務(wù)是用的第三個(gè)參數(shù)Task statck size大小的任務(wù)堆棧空間。
l ?Task statck size
表示系統(tǒng)分配的任務(wù)堆棧大小,單位字節(jié)。
l ?Check for the stack overflow
選擇是否使能任務(wù)堆棧監(jiān)測,選上單選框表示使能,取消單選框表示禁能。
l ?Run in privileged mode
選擇是否使能特權(quán)級(jí)模式,選上單選框表示使能任務(wù)工作在特權(quán)級(jí)模式,取消單選框表示任務(wù)工作在非特權(quán)級(jí)模式。特權(quán)級(jí)和非特權(quán)級(jí)在第九章有詳細(xì)講解。
u ?Tick Timer Configuration
l ?Hardware timer
Core SysTick 表示選擇系統(tǒng)滴答定時(shí)器,因?yàn)镸3/M4內(nèi)核帶有滴答定時(shí)器,一般情況下都是選用滴答定時(shí)器作為系統(tǒng)時(shí)鐘節(jié)拍。
Peripheral Timer 表示使用外設(shè)定時(shí)器。
l ?Timer clock value
表示定時(shí)器主頻,單位Hz。
l ?Timer tick value
表示系統(tǒng)時(shí)鐘節(jié)拍周期,單位us。
u ?System Configuration
l ?Round-Robin Task switching
選擇是否使能時(shí)間片調(diào)度,選上單選框表示使能時(shí)間片調(diào)度,取消單選框表示不使用時(shí)間片調(diào)度。
l ?Round-Robin Timeout [ticks]
范圍1 – 1000。
表示時(shí)間片的大小,單位是系統(tǒng)時(shí)鐘節(jié)拍個(gè)數(shù)。
l ?Number of user timers
范圍1 – 250。
表示用戶定時(shí)器個(gè)數(shù),即軟定時(shí)器個(gè)數(shù)。
l ?ISR FIFO Queue size
表示ISR FIFO隊(duì)列大小。中斷服務(wù)程序中調(diào)用以isr_ 開頭的函數(shù)時(shí),會(huì)將請求類型存到此緩沖中。
5.2.3 ? ? RTX操作系統(tǒng)應(yīng)用實(shí)例
通過上面對RTX操作系統(tǒng)的配置講解,這里將其修改為如下圖5.3所示的配置:
?
圖5.3 RTX的配置向?qū)?br />相對默認(rèn)配置,修改了上圖紅色箭頭所示的三個(gè)地方:
1. ? ? 任務(wù)運(yùn)行在特權(quán)級(jí)模式。
2. ? ? 滴答定時(shí)器主頻72MHz,這個(gè)也是STM32F103的主頻。
3. ? ? 系統(tǒng)時(shí)鐘節(jié)拍周期1ms。
修改好配置后,在main.c文件中添加如下代碼,代碼中簡單的創(chuàng)建了兩個(gè)用戶任務(wù):
AppTaskLED任務(wù) :LED閃爍。
AppTaskStart任務(wù):啟動(dòng)任務(wù),也是最高優(yōu)先級(jí)任務(wù),這里實(shí)現(xiàn)LED閃爍。
#include "bsp.h" ? ? ? ? ??
#include "RTL.h"
?
?
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;
?
?
int main (void)
{ ??
? ??
? ? ?bsp_Init();
? ??
? ??
? ? ?os_sys_init_user (AppTaskStart, ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ?2, ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ?&AppTaskStartStk, ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ?sizeof(AppTaskStartStk));
? ? ?while(1);
}
?
?
__task void AppTaskLED(void)
{
? ? while(1)
? ? {
? ? ? ? ?bsp_LedToggle(2);
? ? ? ? ?bsp_LedToggle(3);
? ? ? ? ?os_dly_wait(200);
? ? }
}
?
?
__task void AppTaskStart(void)
{
? ? ?AppTaskCreate();
? ??
? ? while(1)
? ? {
? ? ? ? ?bsp_LedToggle(1);
? ? ? ? ?bsp_LedToggle(4);
? ? ? ? ?os_dly_wait(500);
? ? }
}
?
?
static void AppTaskCreate (void)
{
? ? ?HandleTaskLED = os_tsk_create_user(AppTaskLED, ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1, ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &AppTaskLEDStk, ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sizeof(AppTaskLEDStk));?
}
按照第三章的3.4小節(jié)中介紹的調(diào)試方法,可以看到如下圖5.4所示的任務(wù)執(zhí)行狀態(tài):
?
圖5.4 RTX的調(diào)試信息組件
除了創(chuàng)建的兩個(gè)用戶任務(wù)以外,還有空閑任務(wù),這個(gè)任務(wù)是系統(tǒng)創(chuàng)建的。至此,RTX的庫方式移植的工程就可以運(yùn)行了。
5.3 ?STM32F407移植RTX系統(tǒng)
5.3.1 ? ? RTX操作系統(tǒng)移植
首先準(zhǔn)備好一個(gè)簡單的裸機(jī)工程模板,工程模板的制作就不做講解了,這里的重點(diǎn)是教大家移植RTX系統(tǒng)。準(zhǔn)備好的工程模板如下圖5.5所示(大家也可以制作其它任意的工程模板,不限制):
?
圖5.5 工程模板
準(zhǔn)備好工程模板后,就可以開始移植了,移植過程比較簡單,需要兩步就可以完成了:
u ?第1步:使能RTX
?
u ?第2步:添加RTX系統(tǒng)的配置文件,配置文件在MDK的安裝目錄C:\Keil_v474\ARM\RL\RTX\Config
下面,文件名RTX_Conf_CM.c,下面將這個(gè)文件復(fù)制到MDK工程的User文件夾下面,并添加到MDK工程上
?
通過這兩步,RTX操作系統(tǒng)的移植就完成了。
5.3.2 ? ? RTX操作系統(tǒng)配置說明
RTX操作系統(tǒng)的配置工作是通過配置文件RTX_Conf_CM.c實(shí)現(xiàn)。在MDK工程中打開文件RTX_Conf_CM.c,可以看到如下圖5.6所示的工程配置向?qū)?#xff1a;
?
圖5.6 RTX的配置向?qū)?br />u ?Task Configuration
l ?Number of concurrent running tasks
參數(shù)范圍0 – 250
表示同時(shí)運(yùn)行的最大任務(wù)數(shù),這個(gè)數(shù)值一定要大于等于用戶實(shí)際創(chuàng)建的任務(wù)數(shù),空閑任務(wù)不包含在這個(gè)里面。比如當(dāng)前的數(shù)值是6,就表示用戶最多可以創(chuàng)建6個(gè)任務(wù)。
l ?Number of tasks with user-provided stack
參數(shù)范圍0 – 250
表示自定義任務(wù)堆棧的任務(wù)數(shù),如果這個(gè)參數(shù)定義為0的話,表示所有的任務(wù)都是使用的配置向?qū)Ю锩娴谌齻€(gè)參數(shù)Task statck size大小。比如:
Number of concurrent running tasks = 6
Number of tasks with user-provided stack = 0
表示允許用戶創(chuàng)建6個(gè)任務(wù),所有的6個(gè)任務(wù)都是分配第三個(gè)參數(shù)Task statck size大小的任務(wù)堆棧空間。
Number of concurrent running tasks = 6
Number of tasks with user-provided stack = 3
表示允許用戶創(chuàng)建6個(gè)任務(wù),其中3個(gè)任務(wù)是用戶自定義任務(wù)堆棧大小,另外3個(gè)任務(wù)是用的第三個(gè)參數(shù)Task statck size大小的任務(wù)堆棧空間。
l ?Task statck size
表示系統(tǒng)分配的任務(wù)堆棧大小,單位字節(jié)。
l ?Check for the stack overflow
選擇是否使能任務(wù)堆棧監(jiān)測,選上單選框表示使能,取消單選框表示禁能。
l ?Run in privileged mode
選擇是否使能特權(quán)級(jí)模式,選上單選框表示使能任務(wù)工作在特權(quán)級(jí)模式,取消單選框表示任務(wù)工作在非特權(quán)級(jí)模式。特權(quán)級(jí)和非特權(quán)級(jí)在第九章有詳細(xì)講解。
u ?Tick Timer Configuration
l ?Hardware timer
Core SysTick 表示選擇系統(tǒng)滴答定時(shí)器,因?yàn)镸3/M4內(nèi)核帶有滴答定時(shí)器,一般情況下都是選用滴答定時(shí)器作為系統(tǒng)時(shí)鐘節(jié)拍。
Peripheral Timer 表示使用外設(shè)定時(shí)器。
l ?Timer clock value
表示定時(shí)器主頻,單位Hz。
l ?Timer tick value
表示系統(tǒng)時(shí)鐘節(jié)拍周期,單位us。
u ?System Configuration
l ?Round-Robin Task switching
選擇是否使能時(shí)間片調(diào)度,選上單選框表示使能時(shí)間片調(diào)度,取消單選框表示不使用時(shí)間片調(diào)度。
l ?Round-Robin Timeout [ticks]
范圍1 – 1000。
表示時(shí)間片的大小,單位是系統(tǒng)時(shí)鐘節(jié)拍個(gè)數(shù)。
l ?Number of user timers
范圍1 – 250。
表示用戶定時(shí)器個(gè)數(shù),即軟定時(shí)器個(gè)數(shù)。
l ?ISR FIFO Queue size
表示ISR FIFO隊(duì)列大小。中斷服務(wù)程序中調(diào)用以isr_ 開頭的函數(shù)時(shí),會(huì)將請求類型存到此緩沖中。
5.3.3 ? ? RTX操作系統(tǒng)應(yīng)用實(shí)例
通過上面對RTX操作系統(tǒng)的配置講解,這里將其修改為如下圖5.7所示配置:
?
圖5.7 RTX的配置向?qū)?br />相對默認(rèn)配置,修改了上圖紅色箭頭所示的三個(gè)地方:
1. ? ? 任務(wù)運(yùn)行在特權(quán)級(jí)模式。
2. ? ? 滴答定時(shí)器主頻168MHz,這個(gè)也是STM32F407的主頻。
3. ? ? 系統(tǒng)時(shí)鐘節(jié)拍周期1ms。
修改好配置后,在main.c文件中添加如下代碼,代碼中簡單的創(chuàng)建了兩個(gè)用戶任務(wù):
AppTaskLED任務(wù) :LED閃爍。
AppTaskStart任務(wù):啟動(dòng)任務(wù),也是最高優(yōu)先級(jí)任務(wù),這里實(shí)現(xiàn)LED閃爍。
#include "bsp.h" ? ? ? ? ??
#include "RTL.h"
?
?
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;
?
?
int main (void)
{ ??
? ??
? ? ?bsp_Init();
? ??
? ??
? ? ?os_sys_init_user (AppTaskStart, ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ?2, ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ?&AppTaskStartStk, ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ?sizeof(AppTaskStartStk));
? ? ?while(1);
}
?
?
__task void AppTaskLED(void)
{
? ? while(1)
? ? {
? ? ? ? ?bsp_LedToggle(2);
? ? ? ? ?bsp_LedToggle(3);
? ? ? ? ?os_dly_wait(200);
? ? }
}
?
?
__task void AppTaskStart(void)
{
? ? ?AppTaskCreate();
? ??
? ? while(1)
? ? {
? ? ? ? ?bsp_LedToggle(1);
? ? ? ? ?bsp_LedToggle(4);
? ? ? ? ?os_dly_wait(500);
? ? }
}
?
?
static void AppTaskCreate (void)
{
? ? ?HandleTaskLED = os_tsk_create_user(AppTaskLED, ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1, ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &AppTaskLEDStk, ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sizeof(AppTaskLEDStk));?
}
按照第三章的3.4小節(jié)中介紹的調(diào)試方法,可以看到如下圖5.8所示的任務(wù)執(zhí)行狀態(tài):
?
圖5.8 RTX的調(diào)試信息組件
除了創(chuàng)建的兩個(gè)用戶任務(wù)以外,還有空閑任務(wù),這個(gè)任務(wù)是系統(tǒng)創(chuàng)建的。至此,RTX的庫方式移植的工程就可以運(yùn)行了。
5.4 ?總結(jié)
本章節(jié)為大家講解了庫移植方法,移植比較簡單。另一個(gè)重要內(nèi)容是系統(tǒng)配置向?qū)募恼f明,這個(gè)比較重要,初學(xué)者要好好熟悉下。
總結(jié)
以上是生活随笔為你收集整理的RTX操作系统库方式移植的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TI BLE协议栈 按键流程分析
- 下一篇: STM32时钟源时钟系统配置