OS Error_Hook剖析

  辛辛苦苦将AUTOSAR基本模块添加进来,才刚刚跑起来。放了一会,居然挂了,挂了!通过仿真,将问题复现到,停下来一看, ErrorHook!懵逼了!啥玩意?!

  一时间不知所措,什么情况导致这错误呢?以我多年的经验来看,弄个CallStack或者啥来看看,应该知道个十有八九吧!

呵呵……再一次懵逼!这个ERROR并非同步出现,而是OS异步处理的,你只能看到这个ErrorHook的前两个函数调用,更多的原 因,还是不知道的。

  不信?我将这个endless的值改了0,让其跳出这死循环。

  调用这个ErrorHook的是Os_Hook2StatusHook(hook)->Callback(status);,在这段代码里面,真的看不出所以然来,继续再往上 翻一层。

  

排查原因 这好像涉及到OS的调度了,越搞越复杂,继续深挖不一定是一条可行的道路。于是,我需要冷静一下,淡定!重头来过,从以下三 个点来看这个问题:

1. ErrorHook是个什么东西,在设计上有什么作用?

2. 进入ErrorHook,如何排查问题?

3. 怎么避免进入ErrorHook?

对于第一点,从官方文档查找相关内容。以下,以这个问题做切入点,我们对ErrorHook做个详细的剖析。 AUTOSAR_SWS_OS.pdf上有ErrorHook的模块,是OS的功能部分。

在AUTOSAR的OS需求上也提到有ErrorHook的要求:

[SWS_Os_00069] ⌈ If a task returns from its entry function without making a TerminateTask() or ChainTask() call AND the error hook is configured, the Operating System module shall call the ErrorHook() (this is done regardless of whether the task causes other errors, e.g. E_OS_RESOURCE) with status E_OS_MISSINGEND before the task leaves the RUNNING state. ⌋

[SWS_Os_00246] ⌈ When an error occurs AND an application-specific error hook is configured for the faulty OSApplication , the Operating System module shall call that application-specific error hook ErrorHook_ after the system specific error hook is called (if configured). ⌋ (SRS_Os_11013)

以下是这个ErrorHook的时序:

于是,对于以上的第二个问题,如何排查ErrorHook问题?

还是从仿真入手,看看这个Error ID是什么,是和哪个service相关的。

从上面可以看到,Error为0xFE,对应

在代码中排查这个 OS_STATUS_OVERLOAD ,可以找到Os_TimerPitIsr中断调用了Os_ErrReportTimerIsr(OS_STATUS_OVERLOAD);。

接着,看service,CurrentError.Service为0xA8,对应

在代码中排查这个 OSServiceId_TimerIsr,可以找到Os_ErrReportTimerIsr函数调用了

Os_TrapErrApplicationError(OSServiceId_TimerIsr, Status, &errorParameters); 。

于是,重新仿真,捕获到以下情况:

这说明OS Timer执行不及时,一次没完又来一次了,导致这个Error。最后,看第三个问题,如何避免这个问题产生。

防患于未然 既然知道了问题的原因,那就针对原因做分析和措施。

1. OS Timer频率太快,如1ms对于系统是不是过于快了,CPU处理不过来?如果是,那就要提供CPU频率,优化代码效率。或者将OS Timer中断改为更大的数值,如2ms。

2. 其他中断抢占了OS Timer中断?设置OS Timer中断为不可抢占。

3. 其他中断服务运行时间过长并且不可被抢占,例如超过1ms,导致OS Timer没机会运行?优化中断服务,提高运行效率。

4. OS Timer中断优先级过低?提高OS Timer优先级。

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水火汪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值