ADS中調試中斷函數時進不了中斷服務函數的解決辦法

最近在ADS中調試ARM裸機中斷,遇到了一個很大的問題-無法進入中斷服務程序。

在調試觸摸屏裸機程序過程中遇到了很奇怪的問題:

我用JLINK在線調試時,當選擇開關打到nandflash時可以成功跳到中斷服務程序,

但是當選擇開關打到norflash時,再下到SDRAM中就是進不了中斷,在ADS下調試觸摸屏中斷實驗時,一按觸摸屏發出中斷就提示Dummy error......

經過參考後發現因爲內部SRAM的地址0x0處都不存在你要調試的程序的中斷向量表,不能正確將中斷引導到你編寫的中斷服務程序中來。

我們知道,一般使用JLINK調試程序時是在SDRAM(0x30000000)中的,可是如果程序中包含有中斷又該怎麼辦呢??因爲中斷程序向量表是存放在0x0開始的8*4個字節中的,而我們調試時程序試運行在SDRAM中的,很明顯此事中斷向量表不能正常加載,你能看到中斷寄存器發生中斷請求,但是看不到產生的現象,此時不要誤認爲你的JLINK有問題,事實上正版的JLINK也是如此,同樣看不到現象,因爲原因不在JLINK,而在中斷向量表沒能正確加載,下面簡單說說這個問題的解決辦法


中斷向量表地址在0x00000000,程序放到ram時,必須要把向量表放在0x0處。在不開啓mmu是那就得把程序下到norflash,如果開啓mmu則須把入口地址映射到0x0


綜上所述,解決方法如下:

1.直接燒寫到norflash(如果代碼大於4K,啓動代碼中必須要有拷貝到SDRAM功能)。

2.改寫自己的程序,在初始化中斷之前將中斷向量表拷貝到內部SRAM。這個方法貌似有點難度,彙編要比較牛才行。

3.利用MMU的重定向功能。這就是網上有人說要添加MMU.C和MMU.H.然後主程序裏面調用init_mmu()。

由於燒寫到nandflash比較方便,個人比較傾向於第三種解決方案。


直接將程序下載到flash運行的情況:

1.在不開啓mmu時那就只有把程序下到norflash纔可以可以運行,因爲程序可以在Boot Internal SRAM (4kb)或者是Norflash0x0地址開始運行。

2.而當程序下載到nandflash時,它是隻讀的,程序將被加載到SDRAM的0x30000000開始執行,這時則要開啓mmu把sdram的地址0x30000000入口地址映射到0x0,

否則將找不到中斷服務入口地址。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章