1、问题描述
在使用TC3xx芯片开发过程中,调用Mcu_PerformReset()接口函数进行软件复位,发现复位后restart,卡死在初始化过程中。
调用call stack发现,core0压栈情况如下
core1压栈情况为
2、问题定位
查询memory地址发现,core1的地址为非法地址。在core0的det中打断点,查看local如下图
查询手册AUTOSAR_TR_BSWModuleList.pdf
找到ModuleId为101的对应模块Mcu。在Mcu.h中查询到ApiId为0对应Api为Mcu_Init()
ErrorId为17对应错误为Mcu初始化失败
3、猜想及验证
由于调用的接口为软件复位,查询手册可知软件复位不会清ram,猜测可能是mcu初始化时校验ram,发现其中初始值不为0导致的错误。
修改定段信息,将原本定段为NOINIT的变量改为定段到ZERO_INIT中,即初始化为0。
重新编译验证发现可以正常restart,证实了猜想。
4、问题解决
方案一 通过修改定段
如3中所示,修改MemMap_Common.h文件,将定段为NOINIT的变量改为定段到ZERO_INIT中。
方案二 调用autosar下电流程
调用Vector SIP包中ECUM模块的接口执行复位,在EcuM_AL_Reset函数中将ram清0。
复位函数接口如下
EcuM_AL_Reset中清零ram代码如下