TC3xx芯片的Trap详解(二)之TC3xx芯片的产生

前言
前面的文章介绍了trap的类型以及trap产生后如何定位trap位置和原因,但是对于trap的产生只简要阐述了内部异常(exception)时会产生trap,对于trap还存在以下的问题:
问题1: 异常(exception)和外部中断的区别?
问题2: 什么是nmi,如何产生nmi,nmi有什么用?
问题3: 除了nmi,用户如何主动制造异常?
问题4: 如何配置异常中断?
本文先详细介绍tc3xx芯片的产生,然后再回答上述问题:
参考文档:
1. infineon-aurix_tc3xx_part1-usermanual-v02_00-en
2. tricoretm tc1.6.2 core architecture manual
缩略词
简写 全称
tcn trap class number
tin trap identification number
tsr trap service router
nmi non-maskable interrupt
btv base trap vector table pointer
注:本公众号文章中使用了一些第三方工具和文档,若有侵权,请联系作者删除!
正文
1.tc3xx芯片trap产生
如图1所示,trap请求(trap trigger)或者通过trapset寄存器设置对应的trap bit都能置位对应的trapstat的状态bit. 寄存器trapdis[0:1]位域确定哪些cpus接收来自trapstat的trigger flag.默认状态下,reset复位后所有的cpus会接收trap. trapstat寄存器中的trap flag可以通过写trapclr寄存器的对应bit来清除。
figure 1: cpu trap generation
1.1 trap特点
. 可以通过esrx pin脚触发safety alarm来触发cpu traps.
. cpu trap触发事件能够被trapstat状态寄存器捕获。
. 可以通过软件产生或者移除cpu trap触发事件。
. 可以为单个 cpu 禁用或启用单个 cpu trap触发事件。
figure 2: monitoring and reset pins
1.2 trap处理
当启用(enable)trap source并设置trap状态标志时生成trap时,建议在启用(enable) trapdisn 中的trap source之前通过 trapclr寄存器 清除trap状态标志。 trap状态标志可以在启用trap source之前设置,只要启用trap source,就会导致意外的 cpu 陷阱。 trap处理例程结束时,应清除trap状态标志。
1.3 trap寄存器
主要有:
trapstat: trap status register.
trapset: trap set register.
trapclr: trap clear register.
trapdis0: trap disable register 0.
trapdis1: trap disable register 1.
具体每个寄存器的位域作用参考芯片手册。
2.vector os对异常的处理
2.1 异常exception和中断的关系
异常(exception,trap产生): btv寄存器中保存了异常向量表(exception vector)的基地址,异常向量表中保存了所有用户配置和系统自带的异常护理程序(exception handlers)。系统产生trap时(比如非法访问0地址)就会以 “中断抢占 “的方式调用对应的异常护理程序(exception handlers)。
中断(interrupt,外部事件产生): biv寄存器中保存了中断向量表(interrupt vector)的基地址。中断向量表中保存了所有用户配置和系统自带的中断护理程序(interrupt handlers)。系统产生外部(external)中断事件(比如配置了can的接收中断,收到can报文)时就会触发中断事件,系统就会调用对应的中断处理程序。
所以,严格意义上来讲,异常和中断没啥关系,只不过异常产生时会以“中断抢占“的方式调用异常处理程序,处理过程和外部事件触发的中断处理过程类似,都是抢占当前task执行xxx handlers.
用户调用disableallinterrupts api可以禁用/屏蔽所有的中断,但是屏蔽不了exception产生trap,nmi(non-maskable interrupt)实际上是一种trap而不是isr,只不过nmi trap(class 7)产生后一定会去调用trap handler/exception handler, 且过程也是“中断抢占“的形式,看上去就像”不可屏蔽的中断一样“。
2.2 vector os对异常处理
在一文中我们知道tricore异常由8大类(class 0 – class 7)。
tc3xx的btv寄存器保存了异常向量表的基地址。异常向量表里面保存了用户配置的异常处理程序,值得注意的是,vector os中以及实现了class 1(memory protection errors) 和class 6(syscall / trap instructions) 的异常处理程序(exception handlers)。
产生class 1 trap后os会调用os_hal_memorytrapentry:
产生class 6 trap后os会调用os_hal_syscalltrapentry:
没有配置handler的trap产生后,os就会调用os_hal_unhandledtrapentry,之后可能会调用panichook()或者protectionhook():
测试了一个class 1 trap,最后也会走到protectionhook:
对于非os处理的trap(非class 1和class 6)如果配置了自定义的exception handler, trap产生后调用自定义的exception handler。
2.3 infineon提供的关于trap的接口
void mcu_settraprequest(const mcu_traprequesttype traprequestid);void mcu_cleartraprequest(const mcu_traprequesttype traprequestid);typedef enum{ mcu_trap_esr0 = 0x0u, /* esr0 trap request */ mcu_trap_esr1 = 0x1u, /* esr1 trap request */ mcu_trap_trap2 = 0x2u, /* trap2 trap request */ mcu_trap_smu = 0x3u, /* smu trap request */ mcu_trap_invalid = 0x4u /* invalid trap request */} mcu_traprequesttype;  
3.异常配置
exception handler的配置基本和isr一样,只有两个地方需要注意:
osisrinterrupttype: 需要选exception.
osisrcategory: 只能是category_1 or category_0.
4.nmi的作用
在第2章中我们知道nmi是trap不是isr。
如果我们不想通过外部ic触发nmi trap: esr1 pin默认接到高电平(因为esr1低电平有效默认触发nmi trap)。
如果我们想使用nmi trap: 比如把tle35584 sbc的int pin脚接到esr1,这样35584出现异常的时候,就能通过nmi_handler快速的获取35584的错误状态。
5.总结
我们通过回答开头的几个问题来结束本文:
问题1:异常(exception)和外部中断的区别?
答:参考2.1 异常exception和中断的关系章节。
问题2:什么是nmi,如何产生nmi,nmi有什么用?
答:nmi是class 7 trap, 可以通过esr1 pin拉低触发nmi, nmi一般用来快速的捕获外部exception.
问题3:除了nmi,用户如何主动制造异常?
答:可以通过调用mcu_settraprequest() api来设置trap.
问题4:如何配置异常中断?
答:参考第3章节。


L9918车规交流发电机稳压器使输出电压保持稳定不变
台达针对大型数据中心用户推出全新易动系列微模块解决方案
数据中心也要降本增效
5G技术将助力物联网突破大规模应用关键瓶颈
一点也不意外,OPPOR11成为台湾销量最好国产手机品牌
TC3xx芯片的Trap详解(二)之TC3xx芯片的产生
高仙机器人完成亿元级B轮融资,由远东宏信集团领投
上海贝岭为USB-PD应用提供高性能驱动IC和MOSFET解决方案
电弧焊分为哪几种_电弧焊和氩弧焊的区别
收入76亿,盈利18亿,品牌价值245亿,公牛如何实现的?
华为进军印度手机市场,主推低端机迎战小米
参会提醒|本周五青岛站2023 瑞萨电子 MCU研讨会见!
汽车仪表与报警系统_汽车仪表盘报警符号_汽车仪表盘报警灯
天珑开创安卓系统平板去MCU的技术改革
游泳听歌的耳机推荐,游泳专用的MP3耳机推荐
无人驾驶汽车传感器概述
基于RFID的物料跟踪管理系统设计
如何做好金融数字化转型中“数据价值的守护者”?
软件测试工程师面试时可能会问到哪些问题
单片机中断电平触发和脉冲输入