J-Link調試器支持將程序下載到RAM或Flash中,并通過設置無限斷點、查看內存寄存器等方式實現在線調試。如果沒有這種調試能力,我們需要反復試錯。
當調試過程停止,沒有辦法繼續時,系統被“鎖定”或“調試掛起”。引起異常的一種情況是程序或調試器在外部RAM控制器配置之前訪問了外部內存。
為了解決該問題,J-Link增加了新功能-雙內存映射。
01什么是雙內存映射?能解決什么問題?
應用程序從main()開始,main()之前的啟動過程,我們通常默認其正常工作。因此,在main()之前出現的問題,特別是鎖定調試邏輯并阻止進一步調試,是一個大問題。其中一個問題是在外部RAM控制器配置之前訪問外部內存。
使用J-Link的雙內存映射,一個內存映射用于處理啟動階段的內存訪問,第二個內存映射在初始化完成后使用。第一個內存映射阻止對外部內存的訪問,第二個內存映射允許全內存訪問,消除了在配置完成之前訪問外部內存的可能性和問題。
02問題發現
在更新一些代碼時,我們注意到一些用戶界面代碼中的錯誤,重寫了它,并像往常一樣下載到目標中。在重置應用程序時,我們得到了目標連接丟失的消息。我們檢查了所有的物理連接,然后再試一次……
…但它又失敗了。
對目標重新上電,再次下載應用程序,但結果相同。
03罪魁禍首
通過J-Link日志文件:
JLINK_ReadMem(0x0033D4C0, 0x340 Bytes,…)
CPU_ReadMem(832字節@ 0x0033D4C0)
failed
- 40.959ms returns 1
Embedded Studio告訴J-Link從目標的地址0x0033D4C0讀取832字節,在XC7Z010平臺上該地址位于外部DDR RAM中的內存。DDR RAM在訪問之前必須被初始化。而Embedded Studio在啟動目標應用程序之后讓J-Link立即讀取內存,該操作在DDR RAM初始化之前。
我們沒有添加任何會影響DDR RAM初始化的代碼。為什么這一切突然發生了呢?
一個打開的內存窗口,顯示了外部DDRRAM中的數組“aMyArrInExtDDRRAM”內容。
我們沒有考慮到打開的內存窗口是問題所在,內存窗口僅在調試會話期間可見,增加了這種情況的隱蔽性,
調試會話開始時不打開內存窗口并不是一個解決辦法。例如,第三方調試器可能默認打開內存窗口,或者不允許用戶關閉它等。同樣的,使用單內存映射解決方案,通過J-Link腳本文件指定某些區域為非法區域,在這種情況下也不起作用。
04解放方案
使用兩個內存映射:一個用于處理啟動完成之前的內存訪問,另一個用于處理啟動完成之后的內存訪問。用戶可以向每個映射中添加自定義區域。
第一個內存映射的訪問限制就像一個安全模式。一旦應用安全通過了這個階段,就會動態切換到第二個內存映射。
05易于實現
使用J-Link Control Panel,現在可以很容易地將“excluded”區域添加到第一個內存映射中,J-Link在目標應用程序啟動完成之前使用該映射。
單擊“Add region…”將彈出如下對話框:
配置之后,J-Link在初始化完成之前不會訪問外部DDR RAM。
針對XC7Z010平臺,我們在J-Link軟件中添加了XC7Z010的通用設置步驟。此配置中,XC7Z010的外部DDR RAM區域在默認情況下會在啟動完成之前被排除。未來我們可能對所有支持的芯片執行此工作。
審核編輯:湯梓紅
-
應用程序
+關注
關注
38文章
3321瀏覽量
58646 -
調試器
+關注
關注
1文章
311瀏覽量
24147 -
J-Link
+關注
關注
0文章
88瀏覽量
22563 -
內存映射
+關注
關注
0文章
14瀏覽量
7512
發布評論請先 登錄
示波器的FFT能解決什么問題?
Linux內核之內存映射原理分析
FPGA能解決什么問題看了就知道
內存映射的相關資料推薦
Linux的mmap文件內存映射機制
訪問CXL 2.0設備中的內存映射寄存器

單片機的內存映射圖解析

單片機的內存映射圖解析

pcb仿真能解決什么問題?
U54內核上CLINT的內存映射

評論