【DSP開發】C6678的中斷控制器
分兩層,一層是每個core內部的中斷控制器,這個叫interrupt controller,簡寫intc;一層是整個晶片的,屬於晶片級的,在每個core的外面,這個叫chip-level interrupt controller,縮寫CIC。
分兩層其實兩層功能也不同,這個不用細說,intc可以直接處理一些中斷,這些是每個核都同樣的,但是還有一些中斷,如果有需要不能讓所有的核都能看到,則這個時候就需要在所有的核外進行統一管理了,這個就是CIC。在C6678上,CIC可以進行中斷對映,這個功能就可以將一些中斷對映至希望接管的core上,而讓其他核感知不到這個中斷。對於C6678的CIC可以管控的中斷一共最多可以有
比如21行中的CIC0_OUT,對於core0來說,core0的intc的system event 21接的就是CIC0_OUT(32 + 0 + 11 * 0),即CIC0_OUT32啦,這個CIC0_OUT32是不可能讓其他core來接管的;
同樣,對於core1來說,core1 intc的system event 21接的就是CIC0_OUT(32 + 0 + 11 * 1),即CIC0_OUT43,這個CIC0_OUT43同樣也只能由core1接管,不可能讓其他core來接管
因此對於從CIC的輸入,到最後core可以處理的整個流程,有3個環節決定CIC的輸入最終由哪個core來處理,這3個環節分別是:
1、system interrupt到channel的map
2、channel到host interrupt的map
3、host interrupt到corepac intc的連線
之所以最後一個叫連線,而不叫map,是因為這個level上確實不存在什麼map不map,而是直接連死的,如上面圖下的分析。而前面的兩個map中,真正算的上map的只能有1個,就是第一個,system interrupt到channel的map,因為這個level是可以配置的,可以隨意配置,而第二個map,即channel到host interrupt的map實際上是硬體固定的,但是有一個map狀態暫存器可以查詢。第三個也是硬體固定的,貌似跟第二個差不多,但是不叫map,至於原因,是因為這個level上連像第二級的對映查詢都沒有。
因此,需要將system interrupt配置至要處理的core能正確感知的話,主要是配置level1,即system interrupt到channel的map,而且需要根據level2和level3的關係來確定level1的配置,比如有一個CIC上連的中斷,如果我們希望這個中斷由core0來接管的話,那麼先確認core0可以相應那些CICx_OUTn,然後確認這個OUTn的host interrupt編號,此時便可以確認map到該host interrupt的是哪個channel了,再然後,將core0要接管的這個CIC中斷map到對應的channel上即可,最後還需要幾個使能,包含CIC輸入的使能、host interrupt的使能,以及intc對應的event使能。當然,並非所有的CIC上的中斷都可以由core0來接管,因為可以對映到core0的中斷實際僅僅侷限於CIC0上的,具體限制如下圖所示: