搜索
bottom↓
回复: 21

【学习笔记】解放串口之重定向printf输出到IAR虚拟终端

[复制链接]

出0入0汤圆

发表于 2013-11-26 10:25:07 | 显示全部楼层 |阅读模式
本帖最后由 FSL_FAE_JiCheng 于 2013-11-26 10:26 编辑

    好长时间没更新了,这次再上点“硬菜”(咳咳,个人观点,反正我觉着挺硬的,呵呵)……

    通过串口打印调试信息或者实现上下位机交互是我们最常使用的调试手段之一,毕竟实现起来无论是硬件成本(接出两根线Txd和Rxd,外加一个电平转换芯片)还是软件成本(下位机写好UART驱动,上位机直接超级终端或者一些第三方串口调试助手)都是相对较低的,所以这种方式还是灰常受广大“攻城师”们欢迎的。不过如果由于I/O资源紧缺串口被用做其他用处或者板子直接没有引出串口的话(是不是产生共鸣了,呵呵),那该怎么办呢?

    当然,所谓时代不同了(liao)(我咋顺口想说“男女都一样呢”,呵呵,哎,都是生在旧社会长在红旗下的孩子啊),随着嵌入式开发生态系统越来越完善,目前也是有越来越多的Poweful开发工具支持丰富的调试功能(支持打印调试信息和交互等),但是涉及到一些版权的问题价格上还是有点小贵的(对一些小企业来说还是难以接受的),所以这个时候就需要我们动动脑筋去摸索摸索其他的方法(所谓路是探索出来的),事实证明破釜沉舟下人的潜力是无限的,呵呵,这里就分享一个折衷的办法去解决大家一直苦恼的问题,即使用IAR虚拟的串口终端来实现信息的交互和打印,下面进入正题:

测试平台:IAR6.6 + FRDM KE02开发板(我目前手里有就拿这个了,其他板子都可以放心用的,呵呵)
测试代码:KE驱动库(KEXX_DRIVERS_V1.0.1_DEVD\kexx_drv_lib_release_r1.0.1\build\iar\ke02\platinum)

这里稍微提一句,我测试的是KE驱动库的代码,但是实际上只要你看懂了我下面的解决方法(授之以渔而不是鱼),其他代码都是类似的。

1)打开KE02 platinum的IAR工程,进入到platinum.c文件,找到main函数如下图1,可以看到其调用了printf打印函数,而该工程是默认调用底层串口的,我们跳转到该函数的定义如图2,再继续跳转到out_char的函数定义如图3,这下就屡清楚了,我们可以很直观的看到工程默认是调用UART底层的,呵呵,下面我们就要动手改造它对printf进行重定向;



2)首先我们需要注释掉printf的实现函数,将其屏蔽掉,然后需要给printf一个重新指向的地址,下面就该我们常见的<stdio.h>这位老兄出场了(貌似当初自打我开始接触Turbo C的时候就已经用到它了,老生常谈的“Hello world”就是调用它内部的printf来实现的)。我们找到Common.h文件,将<stdio.h>添加到其中,如下图,这样凡是需要printf的文件只需要添加common.h头文件即可:



3)这里先说说stdio.h文件的作用,我们打开stdio.h文件可以看到其内部定义了标准输入输出函数,包括我们常见的scanf和printf等函数,而这些函数所调用的底层即为IAR提供的链接到其Terminal的驱动,所以……懂的,呵呵。除此之外,我们肯定不满足只输出打印(给人略显低端的赶脚有木有),所以为了体现我们不是“土豪”,我觉着有必要让它交互起来,实现真正的串口功能(因为一些类似bootloader之类的还是需要输入参数的),我在main函数添加了scanf语句用来测试输入功能,如下:



4)准备工作就绪,编译链接整个工程,然后下载到KE02的板子中并进入到Debug调试环境中,点击View->Terminal I/O调出虚拟终端,然后全步运行,就可以看到Terminal下开始打印调试信息,如下。当然显示输出有点小case了,我们再试试输入功能,在input框中输入‘a’,然后回车,如下图,perfect:




5)还没完,我们要玩就玩高端大气上点档次的,我们再探索探索呢,结果又发现个小惊喜,我们点击上图右下角的“Input Mode”,弹出设置框如下,很高端啊有木有:



呼,终于写完了,呵呵,看完之后是不是有种跃跃欲试的兴奋呢,哈哈,enjoy it~

附件为我修改好后的工程,仅供参考~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-11-26 10:38:23 | 显示全部楼层
不得不顶下,但是楼主忘了说明重要的一点:
-- SWO!

出0入0汤圆

发表于 2013-11-26 11:40:58 | 显示全部楼层

出0入0汤圆

发表于 2013-11-26 11:49:10 | 显示全部楼层
牛逼啊,可惜不用IAR

出0入0汤圆

发表于 2013-11-26 12:34:16 | 显示全部楼层
不错,是个好东西!!

出0入0汤圆

发表于 2013-11-26 14:05:57 | 显示全部楼层
学习一下。

出0入0汤圆

发表于 2013-11-26 14:23:13 | 显示全部楼层
不就是SWO么。。。残废调试器都没法用的。。。

出0入0汤圆

发表于 2013-11-26 21:55:05 | 显示全部楼层
不错 学习一下

出110入109汤圆

发表于 2013-11-26 22:24:40 | 显示全部楼层
这两天正要挖掘下IAR EW的串口交互,谢谢

出0入0汤圆

 楼主| 发表于 2013-11-26 22:41:37 | 显示全部楼层
本帖最后由 FSL_FAE_JiCheng 于 2013-11-26 22:51 编辑
sblpp 发表于 2013-11-26 10:38
不得不顶下,但是楼主忘了说明重要的一点:
-- SWO!


这个不是通过SWO实现的,呵呵~

出0入0汤圆

 楼主| 发表于 2013-11-26 22:42:25 | 显示全部楼层
本帖最后由 FSL_FAE_JiCheng 于 2013-11-26 22:51 编辑
error_dan 发表于 2013-11-26 14:23
不就是SWO么。。。残废调试器都没法用的。。。


本篇文章使用的方法不是用的SWO

出0入0汤圆

发表于 2013-11-28 13:42:50 | 显示全部楼层
跟那个KEIL下调试打印是不是一回事?
http://www.amobbs.com/thread-5516711-4-1.html

出0入0汤圆

 楼主| 发表于 2013-11-28 13:58:02 | 显示全部楼层
huangqi412 发表于 2013-11-28 13:42
跟那个KEIL下调试打印是不是一回事?
http://www.amobbs.com/thread-5516711-4-1.html

这个跟那个不一样,那个是使用SWO,这个是调用IAR系统自定义的printf

出0入0汤圆

发表于 2013-11-28 22:48:27 | 显示全部楼层
FSL_FAE_JiCheng 发表于 2013-11-26 22:42
本篇文章使用的方法不是用的SWO

请详细说一下,谢谢~

出0入0汤圆

发表于 2013-11-29 11:55:25 | 显示全部楼层
学习一下。

出0入0汤圆

发表于 2013-12-29 09:37:09 | 显示全部楼层
学习一下,加油。。

出0入0汤圆

发表于 2013-12-29 10:27:36 | 显示全部楼层

出0入0汤圆

发表于 2013-12-29 19:34:08 | 显示全部楼层
那是通过什么接口与MCU进行数据交互的??

出0入0汤圆

发表于 2014-8-10 08:18:06 | 显示全部楼层
你给的那个程序,便以完成之后,N多错误

出0入0汤圆

发表于 2014-11-20 22:44:49 | 显示全部楼层
顶一个,这个设置我找了好久,谢谢了

出0入0汤圆

发表于 2014-11-21 10:13:37 | 显示全部楼层
谢谢分享。省去串口了,不知道是不是需要swo支持?

出0入0汤圆

发表于 2015-2-25 13:08:55 | 显示全部楼层
iar还有这功能,学习了,试试去
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-22 08:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表