TC3XX 多核ECU的中斷向量表解疑

qq_20848757發表於2020-11-26

 

關於多核ECU的中斷向量表,熱心網友問了一個很好的問題

 

今天研究了一下,先說結論: 每個core都有自己單獨的memory去儲存自己的中斷向量表,而且每個core的中斷優先順序是相互獨立的。也就是說,每個core都可以有自己的priority為20的中斷

接下來是論證過程:【趕時間的同學可以直接拉到最後看杰倫】

1. 以Tasking編譯器為例,安裝目錄下自帶了關於 中斷向量表的 linker 檔案  【TC3XX 系列最多有6個core,所以為每個core都預留了一個linker檔案】

 

2. 開啟這些lsl檔案,可以看見每個core的 中斷向量表是以 INTTAB0, INTTAB1等為起始地址的

core0: 【紅框中的001,002,003代表中斷優先順序】

 

core1:

 

而這個 INTTAB0,INTTAB1等 在 相應的TC3XX.lsl 裡面定義,在

 

如果你花點時間去查 infineon的TC3xx的datasheet,每個CORE_n的中斷向量表的起始地址是通過暫存器BTV_n定義的。Tasking在startup 函式裡面把“0xa00f0000”賦值給了BIV,從而和上面linker 檔案的定義匹配上了,說白了就是tasking的人幫我們都寫好了,我們買編譯器花的錢一部分就是買這個  

3. 然後去查Tasking編譯器的手冊,它會告訴你在TC3xx 系列,寫interrupt函式的時候要同時宣告 core和中斷優先順序,這樣編譯器才能根據 2 裡面提到的 lsl檔案 將它放到正確的位置

 https://www.tasking.com/support/tricore/ctc_user_guide_v6.2r2.pdf 

 

總結:

1. 多核ECU,每個core都有自己的BIV暫存器,用來定義該核的中斷向量表起始地址。 每個core的中斷優先順序相互獨立,可以相同

2. 在main函式之前的startup函式裡面會對BIV暫存器進行初始化,即自定義各核的中斷向量表起始地址

3. 在編寫c的interrupt函式時,編譯器規定要同時宣告core和priority

4. linker檔案會根據宣告的core和priority,將函式存放到正確的地址,從而中斷髮生時,PC指標會跳轉到正確的位置

5. 因為BIV同時在linker和startup函式裡面用到,所以如果使用者需要修改,兩處要匹配。目前我們用的linker和startup函式都是Tasking提供的,所以Tasking已經提前幫我們匹配好了

 

 

 

相關文章