ARM GNU 编译与链接01: 工程创建, 程序烧写和调试

2022-03-20  本文已影响0人  wjundong

ARM GNU 编译与链接01: 工程创建, 程序烧写和调试

基于 STM32 平台, 对编译与链接原理进行探究,以及学习 ARM 汇编指令集, GNU 的汇编语法。

从零开始的工程创建

这里以一个简单的汇编程序为例

编译

$ ls
link.ld  Makefile  openocd.cfg  start.s
$ make
start.s -> build/start.o
arm-none-eabi-size build/demo.elf
   text    data     bss     dec     hex filename
     28       0       0      28      1c build/demo.elf
arm-none-eabi-objcopy -O ihex build/demo.elf build/demo.hex
arm-none-eabi-objcopy -O binary -S build/demo.elf build/demo.bin

下载和开启调试服务

$ openocd
...
** Programming Started **
...
** Programming Finished **
** Verify Started **
** Verified OK **
...
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections

使用GDB进行调试:

$ arm-none-eabi-gdb build/demo.elf
...
Reading symbols from build/demo.elf...
(gdb) target remote localhost:3333
reset () at start.s:10
10          mov r0, #0x66
(gdb) n
halted: PC: 0x0800000a
11          mov r1, #255

使用 VSCode

使用 VSCode 进行调试需要设置 launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/demo.elf",
            "args": [],
            "stopAtEntry": true,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "arm-none-eabi-gdb",
            "setupCommands": [
                    {"text": "set remotetimeout 5"},
                    {"text": "target extended-remote localhost:3333"},
                    {"text": "monitor reset halt"},
            ]
        }
    ]
}

确保使用 openocd 打开调试服务, 然后开始调试如图所示


image.png

发现 VSCode 没能在汇编上打断点, 不过可以在左边栏手动添加断点标签, 比如上面在reset标签打了断点, 所以程序就在入口出停了下来, 这时观察左边栏的寄存器信息, 发现 sp指针正是 0x20020000, pc 指针是 0x8000008, 因为中断向量表只放了2 个word数据, 也就是8字节, 在 link.ld 中 中断向量表后面立刻是程序了, 所以程序复位后pc值就是0x8000008。
同时我们可以在下面的输出栏的调试控制台对GDB发送命令来查看更多信息, 比如打印FLASH初始地址的内容 -exec x /4x 0x8000000, 查看某个程序的汇编内容 -exec disassemble reset
成功进入调试后, 单步运行查看寄存器和pc、sp指针的变化, 理解这个过程

上一篇下一篇

猜你喜欢

热点阅读