NXP - MDK460的调试设置
文章目录
- NXP - MDK460的调试设置
- 概述
- 概述
- 实验环境
- 写测试程序
- 编译参数设置
- 调试参数设置
- 单步调试验证
- 如果单步调试不好使,如何验证?
- 备注
- 备注
- END
NXP - MDK460的调试设置
概述
在实验使用mbed库的固件,进行单步调试的预研任务。
看了官方文档, 可以知道,调试方式有2种。
- 将程序.bin丢到mbed的U盘中,让板载的bootloader程序自动更新程序。reset之后,用串口控制台的调试信息来猜测判断程序的bug. 这种方式对于稍微复杂点的程序调试,不实用。只是理论上可行,且效率低下。
- 用MDK来单步调试。官方建议的版本为MDK460.
这种就是正常调试的方法了,喜欢这种正规的单步调试。
但是,默认安装完的MDK460, 并不能正常单步调试。还需要设置一下才行。
概述
实验环境
硬件为 OM11043(mbed-NXP-LPC1768)
软件为MDK460和MCUXpresso IDE v25.6.136
写测试程序
就想看看能不能单步调试,啥库都不用带。就写个循环,能编译过就行。
建立工程时,MCU选LPC1768. 选择拷贝启动文件(startup_LPC17xx.s)到工程。
然后添加自己的main.cpp到工程。
// @file main.cpp// uv4_case1.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_lpc17xx.o).extern "C" void SystemInit()
{
}int main()
{volatile int i = 0;do {i++;if (i > 3){i = 1;}
} while (i < 10);return 0; // never happen
}
uv4会自动为工程生成和工程同名的x.sct(分散加载描述文件, Scatter Loading Description File), 并在工程配置中指定此x.sct.
直接编译就能编译过。
但是如果此时要单步,因为调试参数没设置,还不能正常调试。
编译参数设置
LPC1768是在建立工程是选的,只是确认一下。
如果后续在LPC1769的板子上实验,也可以在这里改。
Target不用改,只是看一下。
output选项卡,勾上调试信息。我将浏览信息也勾上了。
Listing选项卡我全勾上了,对于程序编译完,查看编译细节有帮助。
Listing选项卡对调试没用,只是看一下。
User选项卡没动,只是看一下。
C/C++选项卡没动,确认优化级别为O0. 如果编译后,MCU装不下程序,可以选为O1.
汇编语言的选项卡完全没动。
Link选项卡,没有勾选使用默认布局。
对于有点复杂的固件程序,可以修改.sct文件,使变量在内存中的位置可以指定。
调试参数设置
Debug选项卡和Utilities选项卡都和单步调试相关。
Debug选项卡设置实际硬件板子使用的调试器。
对于OM11043(mbed-NXP-LPC1768), 调试器为板载的LPC-LINK, 调试器固件为CMSIS-DAP.
勾选在开始时载入应用,运行到main()
点开"Settings"继续设置Debug参数。
“Flash Download"选项卡,勾选的选项如图。我多勾选了一个"Reset and Run”
Flash定义信息是选好MCU后,uv4写的,不用改。
工具选项卡,也要选中对应的调试器,否则单步调试失败。
确认勾选,调试前更新固件。
工具选项卡中,自带的"Flash Download"选项卡和前面的应该是一个,只是确认一下。
单步调试验证
将程序编译通过,0错误,0警告。
先下好断点,然后开始调试。
只要调试开始后,能落在自己下的断点处。再按F10能步过,就说明是能单步调试的。
MDK4和MDK5的单步调试快捷建不相同。
如果单步调试不好使,如何验证?
开始debug参数没设置好,导致开始调试后,能看到CMSIS-DAP错误的信息一闪而过,然后调试过程就中止了。
板子硬件一样,用MCUXpresso IDE v25.6.136也建立一个同样简单的工程,可以单步调试。
这就说明手头的OM11043(mbed-NXP-LPC1768)的板载调试器是好的,那么只可能是uv4中调试器的参数没设置好引起不能正常调试,这问题范围就缩小了。如果是参数没设置好之类的问题,那么排查起来就简单了。
备注
MDK460的好处: 软件包都是自带的,不用去联网下载软件包。对于比较旧的MCU(e.g. LPC1768, LPC1769)写固件程序很方便。
去uv4安装目录下看了一眼,好像也没啥软件包。
只是uv4新建工程时,能提供正确的启动文件(.s)和正确的.sct.剩下缺的库,可能都要从MCU厂家提供的库中添加过来。
uv4这种套路,很干净。
备注
比较老旧的硬件和编程环境(e.g. mbed2), 在线mbed编辑器已经被ARM官方在2022年就关闭了。
现在还好, ARM官方对于OM11043(mbed-NXP-LPC1768)的文档和例程还在.
现在只能尝试用Mbed Studio和mbed-cli来编译老旧的开源工程(e.g. Smoothieware),来尝试是否有简单的单步调试方法可用。
如果再过20年想研究这个工程,有可能啥也没了。只能用arm-gcc工具链 + 串口通讯(固件中的MRI库独占了一个单独的调试串口)的gdb控制台来调试了。主要是现在有好用的图形化调试,当然不想去用复古的gdb调试。gdb调试只能是说还能用,如果不是刚需(就剩下gdb方式能调试),谁会去用gdb呢?
工程师有时也挺悲催的,吃(研究)shi(老旧的工程)也赶不上热乎的。
如果说能赶上热乎的,可以用mbed在线编辑器将老旧工程导出为uv4的,那就很方便了。
有时老旧的工程,知识点(电机控制)反而看的更清晰,实验条件更完备(手头有实际的openpnp硬件设备, 上位机的控制软件openpnp是开源的,固件工程是开源的,联调一下,能收获很多新东西和细节)。