通常调试代码通过jlink在线调试是比较好的方法,只在程序开发的初级阶段能有比较高的调试效率,可以随时观察到程序的运行状况及查看相应的变量,但如果在程序的整体调试及后面的现场调试就不那么好用了。介绍2个我平时使用2个比较好的调试方案,打印调试及命令行调试。
打印调试就是通过将程序的运行状态以字符形式打印到串口终端上,但今天通过jlink 的 RTT功能并不需要占用串口资源,只需占用1K多点的内存空间用于存放打印字符即可。
#undef SLAVE_POLL_DEBUG
#ifdef SLAVE_POLL_DEBUG
#define slave_poll_log(...) do{if(DEBUG(DEBUG_PROTOCAL)){DBG_LOG("[SLAVE POLL](%ld) ",__LINE__);DBG_LOG(__VA_ARGS__);}}while(0)
#define slave_poll_usr(...) do{if(DEBUG(DEBUG_PROTOCAL)){DBG_LOG("[SLAVE POLL] ");DBG_USR(__VA_ARGS__);}}while(0)
#define slave_poll_err(...) do{if(DEBUG(DEBUG_PROTOCAL)){DBG_LOG("[SLAVE POLL] ");DBG_ERR(__VA_ARGS__);}}while(0)
#define slave_poll_dump(...) if(DEBUG(DEBUG_PROTOCAL)){DBG_DUMP(__VA_ARGS__);}
#else
#define slave_poll_log(...)
#define slave_poll_usr(...)
#define slave_poll_err(...)
#define slave_poll_dump(...)
#endif
slave_poll_err(“heap size %d is can not malloc slave working\r\n”,xPortGetFreeHeapSize());
打开jlink-RTT viewer即可查看到打印数据,很方便,不使用时串口都不会浪费,对于查看程序的工作过程很有效果。
另外一种调试方案是通过控制台增加调试命令,直接在串口终端打印需要的程序、变量信息,对于运行过程查错调试很有效。
static BaseType_t console_user_led_test_execute( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ){
( void ) pcCommandString;
( void ) xWriteBufferLen;
configASSERT( pcWriteBuffer );
if( login_flag==0 ){
strcpy(pcWriteBuffer,"请先登录\r\n");
return pdFALSE;
}
master_working.production_test.opeation |= PT_TEST_MODE;
extio_led_blink_cnt(LED1,100,10);
extio_led_blink_cnt(LED2,100,10);
extio_led_blink_cnt(LED3,100,10);
extio_led_blink_cnt(LED4,100,10);
extio_led_blink_cnt(LED5,100,10);
extio_led_blink_cnt(LED6,100,10);
vTaskDelay( 2000 );
extio_led_blink(LED1,500);
master_working.production_test.opeation &= ~PT_TEST_MODE;
sprintf(pcWriteBuffer,"LED测试完成\r\n");
return pdFALSE;
}
static const CLI_Command_Definition_t console_user_led_test ={
"ledtest",
"\r\nledtest: ledtest ---- LED测试",
console_user_led_test_execute,
0
};
这是一段调试控制LED输入的例程,也可以用于出厂的设备检测。