1. 程式人生 > >關於STM32的中斷向量表的重對映的問題

關於STM32的中斷向量表的重對映的問題

1  為什麼要對中斷向量表進行重新對映?           
   COREM3權威指南上講“然而,為了動態重分發中斷, CM3 允許向量表重定位——從其它地址處開始定位各異常向量。
   這些地址對應的區域可以是程式碼區,但也可以是 RAM 區。在 RAM區就可以修改向量的入口地址了。”。           
   疑惑:                            
        1.如果不重新對映的話,中斷向量表的地址應該是這樣的:0X0000 0000是SP;0X0000 0004是復位向量;0X0000 0008是NMI;後面按照中斷編號的順序依次按4遞增。
          這樣的話,不也能存得下中斷向量表嗎?反正存的是一些函式指標,佔不了多少空間,幹嘛還要重新對映到其他的地方呢?                           
        2.如果重新對映的話,中斷向量表的入口地址就變成0x0800 0000了。但是一開始已經開闢的那部分空間(0x0000 0000......)存放的中斷向量表不是就等於沒用嗎?                           
        
問題一:想要解釋你的疑惑先要明白幾個道理
1、無論向量表是否重對映過,復位後都是從0地址的向量表處獲取SP和復位入口。

2、0地址處的中斷向量表,通常是ROM地址。通常只能通過指定連結地址,然後燒錄改寫。

3、在一些帶升級功能的產品中,通常分為boot和app兩部分。boot通常出產以後就不再變化,使用0地址向量表,必須通過Jtag之類的工具才能改寫。
   而boot中帶有下載功能個(USB、串列埠或SPI),使用者可以根據需要下載APP。

4、注意第2條,APP通常需要自己設計中斷服務。如果不重對映,只能再boot處設計查表程式,通過boot跳轉,效率不高。
   而擦寫0地址向量,如果在升級過程中掉電,則boot也無法啟動。因此,需要進入APP後,重映射向量表。

問題二:你的理解的對的。然而,0地址處的中斷向量表區域通常不放程式碼。晶片在FLASH地址分配上,也很少有將FLASH地址緊密的排在向量表之後的。因此,並不影響。