因为不满已有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-GCC\build
目录生成了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是一项很有意思的功能,将系统的应用程序独立的在空间中运行,这就很值得去看。另外这个系统的主要还是应用在小的单片机上,我现在还没有实际的数据去展示,等一段时间后,可以看看这个系统的评测结果。