中斷和異常
ARMv7‐M 開創(chuàng)了一個全新的異常模型,CM3 采用了它。請你一定要劃清界線:這種異常模型跟傳統(tǒng)ARM 處理器使用的完全是兩碼事。新的異常模型“使能”了非常高效的異常處理。它支持16‐4‐1=11 種系統(tǒng)異常(保留了4+1 個檔位),外加240 個外部中斷輸入。在CM3 中取消了FIQ 的概念(v7 前的ARM 都有這個FIQ,快中斷請求),這是因?yàn)橛辛烁赂玫臋C(jī)制——中斷優(yōu)先級管理以及嵌套中斷支持,它們被納入CM3 的中斷管理邏輯中。因此,支持嵌套中斷的系統(tǒng)就更容易實(shí)現(xiàn)FIQ。
CM3的所有中斷機(jī)制都由NVIC實(shí)現(xiàn)。除了支持240 條中斷之外,NVIC 還支持16‐4‐1=11 個內(nèi)部異常源,可以實(shí)現(xiàn)fault 管理機(jī)制。結(jié)果,CM3 就有了256 個預(yù)定義的異常類型,如表2.2 所示。
雖然CM3 是支持240 個外中斷的,但具體使用了多少個是由芯片生產(chǎn)商決定。CM3 還有一個NMI(不可屏蔽中斷)輸入腳。當(dāng)它被置為有效(assert)時,NMI 服務(wù)例程會無條件地執(zhí)行。
Cortex‐M3 支持大量異常,包括16‐4‐1=11 個系統(tǒng)異常,和最多240 個外部中斷——簡
稱IRQ。具體使用了這240 個中斷源中的多少個,則由芯片制造商決定。由外設(shè)產(chǎn)生的中斷
信號,除了SysTick 的之外,全都連接到NVIC 的中斷輸入信號線。典型情況下,處理器一般
支持16 到32 個中斷,當(dāng)然也有在此之外的。
作為中斷功能的強(qiáng)化,NVIC 還有一條NMI 輸入信號線。NMI 究竟被拿去做什么,還要
視處理器的設(shè)計(jì)而定。在多數(shù)情況下,NMI 會被連接到一個看門狗定時器,有時也會是電壓監(jiān)視功能塊,以便在電壓掉至危險(xiǎn)級別后警告處理器。NMI 可以在任何時間被激活,甚至是在處理器剛剛復(fù)位之后。
表3.4 (同表2.2)列出了Cortex‐M3 可以支持的所有異常。有一定數(shù)量的系統(tǒng)異常是用于fault 處理的,它們可以由多種錯誤條件引發(fā)。NVIC 還提供了一些fault 狀態(tài)寄存器,以便于fault 服務(wù)例程找出導(dǎo)致異常的具體原因。
向量表s
當(dāng)一個發(fā)生的異常被CM3 內(nèi)核接受,對應(yīng)的異常handler 就會執(zhí)行。為了決定handler 的入
口地址,CM3 使用了“向量表查表機(jī)制”。這里使用一張向量表。向量表其實(shí)是一個WORD
(32 位整數(shù))數(shù)組,每個下標(biāo)對應(yīng)一種異常,該下標(biāo)元素的值則是該異常handler 的入口地
址。向量表的存儲位置是可以設(shè)置的,通過NVIC 中的一個重定位寄存器來指出向量表的地
址。在復(fù)位后,該寄存器的值為0。因此,在地址0 處必須包含一張向量表,用于初始時的
異常分配。
舉個例子,如果發(fā)生了異常11(SVC),則NVIC 會計(jì)算出偏移移量是11x4=0x2C,然后
從那里取出服務(wù)例程的入口地址并跳入。0 號異常的功能則是個另類,它并不是什么入口地
址,而是給出了復(fù)位后MSP 的初值。