为什么要使用实时内核?
有许多成熟的技术可以不使用实时内核就能编写出良好的嵌入式软件,而且如果正在开发的系统很简单,采用这些技术,不使用实时内核就能很方便开发出嵌入式软件;但当系统很复杂时,使用实时内核应该是更好的选择。那么实时内核相较与传统的裸机开发有哪些优势呢?下面简要地列出其中的一些:
抽象化时间信息
实时内核负责调度执行时间,并提供一些时间相关的API供应用使用。应用程序因此可以设计得结构更简单,代码尺寸更小。
可维护性/可扩展性
抽象化时间细节可以减少模块间的依赖关系,并让软件可控、可预期地进行演化迭代。同时,由于内核负责计时,应用程序执行不太受底层硬件变化的影响。
模块化
每个任务都是一个独立的模块,都有明确的设计目的。
团队开发
任务间应具有良好的设计接口,可以让团队成员间更独立地模块化、更方便地协作开发。
便于测试
如果任务是定义良好的独立模块,接口简洁,则可以进行隔离测试。
代码复用
代码中更多地进行模块化、低耦合设计,可以让代码更多地被复用,让开发更高效更稳定。
提升效率
实时内核可以让软件完全地事件驱动,仅在事件来临时进行相应处理。实时内核调度系统提供在tick中断时进行任务切换的机制,而在裸机系统中应用开发者需要自己实现类似的tick中断切换处理的机制。
空闲机制
调度器启动时空闲任务自动创建。空闲任务可用于检查任务处理开销、执行一些背景检查,让处理器便捷地进入低功耗模式。
电源管理
进入空闲任务时,可进入低功耗模式;tick-less模式,可以让处理器进入更长时间、更低功耗模式。
中断处理灵活
可及时响应中断,并做到中断时延较小。
可响应混合的处理需求
在一个应用中可实现混合的周期、持续和事件驱动的处理。另外,通过选择适当的任务和中断优先级来满足硬实时和软实时需求。
FreeRTOS的功能
- Pre-emptive or co-operative operation(抢占式或协作式调度器)
- Very flexible task priority assignment(非常灵活的优先级分配)
- Flexible, fast and light weight task notification mechanism(灵活、快速、轻量的任务通知机制)
- Queues (队列)
- Binary semaphores(二值信号量)
- Counting semaphores (计数信号量)
- Mutexes(互斥量)
- Recursive Mutexes(递归互斥量)
- Software timers(软件定时器)
- Event groups(事件组)
- Tick hook functions (tick钩子函数)
- Idle hook functions (空闲钩子函数)
- Stack overflow checking(堆栈溢出检查)
- Trace recording(跟踪记录)
- Task run-time statistics gathering(任务运行统计信息收集)
- Optional commercial licensing and support(可选的商业许可和支持)
- Full interrupt nesting model (for some architectures)(全中断嵌套模型(部分架构))
- A tick-less capability for extreme low power applications(tick-less极低功耗)
- Software managed interrupt stack when appropriate (this can help save RAM)软件管理中断堆栈(这可以帮助保存RAM)