在keil里面,我们可以调试程序,在Clion里,配合扩展插件,仍然可以调试程序,甚至调试效果比keil还好,用起来非常爽。
废话不说了,先加入头文件
#include //memset函数需要
#include //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函数:
malloc给ar分配空间,看ch和ar的地址,增长了0x10,为什么不是增长0x0a呢?这个我查了下,大概是因为malloc分配的空间,最小是size指定的大小,但不一定正好是这个值,具体我也不是很清楚。
好了,调试完成,还是很愉快的,不知各位是否注意到,定义的每个值,Cion都在代码旁边标出其内存值
就问你稳不稳。
还有一部分,不属于调试,但是我觉得放这这里很合适。
在Keil里面,编译完成的时候,会显示Flash和Ram使用情况:
在Clion里可不可以呢,答案是肯定的。arm-none-eabi-gcc这套工具中有个有意思的东西,就是查看size的,arm-none-eabi-size。使用方法很简单:
arm-none-eabi-size YouTarget.elf
YouTarget.elf是你编译出来的文件,叫做调试文件,openocd就是把它写入单片机。
仅仅能在控制台使用是不够的,现在,让Clion来自动完成这个事情。
打开CmakeList.txt,把这段:
add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
COMMAND ${SIZE} ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.elf
COMMAND ${CMAKE_OBJCOPY} -Oihex $${PROJECT_NAME}.elf> ${HEX_FILE}
COMMAND ${CMAKE_OBJCOPY} -Obinary $${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…….
现在编译项目:
是不是啥都有了^_^
未完待续。。。