|
发表于 2014-9-11 10:58:59
|
显示全部楼层
本帖最后由 shangdawei 于 2014-9-11 11:01 编辑
//
// Allocate buffers for channel 0
//
static char _acUpBuffer [BUFFER_SIZE_UP];
static char _acDownBuffer[BUFFER_SIZE_DOWN];
//
// Initialize SEGGER Real-time-Terminal control block (CB)
//
static SEGGER_RTT_CB _SEGGER_RTT = {
"SEGGER RTT",
SEGGER_RTT_MAX_NUM_UP_BUFFERS,
SEGGER_RTT_MAX_NUM_DOWN_BUFFERS,
{{ "Terminal", &_acUpBuffer[0], sizeof(_acUpBuffer), 0, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP }},
{{ "Terminal", &_acDownBuffer[0], sizeof(_acDownBuffer), 0, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP }},
};
_SEGGER_RTT 会有两个副本, 第一个副本用来初始化第二个副本
当在FLASH中运行, 第一个副本位于FLASH, 第二个副本位于SRAM, 程序启动时, 从第一个副本复制到第二个副本.
这样在SRAM中只有一个字符串 "SEGGER RTT" RTT 可以正确定位 _SEGGER_RTT 在 SRAM 中的地址 ( 搜索整个SRAM区域 )
当在SRAM中运行, 两个副本均在 SRAM, 这样 RTT 可能错误定位 _SEGGER_RTT 于用来初始化第二个副本的第一个副本
用来初始化第二个副本的第一个副本的 RING_BUFFER 的 WrOff 和 RdOff 一直是 0, 所以没有数据可读取.
修改 static SEGGER_RTT_CB _SEGGER_RTT = { "SEGGER RTT", ...
成为 static SEGGER_RTT_CB _SEGGER_RTT = { "SEGGER_RTT", ...
然后添加函数
void SEGGER_RTT_Init( void )
{
_SEGGER_RTT.acID[6] = ' '; // SEGGER RTT
}
然后
SEGGER_RTT_Init(); // 初始化之后, RTT 可以正确定位 _SEGGER_RTT 在 SRAM 中的地址 ( 搜索整个SRAM区域 )
SEGGER_RTT_ConfigUpBuffer( 0, NULL, NULL, 0, SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL );
SEGGER_RTT_WriteString( 0, "SEGGER Real-Time-Terminal Sample\r\n\r\n" );
|
|