目录
问题描述:
调试AUTOSAR CP工程时,将工程烧入MCU后,Trace32的Watch界面,用于监测error的变量errCount数值一直持续增加,且显示errType=13。当errCount累积到5w+时,Trace32界面显示“hard reset detected”,此时程序停止运行。
问题排查:
1)在Os.h文件中查找errType=13对应的错误类型,
#define E_OS_ACCESS ((StatusType)1U)
......
#define E_OS_STACKFAULT ((StatusType)13U)
......
故确定是因为堆栈出了问题,需进一步排查是哪个模块的堆栈问题。
2)err->task显示为0x80088620,查找对应的Map文件后,发现该内存地址位于
| Size | Space addr | ...
.rodata.Os_Cfg.Os_const_tasks0 | 0x000001b8 | 0x80088544 | ...
.rodata.Os_Cfg.Os_const_tasks1 | 0x000000a0 | 0x800886fc | ...
task0与task1对应的地址之间,故该出错的task属于tasks0。而查阅配置发现,tasks0中添加了11个子task,故每个task占用内存0x1b8÷11=440/11=44Bytes,倒推计算出问题的0x80088620为第六个task,因为0x80088620-0x80088544=0xDC=220Bytes。故应该查找tasks0[5]所对应的子task。查阅Os_Cfg.h代码发现:
#define Core0_OsTask_BSW_10ms (&Os_const_tasks0[5])
故出错的err->Task为Core0_OsTask_BSW_10ms。
3)查阅代码Core0_OsTask_BSW_10ms.c,发现
TASK(Core0_OsTask_BSW_10ms)
{
}
该Task中包含14项MainFunction,推测因为Task内含函数过多,导致堆栈短缺报错。
解决方案
新建一个Core相同,Cycle相同的新Task,将Core0_OsTask_BSW_10ms 中映射的RunnableEntity移一半去新建的Task内,减轻原Core0_OsTask_BSW_10ms 的负载。
方案验证
重新生成代码编译后,烧录至MCU,观察到Trace32的errCount始终保持为0,问题解决成功。