转自 | 麦克泰手艺
FreeRTOS是一个面向微控制器和小型微处理器的及时操纵体系,基于MIT license许可散发,FreeRTOS的构建夸大可靠性和易用性。
汽车、医疗和工业等市场的平安标准意味着设计者需求一个相干行业规范认证过的RTOS,但认证RTOS在长时间的平安项目早期将是一笔低廉的开销。
SAFERTOS是一个平安关头RTOS,通过了IEC61508和ISO26262预认证。SAFERTOS接纳与FreeRTOS沟通的性能模子,为平安而构建。平安产物中,项目原型能够应用FreeRTOS内核完成,在正式开辟阶段再转为SAFERTOS。
硬件平台:NXP Freedom K64F开发板- FRDM K64F
开辟环境:MCUXpresso IDE v11.1
示例项目可收费从
www.highintegritysystems.com/down-loads/下载。
1、FreeRTOS_Demo-根底的FreeRTOS工程
2、RTOS_Demo-特权模式的SAFERTOS工程
3、RTOS_UnprvDemo-拥有非特权使命的SAFERTOS项目
与FreeRTOS相比,SAFERTOS:
· API函数更少
· 函数中执行了更多的谬误查抄
· 大多数API挪用会前往状况码,别的函数经由过程援用前往数据
· 需求使用供应所有客栈,使命操纵块和行列缓冲区内存
· 应用动态调配机制,不供应heap函数
· 默许应用处理器的MPU单位
· 完整从新设想,餍足平安关头软件需要
是以,当将FreeRTOS项目迁移到SAFERTOS时,需要做一些事情来实现内核启动和运转。
FreeRTOS外部潜藏了许多惯例内存治理,在使命建立时静态调配客栈,在内核启动时调配内核缓冲区等。在Free RTOS中也能够设置动态调配,由使用步伐供应内存,但大多数人倾向于更简略的要领,让FreeRTOS完成。
FreeRTOS还供应了许多编译选项,并经由过程hook宏机制,同意使用步伐设计者在内核中拔出额定的性能代码,在使命切换时运转,比方,在使命删除或建立时,运转额定的hook函数。
RTOS界说的范例称号分歧。应用FreeRTOS,使用步伐文件需求包括(#include)API(使命,行列,信号量)响应的头文件;SAFERTOS中,使用步伐文件只需要包括一个SafeRTOS_API.h头文件。
SAFERTOS请求使用使命和内核工具所需的内存动态调配。平安严峻体系保举动态调配机制,轻易证实运转时有足够的内存空间。
绝大多半SAFERTOS移植中假设使用了MPU。MPU的应用意味着使用步伐设想职员需求监视内存布局地点的切实地位,包孕内核使命和行列缓冲区。另外,MPU还需餍足地区的对齐和巨细限定,使用步伐工程师需求子细部署空间,以防止空间浪掷。
是以,应用FreeRTOS时,在挪用xTaskCreate以前,需确保heap中足够的余暇空间。应用SAFERTOS,需求预先调配并定位对齐的客栈及使命TCB内存,而后将指向这些布局的指针通报到xTaskCreate的响应参数。
每一个SAFERTOS使命被调配一个操纵权限,特权(Privileged)使命与内核代码拥有沟通的权限,许多CPU支撑特权(privileged)和非特权(unprivileged)模式限定非特权模式的指令造访无限的软件trap非常中缀等。
SAFERTOS使命建立时,增加了一个MPU界说用户使命客栈,确保使命造访本人客栈。
内核API事情在特权模式,SAFERTOS每一个API有一个权限进级封装(privilege-escalating wrapper经由过程触发非常一般为体系挪用)、同步中缀或CPU的trap完成。API的封装经由过程且自晋升使命权限同意非特权使命施行内核API施行完成后降回使命本来的权限由于实践的API函数历时称号分歧,调试不方便。
示例项目中包括一个领导天生Amazon FreeRTOS项目:FreeRTOS_Demo。
工程构建主动天生链接定位文件因为SAFERTOS工程修正链接文件咱们但愿主动天生的链接文件遮盖修正内容天生的链接文件从Debug目次迁移到独自目次,并在工程选项封闭主动天生linker文件,并指向新的链接文件目次。
删除工程amazon-freertos目次中的代码,替换为SAFERTOS库及头文件修正工程options中的include path-C/C++ Build/Settings->Tool Settings->MCU C compiler->includes,
SAFERTOS需求应用链接文件界说的段和变量标记配置MPU地区维护内核代码和数据需求标记可查阅portmpu.h文件。
内核函数段名为kernel_func,内核数据段为kernel_data,GCC中,内核函数和数经由过程段属性放到响应段中。
内核函数平日紧随向量表搁置。内核数据搁置RAM中的某个地位吻合MPU对齐需求。
链接文件还需导出肇端完结标记,ROM及RAM肇端地点完结地点巨细。
在portmpu.h需求以下标记
·lnkStartFlashAddress
· lnkEndFlashAddress
· lnkStartKernelFunc
· lnkEndKernelFunc
· lnkStartKernelData
· lnkEndKernelData
· lnkRAMEnd(RTOS_Demo_Debug_memory.ld)
· lnkRAMStart(RTOS_Demo_Debug_memory.ld)
K6xxF移植需求SysTick,PendSV,SVC中缀,这些函数应用CMSIS界说完成处置响应处置进口位于默许的向量表地位,RTOS能够定名本人非常处置函数。
在SAFERTOSConfig.h经由过程#defining完成SAFERTOS非常处置替换CMSIS界说,但SAFERTOS库文件无奈修正能够从新界说startup文件向量表中的CMSIS称号。
工程代码中,向量表界说位于startup_mk64f12.c文件,在该文件拔出:
/* SAFERTOS system tick, SVC and PendSV handlers */
#define SysTick_Handler vTaskProcessSystemTickFromISR
#define SVC_Handler vSafeRTOSSVCHandler
#define PendSV_Handler vSafeRTOSPendSVHandler
与FreeRTOS分歧,SAFERTOS在启动时查抄向量表条款假如它们不存在或不正确谢绝运转。
4、内核hook函数
SAFERTOS供应无限的hook函数此中最主要的是Error Hook函数体系检测到弗成复原错误时,进入平安谬误状况比方检测到毁坏的TCB客栈溢出挪用error hook。项目中,error hook是一个简略有限轮回(位于HookFunctions.c文件)。
5、内核使命、内核设置及启动
除hook函数地点外,还需将客栈及TCB地点巨细传给余暇使命和timer使命(可选),内核使命还需MPU参数,timer敕令行列等信息。SAFERTOS经由过程一个公用布局将参数传给公用的API设置内核使用从FreeRTOS迁移到SAFERTOS庞杂部份设置并启动调理器。
内核设置包括内核使命客栈和TCB)信息,放在独自的SafeRTOSConfig.c文件中。
在内核启动每一个阶段设置布局通报到内核设置函数后,内核启动,API前往响应谬误代码。函数前往谬误代码能够在内核include目次的projdefs.h文件中查找寄义。该文件列出了所有谬误代码信息。
在FreeRTOS建立使命所需的6个参数间接传递给xTaskCreate()函数,函数前往新创建使命的句柄或pdFALL谬误信息。在SAFERTOS使命参数更多经由过程一个指向移植特定的xTaskParameters布局参数,传递给xTaskCreate(),第二个参数接受新创建使命的句柄,函数前往pdPASS或错误码。
在示例能够看到,FreeRTOS与SAFERTOS使命称号和参数各不沟通。SAFERTOS使命参数另有每一个使命的特权级别和MPU地区配置。第一步咱们使所有使命都运行在特权级别以是今朝不需要额定的MPU参数,这些参数配置为0/null。
7、更新挪用的API
针对每一个API挪用查抄修正SAFERTOS对应的函数称号及返回值。
除API函数称号分歧外,移植界说范例名也有差别能够借助IDE的search&replace性能替代。
将某个使命标记为unprivileged而后加载运转使用步伐假如使用终究进入MPU fault处置步伐能够查抄调试器的寄存器辨认毛病地点能够测验考试应用调试器逼迫处置步伐前往倏地辨认致使MPU毛病的指令。
示例每一个LED使命需求造访同享的“brightness request”数组处置造访该数据的互斥量,互斥量buffer仅由内核代码造访使命若何完成造访同享RAM region?
在链接文件建立一个定名段,导出开端地点巨细标记增添搁置属性来指定函数或变量的定位,在GCC以下:
__attribute__ ( ( section ( “section_name”)))
本文经由过程一个简略的示例工程迁徙进程,探讨了FreeRTOS和SAFERTOS差别。
免责申明:本文内容由21ic取得受权宣布,版权归原作者所有,本平台供应信息存储办事。文章仅代表作者小我私家观念,不代表本平台态度若有题目联络咱们感谢!