一个开源的RTOS的Chibios的评测
一个开源的RTOS的Chibios的评测
- 1.Chibios介绍
- 1.1 chibios是什么?
- 1.2 chibios的特点
- 2.chibios的工程组织
- 2.1 ChibiOS/RT
- 2.2 ChibiOS/NIL
- 2.3 ChibiOS/LIB
- 2.4 ChibiOS/SB
- 2.5 ChibiOS/HAL
- 2.6 ChibiStudio
- 3.RTOS设计思想浅析
- 3.1 中断处理
- 3.2 系统状态
- 3.3 调度机制
- 3.4 线程工作空间
- 4.在树莓派上真实体验效果
- 5.总结
1.Chibios介绍
1.1 chibios是什么?
chibios的作者是Giovanni Di Sirio。chibi这个名称在日语是小孩的意思,所以ChibiOS (ちびOS)也被可以理解成小型的操作系统。官网链接如下:
http://www.chibios.org/dokuwiki/doku.php
ChibiOS / RT于2007年9月份在SourceForge公开发布。由于作者对当时现有的RTOS的不满,所以写了这个系统,作者心目中的RTOS应该是:
- 优雅
- 快速
- 小
- 静态的
这些也是chibios的核心思想与系统的特点。所以专注于代码的优美性和一致性,以及内存的静态使用、确定性、强大的抽象功能,都是这个系统关键的特性。
1.2 chibios的特点
随着芯片性能和功能的不断完善,资源的管理也变得十分复杂。就目前来说,已经出现了很多的嵌入式操作系统来进行这些资源的管理和使用。现在来分析一个GPL3协议的开源RTOS,chibios的使用。ChibiOS/RT是为了8、16和32位微控制器而设计的。该RTOS其内存的占用和运行效率是项目至始至终优化的方向。
在STM32(Cortex-M3,72MHz)上,一个典型的ChibiOS/RT实例会占用1.2kB到5.5kB的空间。内核每秒可以创建和终止220000多个线程,而且能在1.2微秒内完成一次线程切换。随着每一个架构移植的发布,ChibiOS的性能测试数据都会被照例公布。
ChibiOS/RT的小型内核支持:
- 抢占性多任务
- 128个优先级
- 同优先级线程按照时间片轮转调度
- 软件定时器
- 计数信号量
- 支持优先级继承的自旋锁
- 同步和异步信息,以及消息队列
- 事件标志和处理函数
- 支持的同步I/O和带超时的异步I/O
- 线程安全的堆或内存池分配器
- 支持多种底层硬件的硬件抽象层
- 支持lwIP和uIP协议栈
- 支持FatFS文件系统
所有的系统对象,比如线程、信号量等都能在运行时创建或者删除。除了可用内存的限制之外没有内核对象创建数量上限。为了增强可靠性,整个内核本身是静态编译的,并且不需要一个动态内存分配器;内核中也没有表或者数组的上限。整个系统的API设计中不包含诸如错误码或者异常一类的错误状况。
2.chibios的工程组织
一个chibios的工程主要包含以下几个独立的工程,分别为RT、NIL、OSLIB、SB、HAL、EX、ChibiStudio。下面我们来单独叙述每个部分的功能和作用。
2.1 ChibiOS/RT
该设计是为功能完备的RTOS设计的,出发点在于性能完善和代码量大小合适。
主要的特点:
- 高性能
- 静态的体系结构
- 强大的调试功能
- 代码库清理
- 与CMSIS RTOS的兼容性比较好
2.2 ChibiOS/NIL
NIL的设计思想是适合资源非常小的设备。
主要的特点:
- 系统很小,最小配置可以在低于1KB的ram上运行。
- 小的内存管理,小的线程,信号量管理
- 全静态的架构
2.3 ChibiOS/LIB
作为一个额外的库,可以被ChibiOS/RT与ChibiOS/NIL共同使用,是操作系统的扩展功能。主要的功能如下:
1.二值信号量
2.邮箱
3.fifo
4.动态线程
5.内存堆管理
6.内存池管理
2.4 ChibiOS/SB
该扩展主要是针对 Cortex-M3, M4 and M7内核。其主要的作用是可以让应用独立的运行在一个沙盒里。
这种沙盒应用是支持两种,一种是静态的内存,一种是动态的内存。
2.5 ChibiOS/HAL
系统的硬件抽象层,该抽象层可以让系统和驱动进行很好的对接,应用程序使用起来更加容易。主要特定:
- 将硬件抽象出来,应用程序可以不用管驱动的具体实现
- 支持大多数的MCU外设
- 能够支持RT和NIL
- 方便移植
2.6 ChibiStudio
一个基于ARM的开发环境的IDE,支持编译、下载和运行。
3.RTOS设计思想浅析
要想弄清楚这个系统的功能,就必须理解RTOS的核心。下面从中断处理、系统状态、调度,工作空间四个方面来理解Chibios。
3.1 中断处理
在Chibios中,有三种类型的中断。
- Regular Interrupts: 也就是定期中断,这种中断模式下,可屏蔽的中断源不能被抢占,但是需要按照特定的规则来编写这种中断的处理函数。
- Fast Interrupts: 可以快速相应的中断,可抢占资源。
- Non Maskable Interrupts: 系统中正常的中断处理。
在RTOS中,比较关键的地方就是确定性与稳定性。确定性一般就是表示处理中断的时间尽可能短而且时间可预测,一定程度上,中断响应时间也是评判一个RTOS的性能的重要指标。
3.2 系统状态
系统RTOS在使用时,每个线程都会处于各种状态。用下面的一张图例来进行表示:
Init: 系统初始化阶段,这个阶段中,所有可屏蔽的中断都无法响应。当系统处于该状态时,除了chSysInit()可以被调用,其他的API都无法被使用。
Normal: 正常状态,当前状态下所有的系统中断可以响应,并且线程正常的运行。
Suspended: 系统挂起状态,这种状态下,只有FIQ可以响应,普通的中断不能响应,并且不能使用chSysDisable()或chSysEnable()之外的任何系统API来更改状态。
Disabled: 系统处于该状态时,所有的中断都不能被响应,无法使用chSysSuspend()或chSysEnable()之外的任何系统API来更改状态。
Sleep: 与体系架构相关的低功耗模式,空闲线程进入该模式后,等待事件重新唤醒变成Normal状态。
S-Locked: 内核已锁定,常规中断源已禁用。快速中断源使能。在这种状态下可以调用S类和I类API。
I-Locked: 内核被锁定,常规中断源被禁用。I-Class API可从此状态调用。
SRI: 全称为Serving Regular Interrupt,不能访问任何系统API,但是可以使用chSysLockFromIsr()切换到I-Locked状态,然后调用任何I-Class API。中断处理程序在某些体系结构上可以抢占,因此在调用系统API之前切换到I锁定状态非常重要。
3.3 调度机制
在理解调度机制之前,先看看线程的状态。
基本上在大部分的RTOS的设计上,线程的状态都是这些。在执行调度策略的时候,也是非常简单,就是将高优先级的线程挂载在调度器的双向链表上,按照优先级的高低进行,数字越小,优先级越低。
如果有同等优先级,则按照时间片轮循的方式进行。
3.4 线程工作空间
和其他RTOS类似,线程都会有字节的栈空间。
系统进行抢占时,会进行当前线程的压栈和需要执行的线程的出栈操作。
4.在树莓派上真实体验效果
说再多也不如真机上进行测试得到的感悟更加的深刻。现在为了体验效果,可以在树莓派2/树莓派3上进行测试。目前为了方便调试,先采用qemu进行模拟仿真。在qemu上运行的程序再移植到真实的树莓派硬件上,基本上问题不大。
本次的实验环境为Ubuntu18.04,需要安装配置好arm-none-eabi-gcc
,以及安装好qemu。也可以在Windows环境中进行测试。
首先需要准备代码,当前的代码仓库在
https://gitee.com/bigmagic/ChibiOS-RPi
将代码clone出来后,进入ChibiOS-RPi/demos/ARM11-BCM2835-GCC
目录,输入make
开始编译代码。
编译完成后,可以看到在ChibiOS-RPi/demos/ARM11-BCM2835-GCCbuild
目录生成了ch.elf文件以及ch.bin文件。如果要在真机上运行,可以将ch.bin修改成kernel.img,然后下载
https://gitee.com/bigmagic/raspi_sd_fw/tree/master/raspi3/raspi3-32/sd_boot_rtt
中的文件,将kernel7.img删除,并且将kernel.img放入。将这些文件放到SD卡中即可。通过串口可以看到输出信息。
在qemu上运行的时候,只需要输入
qemu-system-arm -M raspi2 -m 1024M -smp 4 -serial null -serial stdio -kernel ch.elf
这样就可以在屏幕上看到Chibios的控制台了。
当出现控制台界面时,输入info可以看到当前硬件信息。
5.总结
本文简单的介绍了一下Chibios的基本情况和在树莓派上运行该系统。从RTOS的角度上来说,该rtos的设计思想值得学习。其实看一个RTOS的优劣好坏,不仅仅在于使用的是否上手容易,而在于系统的设计是否友好,是否稳定,也需要有足够的性能。做嵌入式底层开发和做RTOS开发,不应该只是局限于使用一个RTOS,也不应该只关注上层的业务逻辑。一个好的应用,必须是有足够的深度和高度,不断的优化设计。当前,有许多的RTOS可以被使用,有很多系统都有自己值得学习和研究的地方。因为嵌入式RTOS的灵活性很大,不同的业务场景也需要不同的需求,或者每个系统都会有其行业的特殊性,但是万变不离其宗,了解各个系统的特性,是很值得去学习的。
Chibios的一些具体的细节我还没有研究的很深刻,我觉得sandbox是一项很有意思的功能,将系统的应用程序独立的在空间中运行,这就很值得去看。另外这个系统的主要还是应用在小的单片机上,我现在还没有实际的数据去展示,等一段时间后,可以看看这个系统的评测结果。
- Python爬虫(十八)_多线程糗事百科案例
- Python爬虫(十九)_动态HTML介绍
- Python爬虫(二十)_动态爬取影评信息
- Python爬虫(二十一)_Selenium与PhantomJS
- Python爬虫(十三)_案例:使用XPath的爬虫
- Python爬虫(十四)_BeautifulSoup4 解析器
- Python爬虫(十五)_案例:使用bs4的爬虫
- Python爬虫(十六)_JSON模块与JsonPath
- 多类好米齐交易:域名776.cn近10万元结拍
- Python爬虫(八)_Requests的使用
- Python爬虫(十一)_案例:使用正则表达式的爬虫
- Python爬虫(十二)_XPath与lxml类库
- 区块链域名热度不减 健康类英文米近六位交易
- Python爬虫(九)_非结构化数据与结构化数据
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- gearman中任务的优先级和返回状态实例分析
- php实现文件上传基本验证
- php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
- php使用fputcsv实现大数据的导出操作详解
- php的无刷新操作实现方法分析
- PHP实现创建一个RPC服务操作示例
- php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
- gearman管理工具GearmanManager的安装与php使用方法示例
- php 的多进程操作实践案例分析
- php 输出缓冲 Output Control用法实例详解
- PHP使用gearman进行异步的邮件或短信发送操作详解
- php多进程并发编程防止出现僵尸进程的方法分析
- php+ajax实现文件切割上传功能示例
- php操作redis数据库常见方法实例总结
- php使用pthreads v3多线程实现抓取新浪新闻信息操作示例