適用先: ULINK USB-JTAG Debugger
この記事に含まれている情報の適用先:
- Keil Development Suite for ARM の全バージョン
現象
Atmel AT91SAM7A2(または REMAP 機能を備えた他の Atmel デバイス)で ULINK を使用してデバッグを開始すると、µVision3 のメモリ ウィンドウに Flash メモリの不正な値が表示されます。
原因
ARM コアは、リセットと同時に CPU を停止できません。一部の Atmel デバイスは、この処理に対応できる拡張リセット ロジックを搭載していますが、Atmel AT91SAM7A2 は該当しません。ULINK が CPU を制御下に置くと、(REMAP をシミュレートするため)PC 値は 0 に設定されますが、REMAP を取り消して元に戻すことはできません。
Atmel デバイスの REMAP 機能では、RAM と Flash の領域が交換されます。ULINK によるデバイスの停止が可能になる前にリマッピングが実行されると、デバッガではスワップされたメモリ領域が表示され、CPU は正常に動作できなくなる可能性があります。
解決策
この問題の解決策として、デバッガの接続まで待機するよう、STARTUP.S ファイルに若干の修正を加えます。具体的には、次の条件付きアセンブリ セクション DEBUG_STOP の命令を起動ファイル SAM7x.S に追加します。
// Copy Exception Vectors to Internal RAM and Remap Memory
// (when Interrupt Vectors are in RAM)
MC_BASE EQU 0xFFFFFF00 /* MC Base Address */
MC_RCR EQU 0x00 /* MC_RCR Offset */
; add these instructions
$IF (DEBUG_STOP)
PUBLIC WAIT4DEBUG
MOV R0,#1
WAIT4DEBUG: CMP R0,#0
BNE WAIT4DEBUG
$ENDIF
; end
$IF (RAM_INTVEC)
ADR R8, Vectors ; Source
LDR R9, =RAM_BASE ; Destination
この命令を有効にするには、[Project]→[Options]→[Asm] の [Set:] で DEBUG_STOP と入力します。このプログラムを実行すると、デバッグ コマンドによってレジスタ R0 が手動で 0 に設定されるまで、プログラムは WAIT4DEBUG で待機します。uVision で、次のように入力します。
R0 = 0
この結果、Amtel デバイスの REMAP シーケンスをデバッグできるようになります。
デバッガの起動の自動化
uVision Debugger の起動を自動化するには、次のコマンドをデバッガ初期化ファイル([Options for Target]→[Debug]で指定)に追加します
func void CPUReset (void) {
exec ("Reset"); // Reset CPU
exec ("_sleep_ (100)"); // Wait 100ms until stopped
exec ("G, WAIT4DEBUG"); // Run just before REMAP
exec ("_sleep_ (100)"); // Wait 100ms until stopped
exec ("R0 = 0"); // Clear CPU Register R0
exec ("G, main"); // Run til main
}
// Toolbox button for CPU reset
define button "Reset CPU", "CPUReset ()"
Reset
G, WAIT4DEBUG
_sleep_ (100)
R0 = 0
_sleep_ (100)
G, main
このデバッガ初期化ファイルでは、CPU のリセットと main 関数までの実行を可能にするツールボックス ボタンも追加されます。
関連項目
- UVISION DEBUGGER: USING ULINK WITH ATMEL AT91 DEVICES