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…….
现在编译项目:
这里写图片描述
是不是啥都有了^_^

未完待续。。。

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值