目录
1. TC3xx WDT速览
2. TC3xx SMU Watchdog Alarm
2.1 Watchdog Alarm处理流程
2.2 Recovery Timer详解
2.3 NMI里可以做什么?
3.小结
1. TC3xx WDT速览
根据相关文档描述,TC3xx看门狗总体架构如下:
它内部总共实现了两类Watchdog:
- 1个Safety Watchdog:Safety Watchdog用于保护芯片系统层级超时。
- 每个核独有1个CPU Watchdog:内核独有CPU Watchdog,主要看管关联核的执行情况。
今天不讲看门狗的内部基本原理,主要关注发生超时它内部的行为是什么样的。
在功能安全机制上,英飞凌将内核看门狗超时、所有看门狗超时合并为一个功能安全机制:SM[HW]:SCU:ENDINIT_WATCHDOG,如下:
对于Safety看门狗,则设计为另一个功能安全机制:SM[HW]:SCU:SAFETY_WATCHDOG
而从实际alarm输出来看,从上图虚线部分可以看到,例如CPU内部看门狗发生超时,一方面通过ALM_WDTCPUx(x=0~5)进行反映,另一方面会与每个核的对应信号、以及Safety看门狗的超时信号,进行或运算,最终合并为一个ALM_WDTALL。
这里我们也可以通过对应手册得到印证,例如TC37x共计三核,ALM8[10-12]分别表示CPU0\1\2的看门狗超时:
ALM8[16]对应Safety看门狗超时,ALM8[17]则表示所有看门狗超时的或情况,如下:
既是Alarm,那这些看门狗超时的具体行为就是可以配置的,我们来看看在SMU里对应alam的默认值是什么。
根据TC37x的用户手册,ALM8的默认配置为如下图:
其中,AG8CF0、2默认值为0x1FC00,AGC8CF1默认值为0x00;
因此ALM[10-16]得到的行为配置为b101 = 5,对应行为为发送NMI给SCU,如下:
注意ALM8[17]没有进行配置行为,即NoAction。
这就很有意思了,我们都理解看门狗超时一般复位呀,为何默认触发NMI?
接下来我们就看看SMU里面管理看门狗超时alarm的处理。
2. TC3xx SMU Watchdog Alarm
2.1 Watchdog Alarm处理流程
根据文档描述,当出现没有及时喂狗的情况,虽然触发了alarm,但仍需要一段特殊流程来保证MCU行为,特别是在重启前给与软件一小段时间用于保存现场,这是非常关键的。
因此,SMU 看门狗alarm处理流程可用下图进行总结:
当WDT timeout发生时,如果采用默认配置,则直接触发NMI;同时有一个名叫Recovery Timer的计时器用于监控WDT Alarm处理的超时,一旦超过预配置的阈值(RTD)后,就会产生一个Recovery timeout的alam(对应ALM10[16-17])。
这个alam的默认配置为Reset(b110:RESET):
这个路径就很清楚了,那么我们来看看比较关键的Recovery Timer该如何配置。
2.2 Recovery Timer详解
在SMU里,Recovery Timer共有两个实例,每个实例均可配置服务不同的WDT timeout alarm。
与Recovery Timer相关的寄存器包括:
- RTC
阈值常见使用默认值0x3FF,RT均打开。
- RTAC00\01
RTAC00\01用于配置RT0的服务对象,包括CPU Watchdog Timeout、Safety Watchdog Timeout等;
以RTAC00为例,
默认值为0xA80108,即对应ALM Group GID0 = d8 ,Alarm ID ALID0 = d10 ,对应ALM8[10]CPU0 看门狗超时,
每个寄存器可以配置2个Alarm,因此RTAC00\01共计可以配置服务4个Alarm,在默认配置中,RT0主要服务 Safety WDT, CPU0\1\2 WDT
- RTAC10\11
RTAC10\11用于配置RT1的服务对象,包括CPU Watchdog Timeout、Safety Watchdog Timeout等,与上述配置类似,RT0默认服务CPU3\4\5 WDT。
2.3 NMI里可以做什么?
配置好RT后,我们继续来看看看门狗超时的行为--NMI,全称Non-Maskable Interrupt。
它是Tricore内核Trap系统中的一个具体实现。
SMU通过内部行为配置NMI触发一个Trap事件给到SCU,再有SCU仲裁生成Trap给到对应CPU,如下:
Trap发生时,会由硬件自动生成一个Trap ID,该ID由两部组成,
- TCN:Trap Class Number,作为Trap table的索引,由硬件根据BTV生成
- TIN:Trap Identification Number,硬件自动加载到的数据寄存器D[15]
Trap是伴随一些特殊事件例如NMI、指令异常、内存管理异常、非法访问等错误的发生而发生,因此可以理解为TriCore对于硬件错误的进一步细化处理,所以在实际实现时,就像定义Vector Table一样,我们仍需要定义一个Trap Table,在启动代码里进行初始化,设置寄存器BTV(Base Address of Trap Vector table),如下图:
这也意味着,当Trap发生时,PC会自动跳到TrapTable,并根据TCN跳转至不同处理函数,然后我们在Trap函数里根据TIN,进行不同处理。
那根据手册描述,NMI的TCN为7,TIN为0,故我们在该函数中就可以自定义一下内容,例如保存现场到某retention ram,下一次复位后查询异常原因。
3.小结
通过上面的分析,我们将看门狗超时的Alarm处理路径完整梳理了一遍,分别涉及到SCU.WDT、SMU、SMU RT、SCU.TRAP、CPU Trap Handler;限于篇幅,Trap TCN生成逻辑、TIN获取方式留在TriCore Trap系统里具体描述吧。