stm32 SWD printf SWD调试输出
当年实习面试时面试官考我机试,keil上面写代码,然后仿真在debug view上printf数据,我当时就觉得牛叉了,一直没搞懂怎么弄的。(ps:那公司在我入职其他公司了才叫我去上班,这不是搞笑么。。。)。这几天忽然对占用一个串口作调试口这一做法很不爽了,虽然我几乎不用printf调试,我是单步调试看内存党。。。
于是我花了半个晚上google,找到上面两个教程,然后花了半个晚上测试。OKl了。有个bug未解决。
闲话少说,上图:
红圈是需要注意的地方,使用的是stlin SW模式。
需要添加以下代码:
struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f)
{
return ITM_SendChar(ch);
}
ITM_SendChar()是在core_m3.h中定义的,m4的芯片在core_m4.h,m7的板子懒得拿出来了。注意下我在f4discovery上试,不需要定义__FILE这个结构体也能跑,f103上不行,
看了下两个工程得stdio.h有些不同,其实都定义了__stdout,但f103工程上报未定义错误,可能我错过了啥。。。能跑就暂时没纠结这里了。
结果上图:
我的代码是这样的:<pre name="code" class="cpp">while(1) {
static int i = 0;
bsp_LedToggle(0);
printf("SB:%d
",i++);
printf("SB:%d
",i++);
printf("SB:%d
",i++);
__nop();
vTaskDelay(100);
}在freertos的一个进程上跑的,裸机试了也行。看着是不是好爽?开始我不是这样写的,开次如下:
<pre name="code" class="cpp">while(1) printf("sb:%d
", i++);
这么就出问题了,也是我开头说的bug,Debug view上无输入,但我安F10单步调试是又正常的输出的,我用ST-LINK Utility试也是正常的输出的。
这是什么鬼。。。。不上图以为我骗你。。好吧我姑且认为是MDK的问题了,不要全速的printf就好,全速printf的机会也比较少吧。。。
综上就3点:
1.设置trace;
2.定义fputc()函数;
3.不要全速执行printf() 。
