以前在Windows开发STM32,习惯了使用各类IDE进行烧录和调试,现在在Linux环境使用命令行方式进行烧录和调试,执行以下命令前先需要安装Jlink调试环境,在此就不在详述!
一、程序烧录
先插上jlink,打开终端,进入nuttx目录,执行
JLinkExe
输入芯片型号、调试接口和速度,这里直接使用默认值,接下来添加要烧录的二进制文件进行烧录,输入命令:
loadbin nuttx.bin 0x08000000
输入以上命令后,开始烧录,成功后界面如下:
二、命令行调试
打开终端,输入:
JLinkGDBServer -device STM32F407VE -speed 4000 -if SWD
会等待GDB连接!
再打开另一个终端,进入nuttx调试文件的目录,输入:
arm-none-eabi-gdb nuttx
会启动GDB调试
输入:
target remote localhost:2331
连接到刚才的GDB
输入:
continue
代码开始运行
打开串口,可以与单片机通过shell交互
复位单片机使用命令:
monitor reset
断点使用方法,使用 GDB 的 file 命令载入需要调试的可执行文件,输入:
file nuttx
将需要调试的源代码文件添加到 GDB 调试器的源码列表中,以下目录是工程文件夹的目录,输入:
directory /home/xm/nuttx_project
使用 GDB 的 list 命令查看要打断点的代码区域,输入:
list arm_hardfault.c:153,163
使用 break 命令在指定文件的 153 行打断点,输入:
break arm_hardfault.c:153
再次运行,输入:
continue
程序开始运行!
在shell中执行测试程序:test_app,触发设定的段错误,进入段错误函数(arm_hardfault),如下所示:
调试窗口输入“bt”,查看堆栈信息,可以看到进入硬件错误前的执行函数,但是没有显示触发段错误的测试代码,目前原因未知,希望有高人解答!
删除断点,输入:
delete breakpoints 1,1为断点编号
到此,简单的调试过程就是这样了