• 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得到中断返回地址,通过追踪可找到如下语句:

    1. trapWatch = IfxCpu_Trap_extractTrapInfo(IfxCpu_Trap_Class_bus, tin);
    2. ->trapInfo.tAddr = (unsigned int)__getA11();
    3. ->#define __getA11 Ifx__getA11
    4. ->IFX_INLINE void* Ifx__getA11(void) // 这里定位到 TASKING的实现
    5. {
    6. unsigned int *res;
    7. __asm("mov.aa %0, a11": "=a" (res) : :"a11"); // 从这里可看出实际获取的就是A11的内容
    8. return res;
    9. }

    从上可知,trapWatch.tAddr就是A11的值。

    参考:

    TC297用户手册:

    https://www.infineon.com/dgdl/Infineon-TC29x_B-step-UM-v01_03-EN.pdf?fileId=5546d46269bda8df0169ca1bdee424a2

  • 相关阅读:
    4.Flink实时项目之日志数据拆分
    【Linux】C语言实现对文件的加密算法
    .NET WebAPI 采用 IDistributedCache 实现分布式缓存过滤器 Redis 模式
    C# 网络爬虫+HtmlAgilityPack+Xpath+爬虫工具类的封装的使用
    brew安装特定版本flow,解决问题!
    基于残差网络的图像超分
    基于正点原子stm32的mini板的TFTLCD显示实验
    Mybatis-分页插件
    树莓派Linu内核编译
    Linux-Ubuntu lxml库导入失败 解决方法
  • 原文地址:https://blog.csdn.net/ppdyhappy/article/details/125601318