数码小叶 发表于 2021-4-22 14:57

两种都不太顺利的printf方式

本帖最后由 数码小叶 于 2021-4-22 14:29 编辑

<p><span style="font-size:20px;">RSL10的pack为应用程序提供了两种方式来实现printf调试,一种是通过串口,一种是通过SEGGER RTT。本以为这会很便利,结果却是很尴尬<img height="28" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/face-with-cold-sweat_1f613.png" width="28" /><img height="28" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/face-with-cold-sweat_1f613.png" width="28" />,两种方式体验下来都不太顺利。</span></p>

<p>&nbsp;</p>

<p><span style="font-size:20px;">关于两种方式怎么切换,RSL10 GETTING STARTED GUIDE.PDF里介绍的和现在这个版本的pack有点出入,这个版本的直接更改printf.h里的宏定义即可</span></p>

<p>&nbsp;</p>

<p><span style="font-size:20px;">以最基础的blink工程测试,首先说一下UART方式,修改宏定义如下</span></p>

<pre>
<code>#define OUTPUT_UART                  1
#ifndef OUTPUT_INTERFACE
       #define OUTPUT_INTERFACE         OUTPUT_UART
#endif</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:20px;">然后就可以实现打印输出了</span></p>

<p></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><span style="font-size:20px;">但是很快发现这个方式有个bug,不能全速运行,一但全速运行,就会一直运行在int UART_printf(const int narg, const char *sFormat, ...)函数</span></p>

<pre>
<code>/* Check until the DMA is not busy */
    while (tx_busy == 1)
    {
      Sys_Watchdog_Refresh();
    }</code></pre>

<p><span style="font-size:20px;">虽然程序没死,但是已经跳不出这个死循环了。</span></p>

<p>&nbsp;</p>

<p><span style="font-size:20px;">第二种方式,SEGGER RTT,先修改宏定义</span></p>

<pre>
<code>#define OUTPUT_RTT                     1
#ifndef OUTPUT_INTERFACE
      #define OUTPUT_INTERFACE         OUTPUT_RTT
#endif</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:20px;">打印功能也是正常实现</span></p>

<p></p>

<p>&nbsp;</p>

<p><span style="font-size:20px;">这次全速运行没问题,但是,不能暂停了!!!一暂停就是下面这个结果<img height="28" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/dizzy-face_1f635.png" width="28" /><img height="28" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/dizzy-face_1f635.png" width="28" /></span></p>

<p></p>

<p></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

火辣西米秀 发表于 2021-4-22 15:57

<p>第二种方法SEGGER RTT看着简单,不能暂停还是程序那里有问题</p>

蓝雨夜 发表于 2021-4-22 16:08

<p>KEIL的这几个文件是只读</p>

<p>你在KEIL编译器里C宏定义呢?</p>

<p></p>

蓝雨夜 发表于 2021-4-22 16:26

<p>我知道原因了!</p>

<p>blink项目里使用了按钮</p>

<p>该按钮是DIO5</p>

<p></p>

<p>可UART打印使用DIO4和DIO5</p>

<p></p>

蓝雨夜 发表于 2021-4-22 16:33

<p>#define BUTTON_DIO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;7</p>

<p>好像全速运行UART有连续</p>

<p>LED OFF<br />
LED ON<br />
LED OFF<br />
LED ON<br />
LED OFF<br />
LED ON<br />
LED OFF<br />
LED ON<br />
LED OFF<br />
LED ON<br />
LED OFF<br />
LED ON<br />
LED OFF...................</p>

数码小叶 发表于 2021-4-22 16:40

蓝雨夜 发表于 2021-4-22 16:26
我知道原因了!

blink项目里使用了按钮

该按钮是DIO5



可UART打印使用DIO4和DIO5

<p>感谢,感谢<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/congra.gif" width="48" />,解决了我一个大困惑,真的是因为这个原因造成的。为啥把按键设计到串口管脚</p>

蓝雨夜 发表于 2021-4-22 16:41

数码小叶 发表于 2021-4-22 16:40
感谢,感谢,解决了我一个大困惑,真的是因为这个原因造成的。为啥把按键设计到串口管脚

<p>RSL10管脚很紧张啊!</p>

<p>呵呵</p>

数码小叶 发表于 2021-4-22 16:42

蓝雨夜 发表于 2021-4-22 16:08
KEIL的这几个文件是只读

你在KEIL编译器里C宏定义呢?

<p>用的自带的那个软件ON_Semiconductor_IDE,没用KEIL</p>

蓝雨夜 发表于 2021-4-22 16:47

数码小叶 发表于 2021-4-22 16:42
用的自带的那个软件ON_Semiconductor_IDE,没用KEIL

<p>那个IDE也不错<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/smile.gif" width="48" /></p>

数码小叶 发表于 2021-4-22 17:00

蓝雨夜 发表于 2021-4-22 16:41
RSL10管脚很紧张啊!

呵呵

<p>感觉在哪加个延时应该可以解决这个复用造成的bug,因为单步是OK的,晚上再试试</p>

freebsder 发表于 2021-4-22 17:15

<p>RTT很方便,我现在基本能上RTT就不上调试串口了。</p>

dql2016 发表于 2021-4-22 21:22

<p>RTT对硬件管脚需求是啥?貌似像stm32有个swo</p>

数码小叶 发表于 2021-4-22 22:00

freebsder 发表于 2021-4-22 17:15
RTT很方便,我现在基本能上RTT就不上调试串口了。

<p>RTT确实比串口花样多,应该是ON_Semiconductor_IDE,这个IDE不太友好</p>

数码小叶 发表于 2021-4-22 22:06

dql2016 发表于 2021-4-22 21:22
RTT对硬件管脚需求是啥?貌似像stm32有个swo

<p>JLINK这个工具太强大了,涵盖的芯片太广,自然包含了stm32</p>

dql2016 发表于 2021-4-23 11:33

数码小叶 发表于 2021-4-22 22:06
JLINK这个工具太强大了,涵盖的芯片太广,自然包含了stm32

<p>我是问RTT需要哪几个管脚,我记得Stm32的swo可以输出调试信息</p>

数码小叶 发表于 2021-4-23 13:32

dql2016 发表于 2021-4-23 11:33
我是问RTT需要哪几个管脚,我记得Stm32的swo可以输出调试信息

<p>标准的JTAG或者SWD接口就行啊,RTT方式的话一般简化都是SWD,针对STM32就是VCC,SWDIO,SWCLK,GND。ITM方式的话需要加一个你说的swo</p>
页: [1]
查看完整版本: 两种都不太顺利的printf方式