本帖最后由 gamethink 于 2018-4-20 18:14 编辑
J-LINK V8的,驱动是5.03不敢用太高,RTT的头文件也是5.03配套的,出现这些怪问题,调试几天不解
首先,RTT的所有代码没有修改过,SEGGER_RTT_Conf.h也没有修改,使用默认值,MDK为最新的5.25
第一种情况,单纯输出字符也死循环。
int main(void)
{
SEGGER_RTT_Init();
SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0, SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL);
SEGGER_RTT_WriteString(0, "SEGGER Real-Time-Terminal Sample
");
SEGGER_RTT_printf(0, "Len = %d
", 10); \极其怪异!如果%d修改为%.1d则不会进入RTT的函数死循环,很怪异!
while(1);
}
RTT输出窗口可以输出SEGGER Real-Time-Terminal Sample,然后第二行Len = 10没有输出,然后是死循环在RTT的处理函数,里面函数还没看明白,但是一直在循环。
但如果改成%.1d则正常输出,是这样子:
SEGGER Real-Time-Terminal Sample
Len = 10
第二种情况,输入一串数字,返回数字的长度,还有显示,比如输入123,输出Len = 4, Data = 123,因为RTT输入界面包含换行符,所以长度是4。
void TestTimer(void) \这个函数会1秒钟执行一次,是M3的SYSTICK中断里调用的
{
uint8_t rttData[32] = {0};
static uint8_t len;
if(SEGGER_RTT_HasKey() == 1)
{
len = SEGGER_RTT_Read(0, &rttData[0], sizeof(rttData));
rttData[len] = ' ';
SEGGER_RTT_printf(0, "Len = %.1d, Data = %s
",len, rttData); \用%1.d也是第一种情况的原因,如果用%d,当输入达到10以上就会进入RTT自己的函数死循环跳不出
}
}
int main(void)
{
volatile int _Cnt;
SEGGER_RTT_Init();
SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0, SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL);
SEGGER_RTT_WriteString(0, "SEGGER Real-Time-Terminal Sample
");
TimerInit(1000000);
TimerAddISR(TestTimer);
while(1)
{
Routine();
}
}
刚开始如果输入123abc,MCU收到后回发给电脑,电脑显示Len = 7, Data = 123abc,好像很正常,但是如果不停往RTT输入字符,比如123,123,123....很快不用10次,就会死机,进入hardfault的状态
微信图片_20180420180842.png (39.68 KB, 下载次数: 0)
下载附件
2018-4-20 18:09 上传
可以看到图的死机位置,和RTT终端窗口实际我只发了很少数据,而且不是连续发的,是几秒钟发一个123也会hardfault
已经调了几天了,好郁闷,有哪位朋友懂这个东西?
一周热门 更多>