本项目为2021年自己从零到一写出来的简易RTOS系统,目的是为了能更加深入的学习RTOS系统及底层运行的逻辑,项目命名为"LinRTOS",为什么会取这个名字呢?

LinRTOS开发基于MDK平台,目前工程工程自动适配Cortex M0/M3/M4,通过软件验证过所有的功能模块均正常工作

开源地址(公众号一个很恶心的东西,就是不能放外部链接):

Gitee:  https://gitee.com/daliny/lin-rtos/tree/master

Github: https://github.com/DaLinYYY/LinRTOS

参考说明

写该系统主要参考的有两个知名的RTOS框架:为FreeRTOS和RT-Thread,FreeRTOS从远源码角度进行学习的,RT-Thread从Api的命名及系统框架结构上进行了一定借鉴。

这里想对国内的RT-Thread做定义说明,都知道老牌FreeRTOS是免费商业使用,其实RT-Thread也是可免费商业使用,只是RT-Thread有扩展的增值服务才需要进行收费,RT-Thread相对FreeRTOS来说有一个很好的有点,就是有大量的官方中文文档可以进行学习和参考。

  • github master代码仓上你能看到的都是开源、免费的,可以免费商用

LinRTOS命名

函数命名规则主要参照FreeRTOS:

变量名

定义变量的时候往往会把变量的类型当作前缀加在变量上,这样的好处是让用户一看到这个变量就知道该变量的类型:

  • c : char 型变量.
  • s : short 型变量.
  • l : long型变量.
  • x : portBASE_TYPE类型变量,数据结构,任务句柄,队列句柄等定义的变量名.
  • u : 无符号型的前面.
  • p : 指针变量的前面.

例:当我们定义一个无符号的 char 型变量的时候会加一个 uc 前缀,当定义一个char 型的指针变量的时候会有一个 pc 前缀。

函数名

函数名包含了函数返回值的类型、函数所在的文件名和函数的功能,如果是私有的函数则会加一个 prv(private)的前缀。

在函数名中加入了函数所在的文件名,这大大的帮助了用户提高寻找函数定义的效率和了解函数作用的目的,具体的举例如下:

  • vTaskPrioritySet()函数的返回值为 void 型,在 task.c这个文件中定义。
  • xQueueReceive()函数的返回值为 portBASE_TYPE 型,在 queue.c 这个文件中定义。
  • vSemaphoreCreateBinary()函数的返回值为 void 型,在 semphr.h 这个文件中定义。

LinRTOS系统框架

这里称系统架构其实也不是很合理的,因为LinRTOS只提供了在ARM的架构之上的内核层面的任务调度和消息处理和对硬件进行一定的抽象,内核层上面的组件框架和在上层的业务逻辑层是没有去实现的。

虽然目前只实现了内核层部分,想要这个系统更加的完善,还需要添加部分必要的组件和安全的框架进去,这里先给自己埋一个坑吧,后面有机会在来进行进一步的完善。

LinRTOS Kernel

工程文件结构

Kernel框架

对RTOS来说,任务调度是最核心的东西,这里面涉及到优先级调度算法,调度逻辑,及系统运行在硬件平台的一些基础知识点,上面说的所有的东西都是在Task.c和Task.h中来实现的。所以,Task也是RTOS中最重要的文件之一。

LinRTOS Config: 整个系统的配置文件,可以配置需要使用那些RTOS资源,优先级的个数等。

Task: RTOS最核心的模块,负责具体的任务调度的实现。

Event:事假核心文件,提供给各种类型的消息,信号公用的模块。

  • Sem: 信号量: 可用于任务的同步和计数,提供增删改查功能。
  • Mutex: 互斥信号量,用于任务的同步,具有互斥属性(用了来防止优先级翻转问题),提供增删改查功能。
  • EventGroup: 事件标志组,用了多任务之间的同步,和信号量不同的是,可以实现一对多,多对多的同步。 即一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件处理。同样,也可以是多个任务同步多个事件。
  • Mailbox: 邮箱通讯,同于任务间数据信息传输,提供增删改查功能。

Scheduler: 操作硬件相关的任务中断,为任务的切换提供入口。

Mempool:为任务分配空间资源的管理文件。

Lisa: 提供最基础的双向通用列表,可以进行增删改查。

Bitmap: 优先级调度算法的数组遍历映射文件。

Timer: 给真个RTOS计数的模块。


任务调度的一些问题:

  • 优先级调度算法
    首先说一说任务优先级调度算法吧,优先级调度算法有很多,在FreeRTOS,UCos2/3实现的都不太一样有些算法为了提高效率会用到一些硬件的资源来实现。
    在这里实现了简单的比较按位优先级查找算法,通过纯软件实现的,大概的原理是用一个uint32_t的整型变量,其中的每一位表示一个或者多个任务的优先级,用0表示没有任务占用,1表示有任务占用,假定最低位优先级最高,优先级查找算法就是从最低位开始逐个遍历找到第一个不为了零的bit,然后再找到对应bit的任务是什么就实现了当前优先级最高的任务查找,这是不是很简单呢。
    当然不是,虽然只实现很简单的一个优先级算法,如果采用最原始的遍历方法是很低效的,对于优先级不多的系统来说还好,如果是想把系统的优先级数提高到更多,这种逐个遍历的方法就有些不适用,每一次遍历就浪费了大量时间; 所以这里采用了一种数组查表法的方法,按一定规律事先填好表格里面的数据,通过查表法就可以直接返回对应任务的优先级,(从算法的两个维度分析:时间复杂度和空间复杂度)这两相当于是采用了一点空间来换取时间上的缩减,这对如今比较打的Flash的MCU来说是很值得的。
  • 上下文切换
    上下为切换这里也叫称任务切换,即从A任务跳转到B任务或者从B任务调回A任务的过程,设立涉及到的就是一个专业的术语“保存现场和恢复现场” 保存现场:即保存当前程序运行在该处的一些现场资源,局部的变量值,运行的位置等,以便于在程序能跳转回来继续运行之前的状态。

自己写一个RTOS系统相关推荐

  1. 用IDEA写一个登录系统

    用IDEA写一个登录系统+连接数据库 1-1配置jdk环境变量 1-2导入jdk 1-3创建web application 1-4在这需要手动创建bin包和main包 如下图 1-5手动加入三个jar ...

  2. 话说Delphi XE7编写安卓APP还是不错的,一周写一个APP系统

     话说Delphi XE7编写安卓APP还是不错的,花了一周写一个APP系统,熟悉delphi开发的,很快就能开发出一个功能完善的APP系统,该系统的简单介绍, 为了配合我们的酒店系统的应用扩展, ...

  3. java写一个登录系统_用java写一个用户登陆界面

    一.课堂测试源代码及其结果截图 用java的swing写一个用户登录界面,采用网格布局.源代码如下: /** * */ package LiuLijia; import java.awt.CardLa ...

  4. Python写一个MS-DOS系统 - 第一天 欢迎及ECHO和EXIT命令实现

    最近对MS-DOS系统比较感兴趣,想自己做一个,于是我用Python做了一个MS-DOS系统.(很简单,没有任何复杂代码) 1.工具 代码编辑器:Visual Studio Code,这是官网链接. ...

  5. python写一个crm系统_用Python打造一个CRM系统(四)

    在上一篇中在本地进行初始化,并让项目顺利运行.在本篇中将实现一个线索管理模块,支持线索的增删改查. 新建线索应用模块 进入项目目录,使用django命令创建线索应用模块,命令如下: $ python ...

  6. 用java写一个秒杀系统

    好的,我来给你提供一些思路和代码示例帮助你开发 Java 版本的秒杀系统. 首先,你需要准备一个数据库来存储商品信息,例如商品名称.价格.库存等.在数据库中,你还需要设置一张订单表来记录用户的购买信息 ...

  7. rtos系统c语言,让我们来学习RTOS,自己写RTOS

    本帖最后由 lotoohe 于 2016-8-24 08:24 编辑 该RTOS系统命名为ZRTOS,是我在阅读了ucos后,并且借鉴了其它操作系统后实现的,完成了一些基础的工作,可以拿过来学习,也可 ...

  8. python写一个系统-使用Python写一个量化股票提醒系统

    大家在没有阅读本文之前先看下python的基本概念, Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开 ...

  9. python写一个系统-熬了一晚上,小白用Python写了一个股票提醒系统

    码农小马七夕节去相亲了,见了一个不错的姑娘,长的非常甜美!聊着聊着很投缘!通过介绍人了解到,对方也很满意--想着自己单身多年的生活就要结束啦,心里满是欢喜,美美哒!但是突然想起年初还有几万块在股市里面 ...

最新文章

  1. 设计模式(2)工厂方法模式(Factory Method)
  2. js 定时网页点击_JS的小乐趣:轻松完成打地鼠游戏
  3. 关于SQL Server 数据库归档的一些思考和改进
  4. 关于Jquery的parent和parents
  5. Dapr微服务应用开发系列4:状态管理构件块
  6. C++ primer 笔记(二)
  7. c# 配置文件App.config操作类库
  8. 【加解密学习笔记:第三天】OllyDbg断点介绍
  9. 多个fbx文件怎么合并_【Houdini】批量导入ABC和FBX文件mergeHips文件(搬运)
  10. 分布式机器学习第3章 分布式机器学习框架
  11. 武昌职业学院与湖北美和易思教育科技有限公司校企签约揭牌仪式隆重举行
  12. Perl语言的多线程(一)
  13. 《深入理解Java内存模型》读书总结
  14. 数据库之查询表sc——查询缺少成绩的学生的学号和相应的课程号
  15. 盘点那些程序员必备的小众网站,建议收藏!
  16. 第8周——定期存款利息计算器
  17. 超极本™ 触摸屏 - 一种全新的动手方式
  18. 无线路由对桥接和中继之间区别的理解
  19. CnOpenData中国高校发明公布专利引用数据
  20. tinymce vue 部分工具不显示_TinyMCE:按需显示和隐藏内联工具栏

热门文章

  1. Excel的使用——比对俩列内容的相同与不同,并突出显示
  2. 漫画|微信群聊的程序员们
  3. GHT(广义霍夫曼变换)
  4. ElasticSearch——Day04
  5. iOS 中将数据导出成Excel文件 ---- libxlsxwriter框架
  6. SAP销售订单关联的生产成本核算
  7. 路由器WiFi短信认证怎么设置?
  8. 打印机服务器无法删除文件,为什么打印机的驱动删除不了 - 驱动管家
  9. 最有意思的100条英语(转)
  10. hint: Updates were rejected because the tip of your current branch is behind(git push线上与本地版本冲突问题)