开发框架

软件框架

软件框架

CMSIS

ESP-IDF

Arduino

STM32Cube

libopencm3

License

Apache 2.0

Apache 2.0

Apache 2.0

MIT

Apache 2.0

实时系统

实时系统

Zephyr

freeRTOS

RT-Thread

License

Apache 2.0

MIT

Apache 2.0

软实时系统:在软实时系统中系统的宗旨是使各个任务运行得越快越好,并不要求限定某一任务必须在多长时间内完成。

硬实时系统:在硬实时系统中,各任务不仅要执行无误而且要做到准时。

大多数实时系统是二者的结合。实时系统的应用涵盖广泛的领域,而多数实时系统又是嵌入式的。实时应用软件的设计一般比非实时应用软件设计难一些。

内核(Kernel)

多任务系统中,内核负责管理各个任务,或者说为每个任务分配 CPU 时间,并且负责任务之间的通讯。

内核提供的基本服务是任务切换。之所以使用实时内核可以大大简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,由实时内核来管理它们。

内核本身也增加了应用程序的额外负荷,代码空间增加 ROM 的用量,内核本身的数据结构增加RAM的用量。内核本身对CPU的占用时间一般在2到5个百分点之间。

单片机一般不能运行实时内核,因为单片机的 RAM 很有限。通过提供必不可缺少的系统服务,诸如信号量管理,邮箱、消息队列、延时等,实时内核使得 CPU 的利用更为有效。

不可剥夺型内核

不可剥夺型内核(Non-Preemptive Kernel)要求每个任务自我放弃 CPU 的所有权。不可剥夺型调度法也称作合作型多任务,各个任务彼此合作共享一个 CPU。异步事件还是由中断服务来处理。

中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃 CPU 的使用权时,那个高优先级的任务才能获得 CPU的使用权。

不可剥夺型内核的一个优点是响应中断快。在任务级,不可剥夺型内核允许使用不可重入函数。函数的可重入性以后会讨论。每个任务都可以调用非可重入性函数,而不必担心其它任务可能正在使用该函数,从而造成数据的破坏。

因为每个任务要运行到完成时才释放 CPU 的控制权。当然该不可重入型函数本身不得有放弃 CPU 控制权的企图。

使用不可剥夺型内核时,任务级响应时间比前后台系统快得多。此时的任务级响应时间取决于最长的任务执行时间。

不可剥夺型内核的另一个优点是,几乎不需要使用信号量保护共享数据。运行着的任务占有 CPU,而不必担心被别的任务抢占。但这也不是绝对的,在某种情况下,信号量还是用得着的。处理共享 I/O 设备时仍需要使用互斥型信号量。例如,在打印机的使用上,仍需要满足互斥条件。

不可剥夺型内核的最大缺陷在于其响应时间。高优先级的任务已经进入就绪态,但还不能运行,直到当前运行着的任务释放CPU。

与前后系统一样,不可剥夺型内核的任务级响应时间是不确定的,不知道什么时候最高优先级的任务才能拿到CPU 的控制权,完全取决于应用程序什么时候释放 CPU。

总之,不可剥夺型内核允许每个任务运行,直到该任务自愿放弃 CPU 的控制权。中断可以打入运行着的任务。中断服务完成以后将 CPU 控制权还给被中断了的任务。

任务级响应时间要大大好于前后系统,但仍是不可知的,商业软件几乎没有不可剥夺型内核。

可剥夺型内核

最高优先级的任务一旦就绪,总能得到 CPU 的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的 CPU 使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了 CPU 的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。

使用可剥夺型内核时,应用程序不应直接使用不可重入型函数。调用不可重入型函数时,要满足互斥条件,这一点可以用互斥型信号量来实现。

如果调用不可重入型函数时,低优先级的任务 CPU 的使用权被高优先级任务剥夺,不可重入型函数中的数据有可能被破坏。

综上所述,可剥夺型内核总是让就绪态的高优先级的任务先运行,中断服务程序可以抢占 CPU,到中断服务完成时,内核让此时优先级最高的任务运行(不一定是那个被中断了的任务)。

时间片轮番调度

当两个或两个以上任务有同样优先级,内核允许一个任务运行事先确定的一段时间,叫做时间额度(quantum),然后切换给另一个任务。也叫做时间片调度。

内核在满足以下条件时,把CPU控制权交给下一个任务就绪态的任务:

  • 当前任务已无事可做

  • 当前任务在时间片还没结束时已经完成

任务优先级

静态优先级 应用程序执行过程中诸任务优先级不变。在静态优先级系统中,诸任务以及它们的时间约束在程序编译时是已知的。

动态优先级 应用程序执行过程中任务的优先级是可变的。实时内核应当避免出现优先级反转问题。

单调执行率调度法 RMS(Rate Monotonic Scheduling), 用于分配任务优先级。这种方法基于哪个任务执行的次数最频繁,执行最频繁的任务优先级最高。

有时很需要任务间的或中断服务与任务间的通讯。这种信息传递称为任务间的通讯。任务间信息的传递有两个途径:通过全程变量或发消息给另一个任务。

图形框架

图形框架

TouchGFX

LittleVGL

License

MIT

Apache 2.0

在单片机领域的GUI框架有:ucgui(STemWin/emwin)、TouchGFX、GuiLite、LittlevGL等。

emwin提供的更多是一些较底层的函数(如:画线、画圆),而且不能拖控件,做出来的界面更接近像素时代的产物。在emwin的开发中,要想显示图片,需要把图片转成bmp格式,再用BmpCvt转成数组,最后才用emwin的函数去调用这个数组,这是比较麻烦的。

TouchGFX都可以很好的解决这些问题,但是只能用于STM32的单片机上,TouchGFX还支持直接生成MDK/IAR工程。

Note

GUI(Graphical User Interface) 图形用户界面。