天天看點

8系列TEE-Lite異常中斷向量表和服務程式的存儲結構

1 MCU對于異常/中斷向量表和服務程式的存儲結構 傳統的MCU包含三種存儲,ROM,RAM,Flash(Flash是泛指Non-volatile存儲,包含eFlash,Nor flash,Nand flash,EEPROM,RAM等一些列存儲)。這三類存儲在MCU設計中負責不同的功能,ROM主要負責最初的程式燒寫和第一級引導,Flash包含Bootloader和OS以及APP,RAM主要是運作過程中的堆棧,以及變量,資料等。 關于異常和中斷,在8系列處理器中中斷屬于一種特殊的異常,是以經常會出現在一起描述,異常主要指的是CPU自身定義的一系列需要及時響應的事件,往往這些事件的産生會影響CPU的正常執行,比如說發生總線通路錯誤,執行非法指令等。異常的響應需要設定目前PSR上的EE位。異常在異常/中斷向量表中使用0~31号。中斷往往是系統中裝置産生的事件,需要CPU及時處理,比如定時器中斷,UART資料接收中斷等,中斷的響應需要設定目前PSR上的EE位,VIC的中斷使能寄存器,裝置的中斷使能寄存器。中斷在異常/中斷向量表中使用32号之後,根據實際支援的中斷數來确定表項的結尾。 本次介紹主要介紹和異常,中斷相關的幾種存儲方式,在傳統的處理器設計中,中斷和異常是需要通過異常/中斷向量表作為索引的,根據不同的應用場景會出現一張或者多張一場異常/中斷向量表,下面就幾種主要的場景做一下簡單的分析: 1.1 異常/中斷向量表僅存放在ROM中 此類應用場景往往比較簡單,且程式相對固定,實際使用場景非常少,因為ROM本身的特性呈現出無法修改的屬性,是以一旦異常/中斷向量表确定之後,後續就無法進一步修改,程式開發需要根據這個異常/中斷向量表中的位址作為異常服務程式和中斷服務程式起始位址。異常/中斷向量表根據VBR(vector base register)寄存器來實作索引,例如:晶片上電時,複位之後VBR預設為0,則此時異常/中斷向量表預設指向0位址(一般為ROM起始位址),是以上電複位異常的入口,即程式入口位址就存放在0位址上,如下圖的黃色部分Reset_handler。

8系列TEE-Lite異常中斷向量表和服務程式的存儲結構

1.2 異常/中斷向量表存放在ROM和FLASH中 此類應用往往ROM功能比較簡單,一般不需要再ROM程式中産生異常,異常/中斷向量表主要實作複位異常。在程式進入到FLASH中之後可以由使用者自定義異常/中斷向量表和異常服務程式,優點是相對直接異常/中斷向量表放在ROM中的會比較靈活,所有位址的修改隻需要重新編譯之後就可以實作,也可以通過程式直接注冊,完成異常服務程式和異常/中斷向量表的連結。 當需要兩張或者以上的異常/中斷向量表的時候,在向量表切換的時候需要通過維護VBR(vector base register)寄存器來完成兩張異常/中斷向量表的切換,例如:晶片上電時,複位之後VBR預設為0,則此時異常/中斷向量表預設指向0位址(一般為ROM起始位址),是以上電複位異常的入口,即程式入口位址就存放在0位址上,如下圖的黃色部分Reset_handler。當VBR寄存器被修改之後,例如改成Exp Base Addr,則此時異常/中斷向量表被指向到Exp Base Addr位址所對應的位置,如果此時發生2号異常,則會從綠色位址擷取2号異常的服務程式入口,即Exp#2_handler。此時0位址上的異常/中斷向量表不再起做用,此處需要特殊标注的是對于複位異常,因為晶片複位之後的起始狀态VBR寄存器是0,是以複位異常是不會被重定向,永遠隻會從0位址擷取入口,除此之外的所有異常和中斷時可以被重定向到其他的位址上去,也就是意味這Exp Base Addr上的Reset_handler是永遠不會起作用的。

8系列TEE-Lite異常中斷向量表和服務程式的存儲結構

2 帶TEE的MCU對于異常/中斷向量表和服務程式的存儲結構 帶TEE的MCU的基本存儲結構和普通MCU一緻,即ROM,Flash,RAM。由于引入TEE的概念,在傳統MCU的基礎上會增加一個新的運作模式,即TEE。TEE下需要維護其自身的異常/中斷向量表和對應的異常服務程式,基本結構和1.2章節中描述的結構一緻。 TEE下響應REE的中斷,需要提前設定好REE下的PSR的EE和IE位,設定好VIC中的中斷使能寄存器,并且将對應的中斷設定成非安全中斷,設定對應裝置的中斷使能,滿足以上條件的情況下,TEE下就可以響應REE的中斷。 REE下響應TEE的中斷,需要提前設定好TEE下的PSR的EE和IE位,設定好VIC中的中斷使能寄存器,并且将對應的中斷設定成安全中斷,設定對應裝置的中斷使能,滿足以上條件的情況下,TEE下就可以響應REE的中斷。 目前TEE-Lite的體系架構不支援在TEE下響應REE的異常以及在REE下響應TEE的異常,是以這部分不在這裡展開。 在晶片預設啟動的時候,除了VBR寄存器為0之外,晶片一般處于TEE模式下,是以ROM中使用的一般為TEE的異常/中斷向量表,當程式進入到flash之後,需要重新注冊TEE的異常/中斷向量表,方式如1.2章節描述,完成這部分之後可以在TEE下正常響應TEE的中斷和異常(需要完成相關中斷和異常的使能,不在此處較長的描述)。 如果需要響應REE的中斷,(編譯時已經完成REE的異常/中斷向量表的編譯連結)則有兩種實作方式:1、使用WSC指令,從TEE切換到REE中,然後修改REE的VBR,指向到對應的REE Exp Base Addr,即可以在REE下響應REE的中斷和異常。該方式也支援在TEE下響應REE的中斷。 2、在TEE下修改REE的VBR,直接關聯REE的Exp Base Addr,此時可以在TEE下響應REE的中斷,也可以REE下響應REE下的異常和中斷

8系列TEE-Lite異常中斷向量表和服務程式的存儲結構
8系列TEE-Lite異常中斷向量表和服務程式的存儲結構

文章來源:晶片開放社群

文章連結:

https://occ.t-head.cn/community/post/detail?spm=a2cl5.14300636.0.0.1b87180f3qWo3R&id=616650480654745600

繼續閱讀