前言
前面的文章<
問題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請求(TrapTrigger)或者通過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來觸發CPUTraps.
. CPUTrap觸發事件能夠被TRAPSTAT狀態寄存器捕獲。
.可以通過軟件產生或者移除CPUTrap觸發事件。
. 可以為單個 CPU 禁用或啟用單個 CPU Trap觸發事件。
Figure 2: Monitoring and Reset Pins
1.2 Trap處理
當啟用(enable)Trapsource并設置Trap狀態標志時生成Trap時,建議在啟用(enable) TRAPDISn 中的Trapsource之前通過 TRAPCLR寄存器 清除Trap狀態標志。 Trap狀態標志可以在啟用Trapsource之前設置,只要啟用Trapsource,就會導致意外的 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.VectorOS對異常的處理
2.1 異常Exception和中斷的關系
異常(Exception,Trap產生):BTV寄存器中保存了異常向量表(Exception Vector)的基地址,異常向量表中保存了所有用戶配置和系統自帶的異常護理程序(Exception Handlers)。系統產生Trap時(比如非法訪問0地址)就會以 “中斷搶占“的方式調用對應的異常護理程序(Exception Handlers)。
中斷(Interrupt,外部事件產生):BIV寄存器中保存了中斷向量表(Interrupt Vector)的基地址。中斷向量表中保存了所有用戶配置和系統自帶的中斷護理程序(Interrupt Handlers)。系統產生外部(External)中斷事件(比如配置了CAN的接收中斷,收到CAN報文)時就會觸發中斷事件,系統就會調用對應的中斷處理程序。
所以,嚴格意義上來講,異常和中斷沒啥關系,只不過異常產生時會以“中斷搶占“的方式調用異常處理程序,處理過程和外部事件觸發的中斷處理過程類似,都是搶占當前Task執行xxxhandlers.
用戶調用DisableAllInterrupts API可以禁用/屏蔽所有的中斷,但是屏蔽不了Exception產生Trap,NMI(Non-Maskable Interrupt)實際上是一種Trap而不是ISR,只不過NMITrap(Class 7)產生后一定會去調用TrapHandler/Exception Handler, 且過程也是“中斷搶占“的形式,看上去就像”不可屏蔽的中斷一樣“。
2.2 Vector OS對異常處理
在<
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觸發NMITrap: ESR1 Pin默認接到高電平(因為ESR1低電平有效默認觸發NMITrap)。
如果我們想使用NMITrap:比如把TLE35584 SBC的INTPin腳接到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章節。
審核編輯:劉清
-
寄存器
+關注
關注
31文章
5336瀏覽量
120232 -
觸發器
+關注
關注
14文章
2000瀏覽量
61132 -
中斷處理
+關注
關注
0文章
94瀏覽量
10967 -
狀態機
+關注
關注
2文章
492瀏覽量
27529 -
外部中斷
+關注
關注
1文章
131瀏覽量
15816
原文標題:TC3xx芯片的Trap詳解(二)
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論