使用J-Link RTT Viewer查看RTT的输出日志,程序全速跑起来后,发现有时候内容打印不全,后面有一分部分内容直接没有了。这是RTT的缓冲区满造成的。我自己的解决方法有如下几种:
1、使用软件延时
在一下子输出了较多内容时,添加软延时函数,等待缓冲区输出完成。延时时间建议在20ms以上。
2、增大缓冲区
我一般直接使用通道0作为RTT输出通道。通道0也是RTT组件初始化后,默认初始化的通道。在SEGGER_RTT_Conf.h头文件中可以对通道0的参数进行配置。
BUFFER_SIZE_UP宏定义为上行(MCU->PC)缓冲区的大小,默认为1KB。
增大该缓冲区可以有效减少溢出发生的可能性。
#define BUFFER_SIZE_UP (1024*4) // Size of the buffer for terminal output of target, up to host (Default: 1k)
3、修改发送模式
RTT默认的输出方式是非阻塞的,一旦缓冲区满了,就丢弃后面的内容。
#define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP // Mode for pre-initialized terminal channel (buffer 0)
可以将其改为阻塞方式:
#define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL
总结:
解决RTT打印日志内容不全的问题,可以综合同时使用2和3,一方面增大上行Buffer的大小,一方面使用阻塞方式,可以很好解决该问题。