0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何进行AUTOSAR架构下的OS错误处理?

汽车电子嵌入式 来源:汽车电子嵌入式 2023-10-07 09:33 次阅读

正文

1. OS错误处理介绍

1.1 错误类型

OS的Error类型分为三类,Application Errors, Protection Errors, Kernel Errors, 每种Errors产生的原因及产生Error后OS执行的动作都不相同,详见下表:

Error Types Feature
Application Errors 1.如果操作系统无法正确执行应用程序请求的操作系统提供的API服务,则引发Application Erros。典型情况就是操作系统API使用错误(例如对象ID无效)。
2.Application Error不会损坏操作系统内部数据。
3.如果配置了Error Hook,则OS会调用ErrorHook(),ErrorHook()是一个Callout函数,需要用户自定义错误处理机制。
4.不会造成OS调用Shutdown/terminate。应用程序可以通过简单地从ErrorHooks返回来继续执行。
Protection Errors 1.如果应用程序违反其配置的边界则会触发Protection Errors, 典型的就是配置了内存保护或者时间保护后发生内存非法访问或超时。
2.Protection Errors不会损坏操作系统内部数据。
3.在发生未处理的异常和中断时会触发Protection Error。
4.将导致ProtectionHook()的调用,在该调用中可以选择引发Shutdown或Terminatehanding(ProtectionHook返回值将觉得OS接下来的执行流,无论是否重新启动)。
5.如果配置了Shutdownhook,则会调用ShutdownHook().
6.如果配置了ProtectionHook,则会调用ProtectionHook().
Kernel Errors 1.如果操作系统无法再确保其内部数据的正确性,则引发Kernel Errors(例如,ProtectionHook()期间内存访问违规)。
2.发生Kernel Errors后OS会关闭所有中断且调用Os_PannicHook()通知应用程序。
3. 最后操作系统进入无限循环。

1.2 错误码

发生Application Errors后OS会调用ErrorHook(),ErrorHook()函数是callout函数,函数原型:

(void) ErrorHook(StatusType Error);

参数Error标识具体的错误码

发生Protection Errors后OS会调用ProtectionHook(), ProtectionHook函数是callout函数,函数原型:

ProtectionReturnType ProtectionHook(StatusType Fatalerror);

参数Fatalerror标识具体的错误码

返回值类型ProtectionReturnType是一个枚举类型:

typedef enum ProtectionReturnType_e
{
  PRO_IGNORE,
  PRO_TERMINATETASKISR,
  PRO_TERMINATEAPPL,
  PRO_TERMINATEAPPL_RESTART,
  PRO_SHUTDOWN,
  PRO_NOTCONFIGURED
} ProtectionReturnType;

也就是,我们可以通过自定义ProtectionHook()的返回值来控制发送ProtectionHook后Os的执行流。

每个厂商(Vector, Etas…)Os实现的Os_Types.h文件中都具体定义了每一种ErrorCode,这里以Vector的代码实现为例说明每种Error Type包含的常见的Error Code:

ErrorTypes 包含的Error Codes
Application Errors E_OS_ACCESS: Illegal access
E_OS_CALLEVEL:Invalid calling context.
E_OS_ID:Invalid OS object ID.
E_OS_LIMIT: Maximum task activations reached.
E_OS_NOFUNC: OS object is currently not in use.
E_OS_RESOURCE:Scheduling requested with occupied resource.
E_OS_STATE: OS object is not in correct state to perform the requested operation.
E_OS_VALUE:Given value is out of the configured range.
E_OS_SERVICEID: Service cannot be called.
Protection Errors E_OS_PROTECTION_MEMORY:A memory access violation occurred.
E_OS_PROTECTION_EXCEPTION: A trap occurred.
E_OS_SYS_PROTECTION_SYSCALL: An unhandled syscall occurred.
E_OS_STACKFAULT: A stack fault detected via stack monitoring by the OS.
E_OS_SYS_API_ERROR: Wrong API usage.

1.3 Davinci中配置OsHooks

三个Error相关的Hook函数可以在Davinci中配置,如果配置后就需要用户自定义实现。

wKgaomUgtc-AdkJFAABuV41kk-E343.jpg

2. 自定义错误处理

通过第一节,我们知道了Error的类型及其包含的具体的Error Code,同时,如果我们配置Error发生后Hook函数,那么在Error发生时我们就能被通知到。那么现在,我们在Error发生后应该考虑如何存储错误相关的信息,同时能在事后通过存储的Error相关信息定位和分析Error。

2.1 错误信息存储

背景知识1RAMRetention。RAMretention是一种技术,用于在断电后保持随机存取存储器(RAM)中的数据。在计算机系统中,RAM是一种易失性存储器,这意味着在断电情况下,其中的数据会被清除。这对于一些应用程序来说是不可接受的,因为它们需要在断电后仍然能够保持数据。这就是RAMretention技术的用武之地。

背景知识2:断电系统和深度休眠系统。ECU在设计时根据具体需求可以在硬件上添加SBC或无SBC。如果ECU有SBC,ECU就是一个断电系统。那么ECU在系统下电(Shutdown)流程的最后一步会调用SBC的服务接口断掉MCU的电,整个MCU在休眠中是处于断电状态的。在外部信号(Can Transceiver/Lin Transceiver的INH引脚,Dio唤醒引脚 )唤醒MCU时,SBC重新给MCU供电,MCU重新冷启动。

如果ECU无SBC,ECU就是一个深度休眠系统。那么ECU在系统下电(Shutdown)流程的最后一步会调用MCU的服务进入到Deep Sleep深度休眠状态(MCU陷入深度休眠状态,程序不在运行,但是MCU还有电存在)。在外部信号(Can Transceiver/Lin Transceiver的INH引脚,Dio唤醒引脚 )通过中断唤醒MCU,MCU被唤醒后,程序可以选择软件复位,整个软件重新运行,也可以选择从上次停止的地方接着运行。

wKgZomUgteGAWym7AABEsaL61KY124.jpg

Aurix芯片进入深度休眠后后SCR会接管芯片控制,在进入SCR前可以配置PMS模块的PMSWCR0.STBYRAMSEL位域,选择给哪快RAM进行供电。只有休眠后改被供电的RAM才有RAMRetentions的功能。

wKgaomUgtfCAe06uAACDX0HDrg0863.jpg

问题1:为什么要考虑错误信息的存储了?

:因为Error发生时如果时Protection Error的话,一般就会在OS调用ProtectionHook()后执行Shutdown,在ShutdownHook()中一般执行ECU复位了,如果我们不存储Error发生时的上下文信息的话,一旦系统复位的话我们就无法再分析Error发生的原因了。

问题2:错误信息存储在那里了,是不是可以存储在NvM?

:错误信息可以存储在NvM中,但是因为ProtectionHook()后一般马上就要进行MCU复位了,来不及调用异步的NvM接口来存储错误信息了,所以只能把错误信息存储到Retention RAM中。复位起来后,错误信息处理SWC读取Retention RAM中的异常信息,此时可选择是否再次写入到NvM当中。

Note:

1.如果系统是断电系统,那么一定要注意OS ShutdownHook()中调用Mcu_PerformReset()进行软件复位而不是调用SBC的接口给MCU断电,因为MCU断电后是冷启动,Retention RAM中的数据也没了。

2.如果系统是深度休眠系统且使用Aurix芯片的SCR功能,那么Retention RAM一定要配置在PMSWCR0.STBYRAMSEL配置供电的RAM块中。

3.无论是深度休眠系统还是断点系统,MCU复位后在Main函数之前的Startup阶段都不能把Retention RAM给清零了(需要修改启动代码和连接器脚本)。

2.2 关键上下文信息获取

问题1:通过2.1小结我们知道错误信息应该存放在Retention RAM当中,那么我们应该存储哪些异常时的上下文信息了?

:我们通过一个表格来举例给出答案。

Error Types Error Contex
Application Errors 如果在使用Spinlock是发生Application Error,可以获取以下信息:
1.通过Os_GetDetailedError()获取服务ID及Error Code等信息。
2.通过OSError_GetSpinlock_SpinlockId()返回错误的GetSpinlock调用的参数SpinlockId.
使用其他OS服务,比如Alarm, Resource等发生错误时同样可以调用OsError_xxx_xxx()获取相关错误现场信息。
Protection Errors 1.ProtectionHook()的参数Fataerror.
2.通过GetTaskID获取Error发生时的正在处理的Task.
3.通过GetISRID()获取当前执行ISR的标识符。
4.通过Os_GetExceptionAddress()获取引发最新异常的指令的地址。
5.读取DEADD寄存器获取发生trap时的地址信息。
6.通过Os_GetExceptionContext()获取异常上下文信息,异常结构体为:struct Os_ExceptionContextType_Tag;
通过结构体成员RaExceptionSource对应的TINClass信息,可以轻松定位MPU保护产生的Error.
Kernel Errors 通过GetTaskID获取Error发生时的正在处理的Task.

/*!Setofhardwareregisterstobeabletoresumefromanexception.*/
structOs_ExceptionContextType_Tag
{
/*StoredAddressregistersofthethread(a2-a7,a12-a15)*/
uint32AddressRegisters[16];
/*StoredDataregistersofthethread(d0-d15)*/
uint32DataRegisters[16];
/*!Storedreturnaddressofthethread*/
uint32Ra;
/*!StoredPswofthethread*/
uint32Psw;
/*!StoredExceptionsource(Exceptionclassandtinnumber)ofthethread*/
uint32ExceptionSource;
/*!StoredPcpn(PreviousCPUPrioritynumber)fromthePcxiofthethread*/
uint32Pcpn;
/*!StoredPie(PreviousInterruptEnable)fromthePcxiofthethread*/
uint32Pie;
/*!TheloweraddressoftheMPUregionforstack.*/
uint32MpuRegionForStackLow;
/*!TheupperaddressoftheMPUregionforstack.*/
uint32MpuRegionForStackUpper;
/*!TherawPCXIvaluefromtheuppercontext;maybeusedtolookupinCSAspriortotheexception*/
uint32RawPCXI;
};

2.3 错误定位

对于Application Error一般都是错误使用OSAPI导致的,只要我们记录好错误发生时的ServiceID等就能轻松定位。

对于Kernel Error由于OS内部数据可能被异常打乱了,数据不在可信,可获取的上下文信息不多,这类错误就只能根据具体硬件平台和OS代码积累经验了(开发阶段可以通过故障注入提前获知Kernel Error产生后的表现)。

实际项目中最可能出问题的就是Protection Error了,而这里面也以MPU保护Error为最常见。出现内存保护Error后,通过Ra(A11程序返回寄存器)查找Map文件可以大概知道那块代码(指令所在的地址)发生异常;通过DEADD寄存器可以得知大概是访问了哪块Data数据(访问的数据的地址)发生了异常,比如异常改写了调用栈内容。

3.总结

最后通过回答开头的三个问题来结束本文。

问题1:有哪里常见的OS错误 ?

:大类有Application Errors, Protection Errors, Kernel Errors三种,每种大类包含的具体ErrorCode可以参考1.1章节。

问题2:如何进行OS错误处理?

:通过Retention RAM来存储OS错误信息,通过OS给出的一系列API获取Error发生时的上下文信息。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RAM
    RAM
    +关注

    关注

    7

    文章

    1175

    浏览量

    112934
  • SCR
    SCR
    +关注

    关注

    2

    文章

    115

    浏览量

    43312
  • AUTOSAR
    +关注

    关注

    6

    文章

    260

    浏览量

    20931
  • SBC
    SBC
    +关注

    关注

    0

    文章

    59

    浏览量

    18889
  • 易失性存储器

    关注

    0

    文章

    12

    浏览量

    6591
收藏 人收藏

    评论

    相关推荐

    labviEW错误处理的问题

    错误处理和C:\data.txt不存在的情况,没有显示错误对话框啊?
    发表于 04-01 10:03

    LabVIEW错误处理问题

    ,就是连接硬件采集波形时,需要滤掉直流波,但是采集到的波形时断断续续的,所以错误处理时会停止程序,我想问一,运行时怎么忽略掉这个错误
    发表于 09-18 18:29

    AUTOSAR分层架构

    AUTOSAR分层
    发表于 09-26 11:12

    急求,无错误的程序弹出简易错误处理框图,该怎么解决?

    错误处理”框图。并且卡在这里不运行下去了,不知道怎么回事,还请各位前辈帮忙解答一,万分感谢。还想请问一图上最右边那个“简易错误处理”上头的绿色小箭头突然出现是怎么回事?
    发表于 10-04 16:18

    AUTOSAR架构深度解析 精选资料推荐

    AUTOSAR架构深度解析本文转载于:AUTOSAR架构深度解析目录AUTOSAR架构深度解析AUTOSAR分层结构及应用软件层功能应用软件层虚拟功能总线VFB及运行环境RTE基础软件层(BSW)层
    发表于 07-28 07:40

    介绍AUTOSAR支持的四种功能安全机制

    AUTOSAR架构,分区是以OS-Application为对象划分
    发表于 06-10 17:33

    AF错误处理

    关于AF的错误处理,例如我进行串口通讯,打开串口错误,但是我不想停止AF,想继续尝试连接要怎么做?
    发表于 02-03 15:44

    LabVIEW中的错误处理

    错误处理功能;对于可预见的错误,是否可以选择直 接忽略,或者前几次尝试忽略直到该特定
    发表于 05-24 11:07 6次下载

    Spring Boot框架错误处理

    进行处理。以下是译文《/em》《/p》《p》API在提供错误消息的同时进行适当的错误处理,是一个非常有用的
    发表于 09-28 15:31 0次下载

    嵌入式系统C语言编程中的错误处理资料总结

    错误处理方式。文中涉及的代码运行环境如下:
    发表于 11-28 10:39 1595次阅读

    Rust代码启发之返回值异常错误处理

    错误处理代码和业务逻辑交织在一起,也容易忽略处理错误。以及把返回值只用于错误返回,有点浪费的感觉。因为很多时候把计算结果作为返回值,更符合思考的逻辑。
    的头像 发表于 09-22 09:24 1241次阅读
    Rust代码启发之返回值异常<b>错误处理</b>

    嵌入式编程错误处理机制设计

    错误处理方式。文中涉及的代码运行环境如下。
    发表于 04-28 09:59 361次阅读
    嵌入式编程<b>错误处理</b>机制设计

    一文入门AUTOSAR OS

    Autosar OsAutosar 框架中上至RTE 下至驱动,中间可以和BSW 基础模块进行交互。是整个autosar 框架下最重要的组成部分。
    的头像 发表于 06-29 10:34 1210次阅读
    一文入门<b>AUTOSAR</b> <b>OS</b>

    嵌入式系统C语言编程中主要的错误处理方式

    错误处理方式。
    发表于 07-24 16:40 176次阅读
    嵌入式系统C语言编程中主要的<b>错误处理</b>方式

    Rust语言中错误处理的机制

    错误,实际运行中仍然可能出现各种各样的错误,比如文件不存在、网络连接失败等等。对于这些不可预测的错误,我们必须使用错误处理机制来进行处理。在本教程中,我们将介绍Rust语言中错误处理的机制,以及如何编写安全、可靠的错
    的头像 发表于 09-19 14:54 340次阅读