|
汽車領域使用的芯片中,中斷系統(tǒng)已然是標配。掌握中斷系統(tǒng)是一個工程師的基本技能。了解一個事物,最好的方式就是實踐。本文,基于RH850 F1KM,聊一聊"中斷"。中斷系統(tǒng)主要包含三個部分:中斷觸發(fā)源、中斷控制及中斷處理,示意如下:
 講到中斷,本質是在討論CPU的行為,即:中斷針對CPU。在沒有中斷系統(tǒng)之前,CPU按照命令時序,順序執(zhí)行。為了能讓CPU處理更緊急的任務(eg:剎車任務),設計了中斷,即:讓正在運行的CPU停下當前任務,去處理更高優(yōu)先級的任務,示意如下:
 在一個具有中斷系統(tǒng)的芯片中,每個CPU會有一個中斷向量表基地址寄存器(eg:INTBP, Base address of the interrupt handler address table)。那么,中斷向量表地址寄存器存儲的地址是多少呢?答:用戶自定義,即:中斷向量表寄存器存儲的地址,可根據(jù)芯片資源自行設定,eg:0x00000200,這個地址將成為中斷向量表的基地址。注意,該地址一般需要放在PFlash內存區(qū)。知道了中斷向量表入口位置,即可通過每個中斷的偏移(Offset)查找到對應中斷函數(shù)入口地址。 如上提到:CPU會對應一個中斷向量表基地址寄存器(eg:INTBP),而INTBP存放著中斷向量表的基地址,同時,中斷向量表存放著每個中斷函數(shù)的入口地址,示意如下:

中斷向量表基地址可以在鏈接文件中設定,也可以在頭文件(eg:*.h)等位置設定。 中斷函數(shù)的處理,需要注冊中斷函數(shù),即:將目標中斷函數(shù)放入指定位置。具體操作: 中斷函數(shù)需要用#pragma進行聲明,示意如下:#pragma INTERRUPT inticup2pe_DataFlashRq_handler(vect=359)void inticup2pe_DataFlashRq_handler(void){ /* do something*/}
#pragma ghs interruptvoid inticup2pe_DataFlashRq_handler(void){ /* do something*/} (二)在啟動文件(*.850)中注冊中斷函數(shù)
...... .offset (IRQ_TABLE_START+0x059C) #if (INTICUP_DATAFLASHPRQT_ENABLE > 0x00000000) .extern _inticup2pe_DataFlashRq_handler .word _inticup2pe_DataFlashRq_handler #else .word __unused_isr #endif ......
注意:鏈接文件注冊中斷函數(shù)時,函數(shù)前需要添加下劃線"_"。 在RH850中,中斷觸發(fā)方式可以是Level(eg:"1"),也可以是Edge觸發(fā)(eg:上升沿、下降沿或者雙邊沿)。在芯片的datasheet中,每個中斷源的觸發(fā)方式會給出具體約束,每個中斷源在中斷向量表中的偏移地址、中斷Channel也會給出具體約束,示意如下:
對于每個中斷,中斷優(yōu)先級、中斷觸發(fā)方式等需要通過中斷控制寄存器(Interrupt Control Registers)配置。 (一)中斷使能
中斷的使能包含兩個部分:
1、中斷觸發(fā)源使能,即:使能對應中斷源的觸發(fā)能力
2、中斷控制的使能,即:中斷控制單元使能,使其可以接收中斷源的請求,并把仲裁后的結果傳遞給CPU。
示意如下:
|