详解FreeRTOS与SAFERTOS的区别

生活资讯 土里土气 2025-06-05 10:40 4198 0

开源免费的FreeRTOS由Richard Barry在WHIS工作时创建,WHIS基于FreeRTOS的功能模型,通过完整的HAZOP分析,确定了功能模型和API中的所有的弱点,减轻所有薄弱环节,并采用IEC 61508 SIL 3的开发生命周期,重新设计实现了SAFERTOS。

SAFERTOS及其配套的设计保证包(DAP)为安全应用提供卓越的性能和安全关键的可靠性,同时消耗最少的资源。

由于FreeRTOS内核和SAFERTOS共享相同的功能模型,升级很容易。许多开发者基于FreeRTOS内核实现产品原型,并在正式开发阶段升级为SAFERTOS。

SAFERTOS和FreeRTOS共享一个功能模型,使用起来非常相似。然而与FreeRTOS相比,SAFERTOS:

• 具有较少的应用程序编程接口(API)

• 函数中执行更多的错误检查

• 大多数API调用返回状态码

• 要求应用提供所有堆栈、任务控制块和队列缓冲区存储空间

• 使用静态分配,不提供heap函数

• 默认使用处理器的MPU(Memory Protection Unit)功能

• 重新设计,满足安全关键软件的需求

因此,当将一个FreeRTOS项目迁移到SAFERTOS时,需要做一些工作来启动和运行内核。

FreeRTOS内部隐藏了内存管理实现,如任务创建时动态分配堆栈,在内核启动时为内核数据分配缓冲区等。在FreeRTOS中也可以配置使用静态分配机制,由应用程序提供相应的内存,但大多数用户更倾向于由FreeRTOS实现分配功能。

FreeRTOS还提供了许多编译时选项,允许应用程序设计人员通过Hook函数机制在内核中插入额外的功能代码,在任务切换时运行,如任务创建或删除时,调用Hook函数。

API区别

FreeRTOS和SAFERTOS中API函数名称基本一致,参数不同,如任务创建函数,

FreeRTOS中实现:

77a1b66c-3d03-11f0-b715-92fbcf53809c.png

SAFERTOS中实现:

WHIS提供了如何从FreeRTOS升级到SAFERTOS的说明文档,详细介绍了FreeRTOS和SAFERTOS API差异。

升级文档及简单的SAFERTOS用户手册,可以访问https://www.highintegritysystems.com/down-loads/manuals-datasheets/safertos-datasheet-downloads/注册下载。

RTOS定义的抽象类型名称及# include文件也不相同。在FreeRTOS中,一个应用程序文件需要包含所使用的API(任务、队列、信号量等)相应的头文件,而使用的SAFERTOS应用只需要包含SafeRTOS_API.h头文件。

静态分配和MPU

SAFERTOS要求应用程序提供管理任务和内核对象所需的内存空间。

例如,FreeRTOS和SAFERTOS都创建了运行在最低优先级的空闲任务,来确保系统中永远有可调度的就绪任务。空闲任务不能阻塞,可以将空闲任务用于“后台”应用程序功能,实现节能或其他特定的应用需求。显然,空闲任务需要一个任务堆栈及任务控制块。FreeRTOS从堆中分配这些空间(除非配置使用静态分配机制),而SAFERTOS要求应用提供这些缓冲区空间。部分原因是在安全关键系统中,静态分配通常是首选,因为它更容易保证所有运行时环境都有足够的内存,但另一个需要考虑的事实是,绝大多数情况下,SAFERTOS接口层假定使用MPU。

使用MPU意味着应用设计人员需要监督所有内存结构在地址中的确切位置,内核任务和队列缓冲区显然是其中重要的一部分。此外,MPU机制通常对保护区域的对齐和大小有限制,分配的空间需满足MPU要求,避免资源浪费。

在FreeRTOS中,在调用xTaskCreate之前需确保heap中有足够的空闲空间,使用SAFERTOS时,需要静态地为堆栈和任务TCB预分配并显式定位一个相应大小和对齐的缓冲区,然后将指向这些结构的指针传递给xTaskCreate任务参数。

任务特权和内核函数封装层

每个SAFERTOS任务被分配一个操作权限:特权或非特权模式。特权任务与内核代码具有相同的权限。许多CPU支持特权和非特权模式,限制非特权模式下使用的CPU指令,用户可以通过软件陷阱、异常或中断在不同特权模式直接切换。

通常,将尽可能多的应用程序运行在非特权模式,每个任务都提供一组MPU参数,这些参数通常任务切换时配置相应的MPU域。

SAFERTOS任务创建时,为每个任务添加了一个额外的MPU区域,用于访问用户任务堆栈,应用程序须确保任务的堆栈符合MPU关于对齐和尺寸的限制。

非特权任务还需要具有对内核API函数的执行访问权。内核API工作在特权模式, SAFERTOS的每个API函数都有一个特权升级封装,通常使用系统调用异常机制实现。API封装层将在需要时临时提升任务权限,允许非特权任务执行内核API,执行完成后返回任务原先的权限。因为实际的API函数与调用时的名称不同,调试不方便。

尽管FreeRTOS可以使用类似的权限升级机制来支持MPU,但仅提供了有限的MPU移植层支持。在SAFERTOS中,我们假定应用程序任务运行在非特权模式。在FreeRTOS的MPU移植中,任务默认以特权模式运行,但是任务可以选择创建为restricted,即非特权模式。

嵌入式系统不断扩大的互联性导致了复杂的操作环境和越来越多的攻击媒介,增加了安全需求。SAFERTOS基于FreeRTOS功能模型,用户可以快速从FreeRTOS升级到功能安全的SAFERTOS。更多视频、文档及示例工程,可以访问WHIS官网下载。