一個C++版的嵌入式操作系統


  

   原創文章,轉載請注明出處!

  現世面上流傳着很多嵌入式操作系統,都已經非常優秀,但本人(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 }

 

  不錯,這樣就可以了,OSCPU體系結構被編譯成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的一些其它主要特性,

  1. Cortex-M系列內核不會關中斷
  2. 基於優先級的時間片輪轉調度算法,共7個優先級(實時, 高, 高於正常, 正常, 低於正常, 低, 空閑)
  3. 互斥量與信號量支持優先級搶占與優先級變更
  4. 互斥量支持嵌套與遞歸
  5. 支持任務在刪除時同時清除正在處理的互斥量與信號量狀態,不會影響其它任務
  6. 每個任務共16個事件,可以等待多個事件都發生或任意一個發生
  7. 源代碼僅一個C文件與一個匯編文件,共不足1500行代碼(不算其它體系結構的匯編文件)
  8. 性能: (在 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一個字符串,歡迎下載評估交流

 

 原創文章,轉載請注明出處!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM