引言:
最近一直在根据安富莱的教程学习STM32开发,在安富莱的教程中了解到Keil中有一个Event Recoder调试组件,使用该组件可以可以在Keil调试模式中通过Debug View窗口显示调试信息,还能够很方便的测试代码的运行时间。通过Event Recoder打印调试信息不需要额外占用单独的UART接口,并且速度更快,因此想着亲自动手从头配置一下Event Recoder。
原因分析:
按照安富莱的教程,我配置好了Event Recoder调试组件,但是在main函数中使用printf()打印调试信息且不显示,经过排查发现问题的原因是在重定向STDOUT函数时没有选择EVR,将STDOUT后边选择为EVR即可成功在Debug窗口打印出调试信息。
除了上述的原因,还有一个原因也会导致Event Recoder的printf()没有输出,那就是不要在代码中重定义fputc()函数,如下面代码所示。屏蔽下面这段代码,取消重定向printf()到uart串口,这样Event Recoder的printf就可以在Debug Virw窗口正常显示了。
int fputc(int ch, FILE *f)
{
#if 1
bsp_ComSendChar(UART_COM1, (uint8_t) ch); /* 将需要printf的字符通过串口中断FIFO发送出去,printf函数会立即返回 */
return ch;
#else
UART1->DR = (uint8_t) ch; /* 采用阻塞方式发送每个字符,等待数据发送完毕 */
while((UART1->SR & USART_SR_TC) == 0 ) /* 没有发送完成则一直循环等待 */
{}
return ch;
#endif
}
解决printf()打印到Debug View窗口时异常卡顿的问题
经过上述步骤,解决了Event Recoder的printf函数无输出的问题,但是在使用过程中发现Keil界面异常卡顿,打印输出也非常慢,后来根据安富莱的教程,对工程进行如下设置,将Event Recoder的代码分散加载到NoInt的内存中,然后增大Number of Recoders的大小,即可缓解卡顿,具体可参考安富莱的视频教程开启Event Recorder狂暴模式。
最终结果:
成功在Debug View窗口中打印出调试信息,如下图所示。
参考博文:
感觉Event Recoder是一个调试利器,用起来很方便,大家如果想了解更多信息,可以参考安富莱的教程,特别详细,并且安福莱的代码非常规范,很适合做项目使用,强烈推荐!
【1】安富莱视频教程:开启Event Recorder狂暴模式
【2】安富莱 专题教程第7期 终极调试组件Event Recorder