介绍当TC297程序进入busError时如何定位问题,及参考依据。
这里以英飞凌官方AURIX Development Studio环境来说明,实际工程使用demo中提供的驱动库。
启动调试后,程序跑进如下位置:

查看寄存器,GPR->A11,获取程序返回地址,即,从该中断结束后返回的地方,也就是出现问题的地方:


如上可知,中断返回地址是 0x80000322,在Disassembly窗口中搜索该地址,附近即是出现问题的位置:

如上可知是某个地方调用IfxAsclin_Asc_write接口时出错,对于多核程序,还需要确认是运行在哪个核上的程序出错,可通过两种方式确认:
从调试器窗口看:

从上图可看出是在core 0上进的 cpu trap
从SBCU_ECON.TAG寄存器看:

从上图看TAG为0x0,通过查看寄存器可知0x0对应的是CPU0模块,具体见后面说明。

P278
CPU的GPR寄存器分为A0~A15地址寄存器和D0~D15数据寄存器,其中,A11表示下一步要执行的RET/RFE指令:

P289
RET表示应用返回地址,RFE表示从中断返回地址:

P282
从上所述可知当程序进到busError或其他error时A11保存的就是下一步返回地址,也即出问题的位置。

P200
SBCU_ECON用在当SBCU_CON.DBG使能且FPI总线出错时保存FPI总线控制信息和错误技术等信息,其中SBCU_CON.DBG在默认情况下是使能的:


P197
SBCU_ECON寄存器(TAG部分):


P202
其中TAG表部分内容如下:

P219
从上所述可知,SBCU_ECON.TAG即对应当前模块值,如这里的CPU0
实际调试时,也可通过查看trapWatch.tAddr得到中断返回地址,通过追踪可找到如下语句:
- trapWatch = IfxCpu_Trap_extractTrapInfo(IfxCpu_Trap_Class_bus, tin);
-
- ->trapInfo.tAddr = (unsigned int)__getA11();
-
- ->#define __getA11 Ifx__getA11
-
- ->IFX_INLINE void* Ifx__getA11(void) // 这里定位到 TASKING的实现
-
- {
-
- unsigned int *res;
-
- __asm("mov.aa %0, a11": "=a" (res) : :"a11"); // 从这里可看出实际获取的就是A11的内容
-
- return res;
-
- }
从上可知,trapWatch.tAddr就是A11的值。
TC297用户手册:
https://www.infineon.com/dgdl/Infineon-TC29x_B-step-UM-v01_03-EN.pdf?fileId=5546d46269bda8df0169ca1bdee424a2