前言
前面介绍了tc3xx一系列的功能与特性,看起来感觉高大上,但是总有一种空中楼阁的感觉:这些复杂的架构、特性、功能在平时好像也用不到呀?今天就来介绍和日常开发及问题分析强相关的tc3xx芯片的trap功能,也就是在程序/系统异常后,tc3xx的异常处理机制。同时回答以下两个关键问题:
1.发生trap后,怎么确定发生了哪一个trap?
2.是程序的哪个地方导致发生了trap?
注意:本文使用tc3xx芯片及vector的autosar配置工具。
参考文档:
1. infineon-aurix_tc3xx_part1-usermanual-v02_00-en
2.学习笔记 | aurix tc3xx architecture
缩略词
简写 全称
tcn trap class number
tin trap identification number
tsr trap service router
nmi non-maskable interrupt
btv base trap vector table pointer
正文
1.trap发生
当系统中发生不可屏蔽中断(nmi)、指令异常(instruction exception)、内存管理异常(memory management exception)或者非法访问(illegal access)时,trap就会发生。trap功能永远是active的,不可被disable的。
2.trap类型
tc3xx有8种类型的trap(class 0 – class 7),通过tcn标识,每类trap下又定义了一系列的具体trap,通过tin(trap identification number标识)。
也就是说,异常(exception)发生后,我们能知道具体的tcn和tin,就能确定是哪一种trap发生了。
3.trap向量表
tc3xx的btv寄存器保存了异常向量表的基地址。btv寄存器中保存的异常向量表的基地址的[8:5]位域”或 or”上tcn码就能确定异常发生时调用的具体的tsr(trap service router,或者叫异常处理程序)所在的地址。
4.trap定位
定位trap类型
从上文中得知,我们能知道具体的tcn和tin,就能确定是哪一种trap发生了。
d[15]寄存器保存了trap/exception发生后tin号。
在datasheet中没有知道如何确定tcn号,从后面的调试分析中可以得知,异常发生后,d[4] = (tcn << 16) | tin,也就是可以通过d[4]寄存器确定tcn号。
定位发生trap的位置:
a[11]寄存器保留了函数的返回地址,可以通过a[11]来推测异常发生的函数。
5.autosar架构图下trap实例分析
异常测试代码
uint8 traptestflag = 0;uint32* zeroadress = (uint32 *)0x00000000;static void traptest(void){ /* trap for memory protection null address*/ if(1 == traptestflag) { traptestflag = 0; *zeroadress = 0x12345678; }}
给零地址处赋值制造异常。
traptest函数发生异常,触发异常处理程序tsr。
os_hal_memorytrapentry是本次异常发生时的tsr,通过汇编代码又调用了os_hal_memfaultexceptionhandler
从os_hal_memorytrapentry代码及注释中可以知道,异常的时候d[15]寄存器保存了tin,d[4]寄存器保存了tcn << 16 | tin
在异常处理程序处打断点:
d[15]: 6,也就是tin为6
d[4]: 0x00010006,也就是tcn为1
a[11]: 0x8013cb18,也就是如果没有异常,函数返回地址是0x8013cb18
btv: 0x70102000
分析1:通过d[15]和d[4]确定tin和tcn后确定异常为零地址访问异常
分析2:通过a[11]为0x8013cb18后查看map文件,确定0x8013cb18为traptest函数的返回地址
分析3:btv | (tcn << 5) à 0x70102020为本次tsr(异常处理函数)的地址
分析4:我们也可以查看os的报错
error type为14 ,也就是0x0e,为e_os_protection_memory
6. 实际应用思路
如果是必现问他,通过lauterbach仿真器很容易就能定位到异常原因和位置,但是,如果是实车上偶发出现异常,无法通过仿真器仿真又该怎么办了?
这里仅提供一个设计思路,更具体是详细设计和代码实现请关注本公众号的后续文章。
思路:
1.mcu预留backup ram(软件复位后数据不丢失ram)
2.配置os,使得os shutdown后能够调用到自定义的callout函数
3. callout函数中将异常复位的trap信息(tcn,tin,return adress等)保存到backup ram
4. callout最后调用mcu_performreset软件复位
5. 复位后能识别到上一次的异常信息,并把异常信息写道nvm中去
6.通过诊断did能够读取到异常信息
这样在实车上发生异常后,就能通过诊断读取到异常信息,从而便于分析和定位问题。
7.总结
. tc3xx有8类tcn, 每类tcn下又有具体的tin
. 异常发生的时候,可以通过d[4]和d[15]寄存器定位具体的异常类型
. 异常发生的时候,可以通过a[11]寄存器定位异常发生的位置
合作伙伴致景科技:聚焦纺织服装产业数智化转型,助力浙江省产业数字化“三个全覆盖”系列推进
三星Exynos 7880定位次旗舰,魅族MX7稳了
情人节送什么礼物给男朋友比较有意义?哪些礼物让男朋友开心?
8位串行模数转换器TLC548、TLC549的应用
POWI推出具有850mA输出电流的降压开关IC
TC3xx芯片的Trap功能详解
简易IC测试仪的制作教程
泰克示波器维修案例—泰克TDS2014C维修介绍
安森美推出超小封装低压降(LDO)线性稳压器
三星电子推出首个LPCAMM内存解决方案
公共广播极简配置方案
Bostik 波士胶扩建其在上海的亚洲研发中心
基于SLH89F5162的信号发生器设计
新能源电动汽车续航里程短的原因有哪些?
iphone手机打不出电话应该如何解决
光电传感器
5G将带来五大革命性变化
惠普暗夜精灵爆发:iMac Pro之后第二台装Vega显卡的台式机
三星推出了基于全新一代Secure Element S3FV9RR 芯片的认证解决方案
创新BlasterXAE-5评测 能够让用户体验到逼真的空间感