本章介绍了操作系统相关概念。
这里个人澄清一个事实,就是很多人把RTOS看作是微内核,这是错误的概念。
微内核和宏内核不是指的操作系统的规模的”微”还是”宏”,指的是其内核实现架构方式的区别,
如果把文件系统等组件也集成到内核中则属于宏架构,如果内核仅仅是实现内核调度等基本功能,其他的文件系统功能等在内核以外实现则属于微内核。
RTOS是把所有的组件和内核一起构建的,所以RTOS属于宏内核。
本章首先介绍了无操作系统的程序架构,属于前后台架构,程序主循环执行,中断可以打断主循环执行其他操作。
也可以完全不采用中断,使用轮询查询模式,上述架构优点是结构简单,缺点是不适合扩展和大规模业务。
然后介绍了OSEK/VDX 汽车电子开放系统及接口标准化委员会/法国汽车分布式执行标准委员会,即ISO17356-3:2005标准。
介绍了任务,中断,ErrorHook,调度策略等概念。
这里提一下RTOS的调度实现一般基于优先级调度,同优先级基于FIFO(uCOSII的查找最高优先级任务算法,FIFO实现等可以参考本人公众号系列文章分享:嵌入式Lee),
即按照就绪先后排队, 同时会实现时间片轮转,即同优先级任务可以指定每个任务轮流执行的时间片数,这里顺便提一下FreeRTOS的时间片每个任务都是固定为1,
而uCOSOIII每个任务可以指定时间片大小,相对更灵活。
然后介绍了多任务,介绍了堆栈消耗,数据一致性问题。
这两个问题是需要重点关注的,这里简单提一下,堆栈主要关注其消耗量避免溢出,实现方法是先初始化堆栈为固定内容比如0xA5这些值,
运行时检查剩余多少内容依然是0xA5就知道堆栈剩余多少未使用(可以参考本人公众号系列文章分享:嵌入式Lee)。
当然还可以使用MPU(ARM),PMP(RISC-V),Fireware等硬件技术对栈溢出进行检测(可以参考本人公众号系列文章分享:嵌入式Lee)。
数据一致性也是需要重点考虑的,多任务里最容易出的问题就是这类,比如资源共享需要考虑临界段处理,
举个简单的例子,freertos的heap实现malloc和free是通过关任务调度实现临界段保护的,所以其接口只能在任务中调用,
如果在中断中调用就可能抢占正在执行的malloc和free接口,导致堆的链表结构被破坏(某个malloc和free接口正在执行,另外一个maloc或者free在中断中抢占执行,链表操作非原子,导致破坏链表的结构)。
最后介绍了Posix,介绍了进程,线程的概念,状态图,调度策略。这里提一下RT_Thread参考Linux的风格进行设计是不错的选择,且有Posix兼容层,使用起来比较方便,当然其他RTOS也可以实现类似的Posix兼容层,这也是可移植性的一个考虑,在自己的项目中可以考虑实现。