解决Event Recoder使用printf()不显示调试信息无输出的问题

引言:

最近一直在根据安富莱的教程学习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

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值