2

simavr と avr-gdb を使用して .hex ファイルをデバッグします。問題は次のとおりです。

(gdb) i r pc
pc             0xcd0    0xcd0
(gdb) x/10i 0xc4
   0x8000c4:    nop
   0x8000c6:    nop
   0x8000c8:    nop
   0x8000ca:    nop
   0x8000cc:    nop
   0x8000ce:    nop
   0x8000d0:    nop
   0x8000d2:    nop
   0x8000d4:    nop
   0x8000d6:    nop
(gdb) x/10i $pc-0xc0c
   0xc4:        eor     r1, r1
   0xc6:        out     0x3f, r1        ; 63
   0xc8:        ldi     r28, 0xFF       ; 255
   0xca:        ldi     r29, 0x08       ; 8
   0xcc:        out     0x3e, r29       ; 62
   0xce:        out     0x3d, r28       ; 61
   0xd0:        ldi     r17, 0x05       ; 5
   0xd2:        ldi     r26, 0x00       ; 0
   0xd4:        ldi     r27, 0x01       ; 1
   0xd6:        ldi     r30, 0xEA       ; 234
(gdb)

avr-gdb は私の入力アドレスを理解できず、オフセットを追加しているようです。

4

1 に答える 1

2

私は simavr の作者です。申し訳ありませんが、私はスタック オーバーフローのメンバーではありません。

これらのアドレスが表示される理由は、gdb/gcc が重複する「アドレス空間」を持つアーキテクチャをうまく処理できないためです。AVR SRAM は 0x000 で始まり、AVR フラッシュも 0x000 で始まり、..eeprom も 0x000 であると見なされます。これは「ハーバード」アーキテクチャです。

したがって、gcc/gdb を機能させるために、これらのオフセットに任意の定数を追加することにより、すべてが「仮想アドレス空間」でコンパイルされます。 0x800000 にあり、eeprom は 0x810000 にあります。

これにより、gcc/gdb を満足させることができますが、gdb はすべてがこれらのオフセットにあると固く信じているため、デバッグ時にこれらの奇妙な問題に対処するという代償を払う必要があります。

これを処理する最善の方法は...無視することです! 私たちにできることはほとんどありません - 私はそれを思いつきませんでした.2009年にsimavrが始まるずっと前にavr-gccに組み込まれました.

そこに simavr アドレスの「アドレス デコーダー」が表示されます。 https://github.com/buserror/simavr/blob/4c9efe1fc44b427a4ce1ca8e56e0843c39d0014d/simavr/sim/sim_gdb.c#L357

この助けを願っています - さらに質問がある場合は、気軽に freenode #simavr に参加するか、github を開いて「発行」してください。

于 2017-09-21T07:26:09.587 に答える