免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1788 | 回复: 0
打印 上一主题 下一主题

[操作系统] 一个极易使用的C++版RTOS [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-05 08:49 |只看该作者 |倒序浏览
本帖最后由 samos2011 于 2015-08-06 15:21 编辑

       原创文章,转载请注明出处!
  致RTOS新手:预练RTOS,必先学习CPU体系结构,否则看代码只会增加您的烦恼!但如果只是想快速使用,那么这个RTOS就是您的最佳选择.
  致高手:祝贺您,OS已经没什么好研究的了,应该研究在嵌入式开发中如何应用面向对象,设计模式等上流设计,
如:面向对象的3个基本要素与5个基本原则,可使代码优雅灵活,易于复用,易于扩展
粗略介绍一下3要素与5原则:
     3个基本要素:封装、继承、多态
    5个基本原则:
     单一职责原则(Single-Resposibility Principle)
      其核心思想为:一个类(或模块),最好只做一件事,只有一个引起它的变化
    开放封闭原则(Open-Closed principle)
      其核心思想为:软件实体应该是可扩展的,而不可修改的
    Liskov替换原则(Liskov-Substituion Principle)
      其核心思想为:子类必须能够替换其基类
    依赖倒置原则(Dependecy-Inversion Principle)
      其核心思想为:高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。
    接口隔离原则(Interface-Segregation Principle)
      其核心思想为:使用多个小的专门的接口,而不要使用一个大的总接口。
    以上不同的设计模式对应不同的需求,而设计原则则代表永恒的灵魂,需要在实践中时时刻刻地遵守,但不一定要完全遵守.

     那么如何设计RTOS呢?先看一段Keil工程结构截图与一段main.cpp代码:

  1. #include "os.h"                // 包含OS
  2. osThread Task1;                // 定义一个任务
  3. TACK_DEF(Task1Stk,256);        // 为任务1定义一个栈空间
  4. osMutex m1;                    // 定义一个互斥量
  5. void Fun1(void){
  6.     m1.Wait();
  7.     // 其它代码
  8.     m1.Release();
  9. }
  10. void Task1Fun(void){
  11.     int id = Task1.Id;         // 获取任务ID
  12.     Fun1();
  13.     os::Pass();                // 释放CPU,切换任务
  14.     os::Delete();              // 删除该任务,即使没有这句,也会自动删除
  15. }
  16. void TaskMain(void){
  17.     // 创建任务1,正常优先级
  18.     Task1.Create(Task1Fun,osPriorityNormal, Task1Stk,sizeof(Task1Stk));
  19. }
  20. int main(void){            
  21.     // 其它外设初始化      
  22.     os::Start(TaskMain);        // 启动OS
  23. }
复制代码
不错,这样就可以了,OS按CPU体系结构已被编译成OS_[CM0/CM3/CM4F/ARM/ARMF/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文件与一个cpp文件以及一个汇编文件,共不足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++支持,因为作者修改了编译器的默认启动顺序(见samsis\inc\os\samos_rt.c文件),
在清零存储器,全局变量赋初值后,运行main之前插入了两件事,初始化OS与初始化C++,这样你可以任意使用c++的构造函数,虚函数.
即使你使勾选了<use micro lib>.这些事情是在OS配置文件中完成的(包括定时器),所以上面的main.cpp代码没有OS初始化部分,也没有互斥量初始化部

OS下载地址: SamFramework.rar (37.99 KB, 下载次数: 15)

该demo创建了3个任务,分别控制3个LED以不同的频率翻转并print一个字符串,欢迎下载评估交流

高手:这只是一个微控制器OS,如果您有更好的建议或者更易于使用的OS,请炫出来,让我开开眼,RTX除外,您也可以检验(Keil软件仿真看汇编SVC部分),看是不是符合Cortex-M特点

我当然知道,OS不算什么,对使用者仅仅改变编程习惯而已,只有完整的中间件(符合设计模式的中间件,OS只是其中一个小模块)配合使用,才能使开发人员快速开发产品,只关注应用相关,中间件以后发帖介绍,或移驾至 http-//www-cnblogs.com/samos2011/] 预览一下

原创文章,转载请注明出处!




您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP