【发布时间】:2017-09-05 10:09:20
【问题描述】:
我想使用 gdb 将二进制文件闪存到我的 ARM MCU 闪存中。
目前我可以像这样加载精灵:
# arm-none-eabi-gdb --command=flash.gdb "myfirmware.elf"
# cat flash.gdb
set confirm off
target remote 127.0.0.1:7224
monitor reset
load
detach
quit
基本上load 命令擅长将精灵段加载到正确的地址。
但是要在 MCU 闪存中放置多个固件,我想发送一个完整的二进制映像。 为了测试它,我制作了一个 zero.bin 图像(只包含 0):
# hexdump zero.bin
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0020000
# arm-none-eabi-gdb
(gdb) target remote 127.0.0.1:7224
(gdb) mon reset halt
(gdb) mon reset init
(gdb) set arm fallback-mode auto
(gdb) set debug arm
(gdb) restore zero.bin binary 0x0
Restoring binary file zero.bin into memory (0x0 to 0x20000)
Writing to flash memory forbidden in this context
(gdb) info mem
Using memory regions provided by the target.
Num Enb Low Addr High Addr Attrs
0 y 0x00000000 0x00020000 flash blocksize 0x800 nocache
1 y 0x00020000 0x100000000 rw nocache
(gdb) delete mem 1
warning: Switching to manual control of memory regions; use "mem auto" to fetch regions from the target again.
(gdb) delete mem 0
(gdb) mem 0 0x100000000 rw nocache
(gdb) info mem
Using user-defined memory regions.
Num Enb Low Addr High Addr Attrs
1 y 0x00000000 0x100000000 rw nocache
(gdb) restore zero.bin binary 0x0
Restoring binary file zero.bin into memory (0x0 to 0x20000)
(gdb) x/10 0x0
0x0: 0x20003000 0x00003c5d 0x00003c7d 0x00003c7d
0x10: 0x00000000 0x00000000 0x00000000 0x00000000
0x20: 0x00000000 0x00000000
所以这似乎不起作用,正如您在 0x0 中看到的那样,它应该充满了“0”,但它仍然包含我以前的固件(实际上是向量表)
我错过了什么?或者也许还有另一种使用 gdb 加载二进制文件的方法?
【问题讨论】:
-
恢复命令失败,
Writing to flash memory forbidden in this context。我正在试图弄清楚为什么这也会发生在我身上 -
实际上在我的情况下,这是因为这个区域被映射到闪存,而 gdb 需要一种方法来确定如何对闪存进行编程,它不可能像
addr[i] = data[i]这样的东西。我不知道如何设置 gdb 来做到这一点。无论如何,希望它有所帮助!