嵌入式OS入门笔记-以RTX为案例:二.快速移植到RTX
生活随笔
收集整理的這篇文章主要介紹了
嵌入式OS入门笔记-以RTX为案例:二.快速移植到RTX
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
嵌入式OS入門筆記-以RTX為案例:二.快速移植到RTX
本篇筆記將簡單介紹RTX,包括基本架構,如何在Keil中配置。需要安裝ARM-MDK和一塊硬件板,筆記以STM32F4Discovery為例子。
1.為什么要用RTOS?
盡管把所有程序放在一個大的循環里順序執行,總是可能的(甚至很多時候是足夠的勝任任務的),但是這樣做有好幾個明顯的缺點:
? 過分依賴中斷 ISR(Interrupt Service Routine, 中斷服務例程)
? 同步不同的ISR不容易
? 可預測性和延展性很差(大量的ISR,甚至是中斷嵌套)
? 對局部的修改會對整個系統有水花效應(沒有模塊化,牽一發而動全身)
RTOS主要是把要執行的運算包裝在小的task里面,這樣好的好處是:
? 更好的程序流(program flow)和反應
? 多任務(盡管這是假象)
? 簡單的ISR,強的決定性
? 更好的進程間通信
? 更好的資源管理
? 最關鍵的是,開發成本低!
當然,也有很多情況下我們不希望用RTOS的:
? 項目簡單
? 不想學RTOS
? RTOS盡管性能方便出色,但不是最優的!(好比用匯編還是用C,有經驗的程序員可以寫出比編譯器效率更高的代碼,可是編譯器大大簡化開發過程。)如果需要極致的性能優化,那可能RTOS不是你的第一選擇,畢竟RTOS是有內存和運行overhead的。
? 開發RTOS很耗時間
? 不是所有RTOS都是免費的
3.為什么RTX?
為什么選RTX不選別的RTOS,例如FreeRTOS?
? 免費(royalty-free,買斷式的授權)
? 好上手
? 對硬件要求低
? 和ARM軟硬件兼容性好(ARM-MDK自帶)
? 可以查看源代碼
其實主要還是看應用,RTX在行業里聲譽還是很好的,穩定性強,開發成本低,而且基本功能齊全。
4.RTX的結構
RTX其實是Keil Real-Time Library (RTL)的核心,這個RTL有很多部分的,都是在RTX kernel基礎上庫。 RTX Kernel本身的話,結構大概如下圖:
主要的組件有:mutex互斥鎖,memory pool內存池,mailbox郵箱,time(timer)定時器, event事件, semaphore旗語或信號燈,task management進程管理等等和最核心的Scheduler排程器(進程調度器)。
5.移植到RTX上很簡單!
移植一個現有的ARM-MDK工程到RTX上非常簡單:
1.在工程配置中選擇RTX Kernel作為你的操作系統,如下圖:
?
2.在你的main.c里添加頭文件RTL.H:
#include <RTL.h> 3.復制RTX_Conf_CM.文件到你的工程里。這個文件可以在<<YourKeil Directory>>\ARM\RL\RTX\Config 路徑下找到。
4.將你原有的函數改造成task,就是在函數返回類型前添加標記 __task (雙下劃線) 例如:
__task void task(void){ for(;;){ //... } }
5.初始化RTX并創建第一個task,例如:
os_sys_init(task);基本就這樣,具體的關于Task的API,后面的筆記會繼續介紹。
6.幾個相關的文件
完成上述幾步后,你會發現你的工程里主要多了這三個文件:
? RTL.h
? RTL_Conf_CM.c
? RTX_lib.c
第一個是整個RTL的API函數簽名。第二個是RTX的配置文件,你可以通過configuration wizard提供的GUI去配置你的OS。最后一個是內核的配置文件,有一些可以實時調用的配置函數。
7.RTX的配置
這里多說說第二個文件,你可以使用text editor去修改代碼,也可以使用configuration wizard,如下圖:
?
這里先逐項簡單介紹這里的選項:
? 并行的task數
? 用戶設定堆棧的task數
? 預設堆棧大小
? 檢查是否堆棧溢出
? 是否在kernel mode下運行?這個意思是一般的task是否也在kernel mode下運行,一般不勾選。
? 硬件時鐘,CM系列的Core SysTick就是專門為OS所設置的,所以如果你原來就有用到這個timer的話,你的移植可能會出現問題。
? 硬件時鐘頻率
? 一個tick的時間,預設是10ms,這個和delay函數和排程器有關
? 是否輪轉式排程?
? 輪轉式排程的時間片,如果是5,那就是5*10ms=50ms(和tick值有關)
? 用戶時鐘數
? ISR隊列的大小
一般主要調的就時鐘頻率和排程的設置。
8.題外話-CMSIS-RTOS 和 RTX
uVision5提供的RTOS是CMSIS-RTOS,有點讓人覺得摸不著頭腦。其實CMSIS-RTOS是在RTX上的另一層封裝。這樣做的意義在于,建立在不同RTOS(例如RTX和FreeRTOS)的項目可以用同一套API。對于大部分ARM的核來說,其實其底層就是RTX。
?
所以其實本質上是一個東西,只是API名稱不同。使用CMSIS-RTOS 的好處就是稍微強的移植性。但是考慮到ARM的市場占有和他們RTX本身的兼容性,不用CMSIS-RTOS好像更好。而且兩層封裝,很容易把人弄暈。
本篇筆記將簡單介紹RTX,包括基本架構,如何在Keil中配置。需要安裝ARM-MDK和一塊硬件板,筆記以STM32F4Discovery為例子。
1.為什么要用RTOS?
盡管把所有程序放在一個大的循環里順序執行,總是可能的(甚至很多時候是足夠的勝任任務的),但是這樣做有好幾個明顯的缺點:
? 過分依賴中斷 ISR(Interrupt Service Routine, 中斷服務例程)
? 同步不同的ISR不容易
? 可預測性和延展性很差(大量的ISR,甚至是中斷嵌套)
? 對局部的修改會對整個系統有水花效應(沒有模塊化,牽一發而動全身)
RTOS主要是把要執行的運算包裝在小的task里面,這樣好的好處是:
? 更好的程序流(program flow)和反應
? 多任務(盡管這是假象)
? 簡單的ISR,強的決定性
? 更好的進程間通信
? 更好的資源管理
? 最關鍵的是,開發成本低!
一個不成文的小經驗:如果源程序大于1MB,那就有必要用RTOS了!
當然,也有很多情況下我們不希望用RTOS的:
? 項目簡單
? 不想學RTOS
? RTOS盡管性能方便出色,但不是最優的!(好比用匯編還是用C,有經驗的程序員可以寫出比編譯器效率更高的代碼,可是編譯器大大簡化開發過程。)如果需要極致的性能優化,那可能RTOS不是你的第一選擇,畢竟RTOS是有內存和運行overhead的。
? 開發RTOS很耗時間
? 不是所有RTOS都是免費的
3.為什么RTX?
為什么選RTX不選別的RTOS,例如FreeRTOS?
? 免費(royalty-free,買斷式的授權)
? 好上手
? 對硬件要求低
? 和ARM軟硬件兼容性好(ARM-MDK自帶)
? 可以查看源代碼
其實主要還是看應用,RTX在行業里聲譽還是很好的,穩定性強,開發成本低,而且基本功能齊全。
4.RTX的結構
RTX其實是Keil Real-Time Library (RTL)的核心,這個RTL有很多部分的,都是在RTX kernel基礎上庫。 RTX Kernel本身的話,結構大概如下圖:
主要的組件有:mutex互斥鎖,memory pool內存池,mailbox郵箱,time(timer)定時器, event事件, semaphore旗語或信號燈,task management進程管理等等和最核心的Scheduler排程器(進程調度器)。
5.移植到RTX上很簡單!
移植一個現有的ARM-MDK工程到RTX上非常簡單:
1.在工程配置中選擇RTX Kernel作為你的操作系統,如下圖:
?
2.在你的main.c里添加頭文件RTL.H:
#include <RTL.h> 3.復制RTX_Conf_CM.文件到你的工程里。這個文件可以在<<YourKeil Directory>>\ARM\RL\RTX\Config 路徑下找到。
4.將你原有的函數改造成task,就是在函數返回類型前添加標記 __task (雙下劃線) 例如:
__task void task(void){ for(;;){ //... } }
5.初始化RTX并創建第一個task,例如:
os_sys_init(task);基本就這樣,具體的關于Task的API,后面的筆記會繼續介紹。
6.幾個相關的文件
完成上述幾步后,你會發現你的工程里主要多了這三個文件:
? RTL.h
? RTL_Conf_CM.c
? RTX_lib.c
第一個是整個RTL的API函數簽名。第二個是RTX的配置文件,你可以通過configuration wizard提供的GUI去配置你的OS。最后一個是內核的配置文件,有一些可以實時調用的配置函數。
7.RTX的配置
這里多說說第二個文件,你可以使用text editor去修改代碼,也可以使用configuration wizard,如下圖:
?
這里先逐項簡單介紹這里的選項:
? 并行的task數
? 用戶設定堆棧的task數
? 預設堆棧大小
? 檢查是否堆棧溢出
? 是否在kernel mode下運行?這個意思是一般的task是否也在kernel mode下運行,一般不勾選。
? 硬件時鐘,CM系列的Core SysTick就是專門為OS所設置的,所以如果你原來就有用到這個timer的話,你的移植可能會出現問題。
? 硬件時鐘頻率
? 一個tick的時間,預設是10ms,這個和delay函數和排程器有關
? 是否輪轉式排程?
? 輪轉式排程的時間片,如果是5,那就是5*10ms=50ms(和tick值有關)
? 用戶時鐘數
? ISR隊列的大小
一般主要調的就時鐘頻率和排程的設置。
8.題外話-CMSIS-RTOS 和 RTX
uVision5提供的RTOS是CMSIS-RTOS,有點讓人覺得摸不著頭腦。其實CMSIS-RTOS是在RTX上的另一層封裝。這樣做的意義在于,建立在不同RTOS(例如RTX和FreeRTOS)的項目可以用同一套API。對于大部分ARM的核來說,其實其底層就是RTX。
?
所以其實本質上是一個東西,只是API名稱不同。使用CMSIS-RTOS 的好處就是稍微強的移植性。但是考慮到ARM的市場占有和他們RTX本身的兼容性,不用CMSIS-RTOS好像更好。而且兩層封裝,很容易把人弄暈。
當然,如果有需要,可以參考官方文檔:移植RTX到CMSIS-RTOS。
文章轉載自:http://blog.csdn.net/raym0ndkwan/article/details/32859989
總結
以上是生活随笔為你收集整理的嵌入式OS入门笔记-以RTX为案例:二.快速移植到RTX的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VoIP服务器处理协议,多协议VoIP服
- 下一篇: gpg96244qs1屏驱动起来了