一个开源的RTOS的Chibios的评测

时间:2022-07-26
本文章向大家介绍一个开源的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设计的,出发点在于性能完善和代码量大小合适。

主要的特点:

  1. 高性能
  2. 静态的体系结构
  3. 强大的调试功能
  4. 代码库清理
  5. 与CMSIS RTOS的兼容性比较好

2.2 ChibiOS/NIL

NIL的设计思想是适合资源非常小的设备。

主要的特点:

  1. 系统很小,最小配置可以在低于1KB的ram上运行。
  2. 小的内存管理,小的线程,信号量管理
  3. 全静态的架构

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

系统的硬件抽象层,该抽象层可以让系统和驱动进行很好的对接,应用程序使用起来更加容易。主要特定:

  1. 将硬件抽象出来,应用程序可以不用管驱动的具体实现
  2. 支持大多数的MCU外设
  3. 能够支持RT和NIL
  4. 方便移植

2.6 ChibiStudio

一个基于ARM的开发环境的IDE,支持编译、下载和运行。

3.RTOS设计思想浅析

要想弄清楚这个系统的功能,就必须理解RTOS的核心。下面从中断处理、系统状态、调度,工作空间四个方面来理解Chibios。

3.1 中断处理

在Chibios中,有三种类型的中断。

  1. Regular Interrupts: 也就是定期中断,这种中断模式下,可屏蔽的中断源不能被抢占,但是需要按照特定的规则来编写这种中断的处理函数。
  2. Fast Interrupts: 可以快速相应的中断,可抢占资源。
  3. 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是一项很有意思的功能,将系统的应用程序独立的在空间中运行,这就很值得去看。另外这个系统的主要还是应用在小的单片机上,我现在还没有实际的数据去展示,等一段时间后,可以看看这个系统的评测结果。