原創文章,轉載請注明出處!
現世面上流傳着很多嵌入式操作系統,都已經非常優秀,但本人(Sam的博客-博客園)還是自己編寫了一個RTOS,不敢說優秀,但絕對是使用起來最簡單的.先看一個工程截圖與一段main.cpp代碼
1 #include "os.h" // 包含OS 2 osThread Task1; // 定義一個任務 3 TACK_DEF(Task1Stk,256); // 為任務1定義一個棧空間 4 osMutex m1; // 定義一個互斥量 5 6 void Fun1(void){ 7 m1.Wait(); 8 // 其它代碼 9 m1.Release(); 10 } 11 void Task1Fun(void){ 12 int id = Task1.Id; // 獲取任務ID 13 Fun1(); 14 os::Pass(); // 釋放CPU,切換任務 15 os::Delete(); // 刪除該任務,即使沒有這句,也會自動刪除 16 } 17 void TaskMain(void){ 18 // 創建任務1,正常優先級 19 Task1.Create(Task1Fun,osPriorityNormal, Task1Stk,sizeof(Task1Stk)); 20 } 21 int main(void){ 22 // 其它外設初始化 23 os::Start(TaskMain); // 啟動OS 24 }
不錯,這樣就可以了,OS按CPU體系結構被編譯成OS_[CM0/CM3/ARM/AVR].lib,並提供與CPU無關的頭文件(僅此一個)以及一個配置文件(OS_Conf_CM.c),該配置文件每個工程一個副本,配置文件中的CM對應系結構為cortex-M系列,另外還有ARM系列,AVR系列等配置模板,全圖形化操作,CM系列如圖:
可見,這個OS使用起來非常簡單,是其它OS不能比的.比如C++特性,細心的您可能已經發現了,任務的定義,互斥量的定義和其他OS明顯不同,另外還有osEvnet類,osSemaphore類,osMailBox類,全都在os.h文件中定義,但凡了解C++與OS概念的人都能輕易使用.如互斥量的定義
1 class osMutex{ 2 private: 3 U32 mut[4]; // 隱藏細節 4 public: 5 osMutex(); // 構造函數,自動調用的互斥量初始化 6 void Wait(void); // 等待 7 void Release(void); // 釋放 8 };
再說說這個OS的一些其它主要特性,
- Cortex-M系列內核不會關中斷
- 基於優先級的時間片輪轉調度算法,共7個優先級(實時, 高, 高於正常, 正常, 低於正常, 低, 空閑)
- 互斥量與信號量支持優先級搶占與優先級變更
- 互斥量支持嵌套與遞歸
- 支持任務在刪除時同時清除正在處理的互斥量與信號量狀態,不會影響其它任務
- 每個任務共16個事件,可以等待多個事件都發生或任意一個發生
- 源代碼僅一個C文件與一個匯編文件,共不足1500行代碼(不算其它體系結構的匯編文件)
- 性能: (在 STM32F103 24MHz 情況下測試得出, 單位us)
初始化系統,啟動任務 | 30.3 |
創建任務(無任務切換) | 15.7 |
創建任務(任務切換) | 16.3 |
刪除任務(含切換) | 13.2 |
任務切換 | (正常7.9) (高於正常7.4) (高7.0) (實時6.5) |
設置事件(含切換) | 8.3 |
不僅如此,該OS還有非常好的C++支持,因為作者修改了編譯器的默認啟動順序,在清零存儲器,全局變量賦初值后,運行main之前插入了兩件事,初始化OS與初始化C++,這樣你可以任意使用c++的構造函數,虛函數.即使你使勾選了<use micro lib>.這些事情是在OS配置文件中完成的.,所以上面的main.cpp代碼沒有OS初始化部分,也沒有互斥量初始化部分
演示版下載地址:http://pan.baidu.com/s/1mgEdM20
該demo創建了3個任務,分別控制3個LED以不同的頻率翻轉並print一個字符串,歡迎下載評估交流
原創文章,轉載請注明出處!