STM32不一样玩法 STM32CubeMx Clion C++(五)——openocd调试

在keil里面,我们可以调试程序,在Clion里,配合扩展插件,仍然可以调试程序,甚至调试效果比keil还好,用起来非常爽。
废话不说了,先加入头文件

#include <string.h> //memset函数需要
#include <iostream> //malloc和cout需要

在主函数while(1)前面加入以下代码,作为我们要调试的部分:

  volatile int a;
  a=0;
  a=1;
  a+=10;

  char* ch;
  ch=(char*)malloc(10);
  memset(ch,0,10);
  memset(ch,'c',10);
  *(ch+5)='f';

  char* ar;
  ar=(char*)malloc(7);
  memset(ar,0,7);
  *(ar+0)='H';
  *(ar+1)='e';
  *(ar+2)='l';
  *(ar+3)='l';
  *(ar+4)='o';
  *(ar+5)='!';

  free(ch);
  free(ar);

我这里加了个volatile关键字,是为了看清楚a值变化过程,有不懂的小伙伴去百度一下,很多人说这个的。
另外,我们顺便测试一下malloc函数是否可用。
加完代码后,先在需要调试的代码之前加一个断点,因为Clion启动调试后会自动开始执行程序,加个断点可以使程序停在我们需要的地方。
点击调试按钮,如下图。
这里写图片描述

程序停下后可以看到下方调试台输出信息了,a定义了,不过没赋值,是一个不可预测的值。
这里写图片描述

下图我用红框圈出的地方是调试用的按钮,有开始、停止、重启、步进等等,箭头指的按钮是下一步,点一下,程序向下走了一步,a的值变为0了。
这里写图片描述

继续步进,可以看到a的值变为1再变为11。
现在看看malloc和memset函数:

声明ch,默认为空指针,
这里写图片描述

执行malloc,ch 分配了地址
这里写图片描述

memset为0后,
这里写图片描述

memset为‘c’,
这里写图片描述

取指针赋值,声明ar
这里写图片描述

malloc给ar分配空间,看ch和ar的地址,增长了0x10,为什么不是增长0x0a呢?这个我查了下,大概是因为malloc分配的空间,最小是size指定的大小,但不一定正好是这个值,具体我也不是很清楚。
这里写图片描述

手动赋值了一个字符串,
这里写图片描述

继续执行到这一步,发现LED亮起。
这里写图片描述

退出调试,按这里
这里写图片描述

好了,调试完成,还是很愉快的,不知各位是否注意到,定义的每个值,Cion都在代码旁边标出其内存值
这里写图片描述
就问你稳不稳。

还有一部分,不属于调试,但是我觉得放这这里很合适。
在Keil里面,编译完成的时候,会显示Flash和Ram使用情况:
这里写图片描述

在Clion里可不可以呢,答案是肯定的。arm-none-eabi-gcc这套工具中有个有意思的东西,就是查看size的,arm-none-eabi-size。使用方法很简单:

arm-none-eabi-size YouTarget.elf

YouTarget.elf是你编译出来的文件,叫做调试文件,openocd就是把它写入单片机。
这里写图片描述

  • Flash=text+data
  • Ram =bss+data

仅仅能在控制台使用是不够的,现在,让Clion来自动完成这个事情。
打开CmakeList.txt,把这段:

add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
        COMMAND ${SIZE} ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.elf
        COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE}
        COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE}
        COMMENT "Building ${HEX_FILE}
        Building ${BIN_FILE}"
)

改成这段:

add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
        COMMAND ${SIZE} ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.elf
        #COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE}
        #COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE}
        #COMMENT "Building ${HEX_FILE}
        #Building ${BIN_FILE}"
)

更新一下,就是右键->Reload Cmake…….
现在编译项目:
这里写图片描述
是不是啥都有了^_^

未完待续。。。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页