AUTOSAR架构下的OS错误处理

原创 汽车电子嵌入式 2023-10-07 08:02

前言

汽车ECU开发,到最后最难的两类问题一个是硬件相关的偶发问题,一个就是系统相关的偶发问题。硬件相关的偶发问题和ECU工作的温度,负载,线束等各种外因相关,这里暂不做讨论。系统相关的偶发问题一般都和OS相关,能够通过OS的错误处理机制能识别出来。我们在软件设计阶段就应该把能提前预知的错误考虑进去,当问题出现的时候能快速的定位问题发生的原因和位置。本文就来介绍下OS的错误类型,以及OS错误发生后常见的处理办法。每个感兴趣的读者都可以考虑以下三个问题:

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

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

问题3:如何定位OS错误发生的原因和位置?

缩略

简写

全称

SCR

Standby Controller

PMS

Power Management System

PMSWCR0

Standby and Wake-up Control Register0

STBYRAMSEL

Standby RAM supply in Standby Mode

DEADD

Data Error Address Register

参考文档:

1.TriCoreTM TC1.6.2 core architecture manual .

2.MICROSAR Classic OS Technical Reference.

3.Specification of Operating System AUTROSAR CP Release 4.3.1.


注:本公众号文章中使用了一些第三方工具和文档,若有侵权,请联系作者删除!


正文

1.  OS错误处理介绍

1.1 错误类型

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


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()的调用,在该调用中可以选择引发ShutdownTerminate handingProtectionHook返回值将觉得OS接下来的执行流,无论是否重新启动)。

 

5. 如果配置了Shutdownhook,则会调用ShutdownHook().

 

 

6. 如果配置了ProtectionHook,则会调用ProtectionHook().

 

 

Kernel Errors

1. 如果操作系统无法再确保其内部数据的正确性,则引发Kernel Errors(例如,ProtectionHook()期间内存访问违规)。

 

 

2. 发生Kernel ErrorsOS会关闭所有中断且调用Os_PannicHook()通知应用程序。

 

 

3. 最后操作系统进入无限循环。

1.2 错误码

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


(void) ErrorHook(StatusType Error);


参数Error标识具体的错误码

发生Protection ErrorsOS会调用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()的返回值来控制发送ProtectionHookOs的执行流。


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


Error Types

包含的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中配置,如果配置后就需要用户自定义实现。


 

2. 自定义错误处理

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


2.1 错误信息存储

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


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


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


 

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


 

问题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给清零了(需要修改启动代码和连接器脚本)。


参考文档:

RH850-U2A16芯片--RAM and Flash介绍

AUTOSAR架构下RH850芯片断电系统配置实践

AUTOSAR架构下RH850芯片深度休眠配置实践-Conifig EcuM and BswM


2.2 关键上下文信息获取


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


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


Error Types

Error Contex

Application Errors

如果在使用Spinlock是发生Application Error,可以获取以下信息:

 

1. 通过Os_GetDetailedError()获取服务IDError 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.


/*! Set of hardware registers to be able to resume from an exception. */struct Os_ExceptionContextType_Tag{  /* Stored Address registers of the thread (a2-a7, a12-a15)*/  uint32 AddressRegisters[16];  /* Stored Data registers of the thread (d0-d15)*/  uint32 DataRegisters[16];  /*! Stored return address of the thread */  uint32 Ra;  /*! Stored Psw of the thread */  uint32 Psw;  /*! Stored Exception source(Exception class and tin number) of the thread */  uint32 ExceptionSource;  /*! Stored Pcpn (Previous CPU Priority number) from the Pcxi of the thread */  uint32 Pcpn;  /*! Stored Pie (Previous Interrupt Enable) from the Pcxi of the thread */  uint32 Pie;  /*! The lower address of the MPU region for stack. */  uint32 MpuRegionForStackLow;  /*! The upper address of the MPU region for stack. */  uint32 MpuRegionForStackUpper;  /*! The raw PCXI value from the upper context; may be used to look up in CSAs prior to the exception */  uint32 RawPCXI;};



2.3 错误定位

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


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


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



3.总结

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


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


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


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


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


问题3:如何定位OS错误发生的原因和位置?


:具体参考2.3章节。



End

「汽车电子嵌入式在CSDN上同步推出AUTOSAR精进之路专栏,本专栏每个模块完全按实际项目中开发及维护过程来详细介绍。模块核心概念介绍、实际需求描述、实际工程配置、特殊需求介绍及背后原理、实际工程使用经验总结。目的是让读者看完每一个章节后能理解原理后根据需求完成一个模块的配置或者解决一个问题。」


点击文章最后左下角的阅读原文可以获取更多信息


或者复制如下链接到浏览器获取更多信息

https://blog.csdn.net/qq_36056498/article/details/132125693



注:本公众号文章中使用了一些第三方工具和文档,若有侵权,请联系作者删除!


推荐阅读

汽车电子嵌入式精彩文章汇总第一期:20210530-20230703

AUTOSAR 架构下EcuM唤醒源事件详解

AUTOSAR架构下NVM Block连续写及Default Value问题分析

AUTOSAR架构下NvM模块详细分析

AUTOSAR架构下报文掉线超时不上报问题分析

Classic Autosar下的以太网通讯架构概览

通信中间件Someip服务化通信

AUTOSAR架构下Fee详细分析

TC37x芯片FLASH基本概念介绍

AUTOSAR架构下Fls详细分析

TC3xx芯片DMU介绍

TC3xx芯片MPU介绍

TC3xx芯片的Trap详解

End



欢迎点赞,关注,转发,在看,您的每一次鼓励,都是我最大的动力!

汽车电子嵌入式

微信扫描二维码,关注我的公众号

评论
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 124浏览
  • 故障现象一辆2017款东风风神AX7车,搭载DFMA14T发动机,累计行驶里程约为13.7万km。该车冷起动后怠速运转正常,热机后怠速运转不稳,组合仪表上的发动机转速表指针上下轻微抖动。 故障诊断 用故障检测仪检测,发动机控制单元中无故障代码存储;读取发动机数据流,发现进气歧管绝对压力波动明显,有时能达到69 kPa,明显偏高,推断可能的原因有:进气系统漏气;进气歧管绝对压力传感器信号失真;发动机机械故障。首先从节气门处打烟雾,没有发现进气管周围有漏气的地方;接着拔下进气管上的两个真空
    虹科Pico汽车示波器 2025-01-08 16:51 70浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 164浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
    GIRtina 2025-01-07 11:02 124浏览
  • 「他明明跟我同梯进来,为什么就是升得比我快?」许多人都有这样的疑问:明明就战绩也不比隔壁同事差,升迁之路却比别人苦。其实,之间的差异就在于「领导力」。並非必须当管理者才需要「领导力」,而是散发领导力特质的人,才更容易被晓明。许多领导力和特质,都可以通过努力和学习获得,因此就算不是天生的领导者,也能成为一个具备领导魅力的人,进而被老板看见,向你伸出升迁的橘子枝。领导力是什么?领导力是一种能力或特质,甚至可以说是一种「影响力」。好的领导者通常具备影响和鼓励他人的能力,并导引他们朝着共同的目标和愿景前
    优思学院 2025-01-08 14:54 66浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 158浏览
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 144浏览
  •  在全球能源结构加速向清洁、可再生方向转型的今天,风力发电作为一种绿色能源,已成为各国新能源发展的重要组成部分。然而,风力发电系统在复杂的环境中长时间运行,对系统的安全性、稳定性和抗干扰能力提出了极高要求。光耦(光电耦合器)作为一种电气隔离与信号传输器件,凭借其优秀的隔离保护性能和信号传输能力,已成为风力发电系统中不可或缺的关键组件。 风力发电系统对隔离与控制的需求风力发电系统中,包括发电机、变流器、变压器和控制系统等多个部分,通常工作在高压、大功率的环境中。光耦在这里扮演了
    晶台光耦 2025-01-08 16:03 61浏览
  • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
    丙丁先生 2025-01-07 09:25 117浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 223浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 204浏览
  • 本文介绍编译Android13 ROOT权限固件的方法,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。关闭selinux修改此文件("+"号为修改内容)device/rockchip/common/BoardConfig.mkBOARD_BOOT_HEADER_VERSION ?= 2BOARD_MKBOOTIMG_ARGS :=BOARD_PREBUILT_DTB
    Industio_触觉智能 2025-01-08 00:06 92浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 108浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦