James Bryant

【转】一个C++版的嵌入式操作系统

0
阅读(1097)

原创文章,转载请注明出处!http://www.cnblogs.com/samos2011/p/4682107.html

  现世面上流传着很多嵌入式操作系统,都已经非常优秀,但本人(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的一些其它主要特性,

  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一个字符串,欢迎下载评估交流

原创文章,转载请注明出处!http://www.cnblogs.com/samos2011/p/4682107.html