TC297程序进busError时问题定位

本文介绍在英飞凌AURIX Development Studio环境中,如何定位TC297程序出现busError的问题,并提供具体的步骤和参考依据。

目的:

介绍当TC297程序进入busError时如何定位问题,及参考依据。

这里以英飞凌官方AURIX Development Studio环境来说明,实际工程使用demo中提供的驱动库。

问题现象:

启动调试后,程序跑进如下位置:

问题定位:

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

 

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

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

从调试器窗口看:

 从上图可看出是在core 0上进的 cpu trap

从SBCU_ECON.TAG寄存器看:

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

判断依据:

A11地址含义:

P278

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

P289

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

 P282

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

SBCU_ECON.TAG含义解释:

P200

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

 P197

SBCU_ECON寄存器(TAG部分):

P202

其中TAG表部分内容如下:

P219

从上所述可知,SBCU_ECON.TAG即对应当前模块值,如这里的CPU0

  1. IfxCpu_Trap trapWatch变量:

实际调试时,也可通过查看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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值