1. 程式人生 > >【DSP開發】C6678的中斷控制器

【DSP開發】C6678的中斷控制器

分兩層,一層是每個core內部的中斷控制器,這個叫interrupt controller,簡寫intc;一層是整個晶片的,屬於晶片級的,在每個core的外面,這個叫chip-level interrupt controller,縮寫CIC

分兩層其實兩層功能也不同,這個不用細說,intc可以直接處理一些中斷,這些是每個核都同樣的,但是還有一些中斷,如果有需要不能讓所有的核都能看到,則這個時候就需要在所有的核外進行統一管理了,這個就是CIC。在C6678上,CIC可以進行中斷對映,這個功能就可以將一些中斷對映至希望接管的core上,而讓其他核感知不到這個中斷。對於C6678CIC可以管控的中斷一共最多可以有

1024個,管控方式是可以將每個中斷通過配置,對映至256channel中的某一個,一個channel上可以同時對映多箇中斷,對映至同一個channel的中斷,相互之間就是邏輯“或”的關係了,即如果其中任何一箇中斷產生,該channel均會上報中斷;system eventschannel對映完了之後,還不能完成中斷的上報,還需要把這256channel對映至host interrupthost interrupt的數量最大也是256個。這個host interrupt的編號和CICx_OUTn是一一對應的,但是整個對應關係並不是從CIC0開始按序號一邊編到最後的CICx,而是CIC
分多個,每個CICOUT都是從OUT0開始編號。實際上CICx_OUTncorepacintc的輸入,是定死的,如下圖:



比如21行中的CIC0_OUT,對於core0來說,core0intcsystem event 21接的就是CIC0_OUT32 + 0 + 11 * 0),即CIC0_OUT32啦,這個CIC0_OUT32是不可能讓其他core來接管的;

同樣,對於core1來說,core1 intcsystem event 21接的就是CIC0_OUT32 + 0 + 11 * 1),即CIC0_OUT43,這個CIC0_OUT43同樣也只能由core1接管,不可能讓其他core來接管

CIC0_OUT43。其他類推。

因此對於從CIC的輸入,到最後core可以處理的整個流程,有3個環節決定CIC的輸入最終由哪個core來處理,這3個環節分別是:

1、system interruptchannelmap

2、channelhost interruptmap

3、host interruptcorepac intc的連線

之所以最後一個叫連線,而不叫map,是因為這個level上確實不存在什麼mapmap,而是直接連死的,如上面圖下的分析。而前面的兩個map中,真正算的上map的只能有1個,就是第一個,system interruptchannelmap,因為這個level是可以配置的,可以隨意配置,而第二個map,即channelhost interruptmap實際上是硬體固定的,但是有一個map狀態暫存器可以查詢。第三個也是硬體固定的,貌似跟第二個差不多,但是不叫map,至於原因,是因為這個level上連像第二級的對映查詢都沒有。

因此,需要將system interrupt配置至要處理的core能正確感知的話,主要是配置level1,即system interruptchannelmap,而且需要根據level2level3的關係來確定level1的配置,比如有一個CIC上連的中斷,如果我們希望這個中斷由core0來接管的話,那麼先確認core0可以相應那些CICx_OUTn,然後確認這個OUTnhost interrupt編號,此時便可以確認map到該host interrupt的是哪個channel了,再然後,將core0要接管的這個CIC中斷map到對應的channel上即可,最後還需要幾個使能,包含CIC輸入的使能、host interrupt的使能,以及intc對應的event使能。當然,並非所有CIC上的中斷都可以由core0來接管,因為可以對映到core0的中斷實際僅僅侷限於CIC0上的,具體限制如下圖所示: