在嵌入式应用中,有可能发生各种各样的错误,系统必须能够检测到这些错误并作出适当的响应。RTOS通常内置了一些错误检查功能,用于检测错误并向应用提供响应错误的方法。
错误分类
开发和运行RTOS应用程序中的错误可以分为两类。第一类错误与RTOS的配置相关,这些错误可以在应用程序编译之前通过完整性检查检测到,称之为配置检查。
在使用RTOS时,通过修改配置值以满足应用程序的需要。应用程序开发人员可以在其约束范围修改这些值,约束限制包括硬件约束或实现约束。通过RTOS代码中的#ifdef或#error这样的预处理器指令可以实现配置检查。预处理检查在代码编译之前进行,检查是否存在配置错误。
第二类错误是在应用程序运行时发生,称为运行时错误。根据运行时错误发生的不同原因,有不同的错误检测策略。本文关注第二类错误检查。
运行时错误
运行时错误的原因包括传递给API函数的非法参数,如空指针而非有效的任务句柄,或超出给定范围的值,可以错误通过API函数使用之前的参数检查检测。
内存损坏导致的非法或错误行为是另一类运行时错误,可以使用内存检查算法如校验和或奇偶校验位检测这些错误。如果只需要检查几个非常重要的值,可以在不同的内存地址中存储这些值的备份(或按位翻转的值),并在访问该值时比较它们,这些值被称为镜像值。
RTOS堆栈
RTOS中的每个任务都有自己的堆栈,用于存储本地变量、返回地址、函数参数、返回值及其上下文。因此,内核必须检查每个堆栈是否驻留在自己内存地址,否则一个任务的堆栈内容可能被其他任务破坏。已使用堆栈的大小会随着应用的执行不断变化,例如函数调用深度的增加。由于物理内存空间有限,堆栈溢出可能导致内存损坏。为了防止这种错误,在存储任务上下文之前,RTOS内核必须检查堆栈的可用空间。
功能单元
RTOS应用程序中的每个任务都是一个独立的功能单元,拥有独立的内存空间。任务访问与另一项任务相关联内存也可能导致内存破坏,必须加以预防。可以使用内存保护单元为任务定义内存区域和访问权限。如果一个任务访问了未被授权的内存,MPU将生成一个异常,该异常将由应用程序处理。
错误处理
检测到错误后,必须以某种方式通过应用程序处理,如何通知应用程序取决于错误类型以及错误的严重程度。在API函数中发出错误信号的一种方法是通过其返回值中的状态码。应用代码应该检查所有API函数的返回值。根据错误代码,应用程序可以恢复某些错误。如果出现不可恢复错误,应用程序应将系统转换到安全状态。RTOS还可以调用应用定义的错误处理函数,在错误发生时实现相应处理,此方法通常用于不可恢复的错误,错误处理程序尾部是一个无限循环,该函数不会返回。
SAFERTOS中的错误检查
功能安全操作系统SAFERTOS对所有传递给API函数的参数执行错误检查。API函数返回类型为portBaseType的状态码,其中包含错误码。通过检查状态码可以确定调用是否成功。预定义错误代码的列表参见文件projdefs.h。
SAFERTOS通过调用vApplicationErrorHook实现错误处理,该函数由应用定义,在检测到错误而没有返回错误码时,内核将调用该函数。
SAFERTOS实现的一些错误检查示例如下:
•检查API函数参数是否包含有效句柄和值。
• SAFERTOS中的堆栈是预先分配的字节数组,包含正在使用的堆栈标记,防止其被多个任务访问。
•任务控制块包含有关堆栈限位信息,内核可以在存储任务上下文前检查可用的堆栈空间,防止堆栈溢出。
•使用镜像值检查重要的系统参数,如堆顶地址,堆栈限制,FPU使用标记和TCB中的MPU设置。滴答值和SVC处理程序地址也保存了其镜像值。
•如果硬件包含MPU,SAFERTOS默认启用该功能,使用它来管理多个任务可能访问的内存区域。
麦克泰技术是SAFERTOS在中国的代理商,具有超过20年嵌入式实时操作系统的市场、服务和培训经验,关于SAFERTOS的更多信息,欢迎咨询麦克泰。
-
嵌入式
+关注
关注
5086文章
19140浏览量
305860 -
RTOS
+关注
关注
22文章
815浏览量
119702 -
应用程序
+关注
关注
37文章
3277浏览量
57738
原文标题:RTOS中的错误检查机制
文章出处:【微信号:麦克泰技术,微信公众号:麦克泰技术】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论