日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

【RTX操作系统教程】第5章 RTX操作系统库方式移植(超级简单)

發(fā)布時(shí)間:2023/12/29 综合教程 22 生活家
生活随笔 收集整理的這篇文章主要介紹了 【RTX操作系统教程】第5章 RTX操作系统库方式移植(超级简单) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第5章 RTX操作系統(tǒng)庫(kù)方式移植(超級(jí)簡(jiǎn)單)

原文來(lái)源: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)庫(kù)方式移植,庫(kù)方式的移植超級(jí)簡(jiǎn)單,應(yīng)該是所有RTOS里面最簡(jiǎn)單的了,僅需簡(jiǎn)單的兩步就可以完成。
本章教程含Cortex-M3內(nèi)核的STM32F103的移植和Cortex-M4內(nèi)核的STM32F407移植。
5.1移植前準(zhǔn)備工作說(shuō)明
5.2 STM32F103移植RTX系統(tǒng)
5.3 STM32F407移植RTX系統(tǒng)
5.4 總結(jié)

5.1移植前準(zhǔn)備工作說(shuō)明

1. RTX系統(tǒng)軟件開(kāi)發(fā)平臺(tái)僅支持MDK,建議使用MDK4.74,因?yàn)楹竺娴睦佣际且訫DK4.74為平臺(tái)。
2. 找一個(gè)簡(jiǎn)單的工程,最好是跑馬燈之類(lèi)的,越簡(jiǎn)單越好,我們就在這個(gè)簡(jiǎn)單的工程上面移植即可。
3. 大家使用的簡(jiǎn)單工程里面不能有SysTick,PendSV和SVC三個(gè)系統(tǒng)中斷的使用,因?yàn)镽TX系統(tǒng)要使用這三個(gè)中斷。

5.2STM32F103移植RTX系統(tǒng)

5.2.1 RTX操作系統(tǒng)移植

首先準(zhǔn)備好一個(gè)簡(jiǎn)單的裸機(jī)工程模板,工程模板的制作就不做講解了,這里的重點(diǎn)是教大家移植RTX系統(tǒng)。準(zhǔn)備好的工程模板如下圖5.1所示(大家也可以制作其它任意的工程模板,不限制):

圖5.1 工程模板

準(zhǔn)備好工程模板后,就可以開(kāi)始移植了,移植過(guò)程比較簡(jiǎ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工程上

通過(guò)這兩步,RTX操作系統(tǒng)的移植就完成了。

5.2.2 RTX操作系統(tǒng)配置說(shuō)明

RTX操作系統(tǒng)的配置工作是通過(guò)配置文件RTX_Conf_CM.c實(shí)現(xiàn)。在MDK工程中打開(kāi)文件RTX_Conf_CM.c,可以看到如下圖5.2所示的工程配置向?qū)В?/p>

圖5.2 RTX的配置向?qū)?/p>

uTask Configuration
lNumber 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ù)。
lNumber of tasks with user-provided stack
參數(shù)范圍0 – 250
表示自定義任務(wù)堆棧的任務(wù)數(shù),如果這個(gè)參數(shù)定義為0的話,表示所有的任務(wù)都是使用的配置向?qū)Ю锩娴谌齻€(gè)參數(shù)Task statck size大小。比如:
Numberof concurrent running tasks = 6
Numberof tasks with user-provided stack = 0
表示允許用戶創(chuàng)建6個(gè)任務(wù),所有的6個(gè)任務(wù)都是分配第三個(gè)參數(shù)Task statck size大小的任務(wù)堆棧空間。
Numberof concurrent running tasks = 6
Numberof tasks with user-provided stack = 3
表示允許用戶創(chuàng)建6個(gè)任務(wù),其中3個(gè)任務(wù)是用戶自定義任務(wù)堆棧大小,另外3個(gè)任務(wù)是用的第三個(gè)參數(shù)Task statck size大小的任務(wù)堆??臻g。
lTask statck size
表示系統(tǒng)分配的任務(wù)堆棧大小,單位字節(jié)。
lCheck for the stack overflow
選擇是否使能任務(wù)堆棧監(jiān)測(cè),選上單選框表示使能,取消單選框表示禁能。
lRun in privileged mode
選擇是否使能特權(quán)級(jí)模式,選上單選框表示使能任務(wù)工作在特權(quán)級(jí)模式,取消單選框表示任務(wù)工作在非特權(quán)級(jí)模式。特權(quán)級(jí)和非特權(quán)級(jí)在第九章有詳細(xì)講解。
uTick Timer Configuration
lHardware timer
CoreSysTick表示選擇系統(tǒng)滴答定時(shí)器,因?yàn)镸3/M4內(nèi)核帶有滴答定時(shí)器,一般情況下都是選用滴答定時(shí)器作為系統(tǒng)時(shí)鐘節(jié)拍。
PeripheralTimer表示使用外設(shè)定時(shí)器。
lTimer clock value
表示定時(shí)器主頻,單位Hz。
lTimer tick value
表示系統(tǒng)時(shí)鐘節(jié)拍周期,單位us。
uSystem Configuration
lRound-Robin Task switching
選擇是否使能時(shí)間片調(diào)度,選上單選框表示使能時(shí)間片調(diào)度,取消單選框表示不使用時(shí)間片調(diào)度。
lRound-Robin Timeout [ticks]
范圍1 – 1000。
表示時(shí)間片的大小,單位是系統(tǒng)時(shí)鐘節(jié)拍個(gè)數(shù)。
lNumber of user timers
范圍1 – 250。
表示用戶定時(shí)器個(gè)數(shù),即軟定時(shí)器個(gè)數(shù)。
lISR FIFO Queue size
表示ISR FIFO隊(duì)列大小。中斷服務(wù)程序中調(diào)用以isr_ 開(kāi)頭的函數(shù)時(shí),會(huì)將請(qǐng)求類(lèi)型存到此緩沖中。

5.2.3 RTX操作系統(tǒng)應(yīng)用實(shí)例

通過(guò)上面對(duì)RTX操作系統(tǒng)的配置講解,這里將其修改為如下圖5.3所示的配置:

圖5.3 RTX的配置向?qū)?/p>

相對(duì)默認(rèn)配置,修改了上圖紅色箭頭所示的三個(gè)地方:
1. 任務(wù)運(yùn)行在特權(quán)級(jí)模式。
2. 滴答定時(shí)器主頻72MHz,這個(gè)也是STM32F103的主頻。
3. 系統(tǒng)時(shí)鐘節(jié)拍周期1ms。
修改好配置后,在main.c文件中添加如下代碼,代碼中簡(jiǎn)單的創(chuàng)建了兩個(gè)用戶任務(wù):
AppTaskLED任務(wù) :LED閃爍。
AppTaskStart任務(wù):?jiǎn)?dòng)任務(wù),也是最高優(yōu)先級(jí)任務(wù),這里實(shí)現(xiàn)LED閃爍。

#include "bsp.h" /* 底層硬件驅(qū)動(dòng) */#include "RTL.h"/*********************************************************************************************************** 函數(shù)聲明***********************************************************************************************************/static void AppTaskCreate (void);__task void AppTaskLED(void);__task void AppTaskStart(void);/*********************************************************************************************************** 變量***********************************************************************************************************/static uint64_t AppTaskLEDStk[256/8]; /* 任務(wù)棧 */static uint64_t AppTaskStartStk[512/8]; /* 任務(wù)棧 *//* 任務(wù)句柄 */OS_TID HandleTaskLED = NULL;/*********************************************************************************************************** 函 數(shù) 名: main* 功能說(shuō)明: 標(biāo)準(zhǔn)c程序入口。* 形 參: 無(wú)* 返 回 值: 無(wú)**********************************************************************************************************/int main (void){ /* 初始化外設(shè) */ bsp_Init(); /* 創(chuàng)建啟動(dòng)任務(wù) */ os_sys_init_user (AppTaskStart, /* 任務(wù)函數(shù) */ 2, /* 任務(wù)優(yōu)先級(jí) */ &AppTaskStartStk, /* 任務(wù)棧 */ sizeof(AppTaskStartStk)); /* 任務(wù)棧大小,單位字節(jié)數(shù) */ while(1);}/*********************************************************************************************************** 函 數(shù) 名: AppTaskLED* 功能說(shuō)明: LED閃爍* 形 參: 無(wú)* 返 回 值: 無(wú)* 優(yōu) 先 級(jí): 1(數(shù)值越小優(yōu)先級(jí)越低,這個(gè)跟uCOS相反)**********************************************************************************************************/__task void AppTaskLED(void){ while(1) { bsp_LedToggle(2); bsp_LedToggle(3); os_dly_wait(200); }}/*********************************************************************************************************** 函 數(shù) 名: AppTaskStart* 功能說(shuō)明: 啟動(dòng)任務(wù),也就是最高優(yōu)先級(jí)任務(wù)。* 形 參: 無(wú)* 返 回 值: 無(wú)* 優(yōu) 先 級(jí): 2**********************************************************************************************************/__task void AppTaskStart(void){ AppTaskCreate(); while(1) { bsp_LedToggle(1); bsp_LedToggle(4); os_dly_wait(500); }}/*********************************************************************************************************** 函 數(shù) 名: AppTaskCreate* 功能說(shuō)明: 創(chuàng)建應(yīng)用任務(wù)* 形 參: 無(wú)* 返 回 值: 無(wú)**********************************************************************************************************/static void AppTaskCreate (void){ HandleTaskLED = os_tsk_create_user(AppTaskLED, /* 任務(wù)函數(shù) */ 1, /* 任務(wù)優(yōu)先級(jí) */ &AppTaskLEDStk, /* 任務(wù)棧 */ sizeof(AppTaskLEDStk));/* 任務(wù)棧大小,單位字節(jié)數(shù) */}

復(fù)制代碼

按照第三章的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的庫(kù)方式移植的工程就可以運(yùn)行了。

5.3STM32F407移植RTX系統(tǒng)

5.3.1 RTX操作系統(tǒng)移植

首先準(zhǔn)備好一個(gè)簡(jiǎn)單的裸機(jī)工程模板,工程模板的制作就不做講解了,這里的重點(diǎn)是教大家移植RTX系統(tǒng)。準(zhǔn)備好的工程模板如下圖5.5所示(大家也可以制作其它任意的工程模板,不限制):

圖5.5 工程模板

準(zhǔn)備好工程模板后,就可以開(kāi)始移植了,移植過(guò)程比較簡(jiǎ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工程上

通過(guò)這兩步,RTX操作系統(tǒng)的移植就完成了。

5.3.2 RTX操作系統(tǒng)配置說(shuō)明

RTX操作系統(tǒng)的配置工作是通過(guò)配置文件RTX_Conf_CM.c實(shí)現(xiàn)。在MDK工程中打開(kāi)文件RTX_Conf_CM.c,可以看到如下圖5.6所示的工程配置向?qū)В?/p>

圖5.6 RTX的配置向?qū)?/p>

uTask Configuration
lNumber 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ù)。
lNumber of tasks with user-provided stack
參數(shù)范圍0 – 250
表示自定義任務(wù)堆棧的任務(wù)數(shù),如果這個(gè)參數(shù)定義為0的話,表示所有的任務(wù)都是使用的配置向?qū)Ю锩娴谌齻€(gè)參數(shù)Task statck size大小。比如:
Numberof concurrent running tasks = 6
Numberof tasks with user-provided stack = 0
表示允許用戶創(chuàng)建6個(gè)任務(wù),所有的6個(gè)任務(wù)都是分配第三個(gè)參數(shù)Task statck size大小的任務(wù)堆??臻g。
Numberof concurrent running tasks = 6
Numberof tasks with user-provided stack = 3
表示允許用戶創(chuàng)建6個(gè)任務(wù),其中3個(gè)任務(wù)是用戶自定義任務(wù)堆棧大小,另外3個(gè)任務(wù)是用的第三個(gè)參數(shù)Task statck size大小的任務(wù)堆??臻g。
lTask statck size
表示系統(tǒng)分配的任務(wù)堆棧大小,單位字節(jié)。
lCheck for the stack overflow
選擇是否使能任務(wù)堆棧監(jiān)測(cè),選上單選框表示使能,取消單選框表示禁能。
lRun in privileged mode
選擇是否使能特權(quán)級(jí)模式,選上單選框表示使能任務(wù)工作在特權(quán)級(jí)模式,取消單選框表示任務(wù)工作在非特權(quán)級(jí)模式。特權(quán)級(jí)和非特權(quán)級(jí)在第九章有詳細(xì)講解。
uTick Timer Configuration
lHardware timer
CoreSysTick表示選擇系統(tǒng)滴答定時(shí)器,因?yàn)镸3/M4內(nèi)核帶有滴答定時(shí)器,一般情況下都是選用滴答定時(shí)器作為系統(tǒng)時(shí)鐘節(jié)拍。
PeripheralTimer表示使用外設(shè)定時(shí)器。
lTimer clock value
表示定時(shí)器主頻,單位Hz。
lTimer tick value
表示系統(tǒng)時(shí)鐘節(jié)拍周期,單位us。
uSystem Configuration
lRound-Robin Task switching
選擇是否使能時(shí)間片調(diào)度,選上單選框表示使能時(shí)間片調(diào)度,取消單選框表示不使用時(shí)間片調(diào)度。
lRound-Robin Timeout [ticks]
范圍1 – 1000。
表示時(shí)間片的大小,單位是系統(tǒng)時(shí)鐘節(jié)拍個(gè)數(shù)。
lNumber of user timers
范圍1 – 250。
表示用戶定時(shí)器個(gè)數(shù),即軟定時(shí)器個(gè)數(shù)。
lISR FIFO Queue size
表示ISR FIFO隊(duì)列大小。中斷服務(wù)程序中調(diào)用以isr_ 開(kāi)頭的函數(shù)時(shí),會(huì)將請(qǐng)求類(lèi)型存到此緩沖中。

5.3.3 RTX操作系統(tǒng)應(yīng)用實(shí)例

通過(guò)上面對(duì)RTX操作系統(tǒng)的配置講解,這里將其修改為如下圖5.7所示配置:

圖5.7 RTX的配置向?qū)?/p>

相對(duì)默認(rèn)配置,修改了上圖紅色箭頭所示的三個(gè)地方:
1. 任務(wù)運(yùn)行在特權(quán)級(jí)模式。
2. 滴答定時(shí)器主頻168MHz,這個(gè)也是STM32F407的主頻。
3. 系統(tǒng)時(shí)鐘節(jié)拍周期1ms。
修改好配置后,在main.c文件中添加如下代碼,代碼中簡(jiǎn)單的創(chuàng)建了兩個(gè)用戶任務(wù):
AppTaskLED任務(wù) :LED閃爍。
AppTaskStart任務(wù):?jiǎn)?dòng)任務(wù),也是最高優(yōu)先級(jí)任務(wù),這里實(shí)現(xiàn)LED閃爍。

#include "bsp.h" /* 底層硬件驅(qū)動(dòng) */#include "RTL.h"/*********************************************************************************************************** 函數(shù)聲明***********************************************************************************************************/static void AppTaskCreate (void);__task void AppTaskLED(void);__task void AppTaskStart(void);/*********************************************************************************************************** 變量***********************************************************************************************************/static uint64_t AppTaskLEDStk[256/8]; /* 任務(wù)棧 */static uint64_t AppTaskStartStk[512/8]; /* 任務(wù)棧 *//* 任務(wù)句柄 */OS_TID HandleTaskLED = NULL;/*********************************************************************************************************** 函 數(shù) 名: main* 功能說(shuō)明: 標(biāo)準(zhǔn)c程序入口。* 形 參: 無(wú)* 返 回 值: 無(wú)**********************************************************************************************************/int main (void){ /* 初始化外設(shè) */ bsp_Init(); /* 創(chuàng)建啟動(dòng)任務(wù) */ os_sys_init_user (AppTaskStart, /* 任務(wù)函數(shù) */ 2, /* 任務(wù)優(yōu)先級(jí) */ &AppTaskStartStk, /* 任務(wù)棧 */ sizeof(AppTaskStartStk)); /* 任務(wù)棧大小,單位字節(jié)數(shù) */ while(1);}/*********************************************************************************************************** 函 數(shù) 名: AppTaskLED* 功能說(shuō)明: LED閃爍* 形 參: 無(wú)* 返 回 值: 無(wú)* 優(yōu) 先 級(jí): 1(數(shù)值越小優(yōu)先級(jí)越低,這個(gè)跟uCOS相反)**********************************************************************************************************/__task void AppTaskLED(void){ while(1) { bsp_LedToggle(2); bsp_LedToggle(3); os_dly_wait(200); }}/*********************************************************************************************************** 函 數(shù) 名: AppTaskStart* 功能說(shuō)明: 啟動(dòng)任務(wù),也就是最高優(yōu)先級(jí)任務(wù)。* 形 參: 無(wú)* 返 回 值: 無(wú)* 優(yōu) 先 級(jí): 2**********************************************************************************************************/__task void AppTaskStart(void){ AppTaskCreate(); while(1) { bsp_LedToggle(1); bsp_LedToggle(4); os_dly_wait(500); }}/*********************************************************************************************************** 函 數(shù) 名: AppTaskCreate* 功能說(shuō)明: 創(chuàng)建應(yīng)用任務(wù)* 形 參: 無(wú)* 返 回 值: 無(wú)**********************************************************************************************************/static void AppTaskCreate (void){ HandleTaskLED = os_tsk_create_user(AppTaskLED, /* 任務(wù)函數(shù) */ 1, /* 任務(wù)優(yōu)先級(jí) */ &AppTaskLEDStk, /* 任務(wù)棧 */ sizeof(AppTaskLEDStk));/* 任務(wù)棧大小,單位字節(jié)數(shù) */}

復(fù)制代碼

按照第三章的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的庫(kù)方式移植的工程就可以運(yùn)行了。

5.4總結(jié)

本章節(jié)為大家講解了庫(kù)移植方法,移植比較簡(jiǎn)單。另一個(gè)重要內(nèi)容是系統(tǒng)配置向?qū)募恼f(shuō)明,這個(gè)比較重要,初學(xué)者要好好熟悉下。

總結(jié)

以上是生活随笔為你收集整理的【RTX操作系统教程】第5章 RTX操作系统库方式移植(超级简单)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。