[misc]如何在嵌入式平台使用printf功能

转自:http://www.cnblogs.com/liu_xf/archive/2011/04/14/2015726.html

摘要:

当我们在调试代码时,通常需要将程序中的某个变量打印至PC机上,来判断我们的程序是否按预期的运行,printf函数很好的做到了这一点,它能直接以字符的方式输出变量名和变量的值,这样使输出的信息很直观;但printf函数在使用时,不仅仅要初始化串口,还需要其它的一些设置或者要调用其它的一些函数,否则printf函数将不能按我们想要的方式执行。

由于不同的编译器studio函数不一样,所以使用的方法也不一样,这需要大家去看编译器的help,这里我以STM32、LPC24和AVR整理了几个串口打印程序,供需要的朋友参考。

简介:

1、在KEIL下使用printf函数,以STM32为例

在uart.c中添加如下代码

/*******************************************************************************
    函数名:fputc
    输  入:
    输  出:
    功能说明:
    重定义putc函数,这样可以使用printf函数从串口1打印输出
*/
int fputc(int ch, FILE *f)
{
    /* Place your implementation of fputc here */
    /* e.g. write a character to the USART */
    USART_SendData(USART1, (uint8_t) ch);

    /* Loop until the end of transmission */
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
    {}

    return ch;
}

/*******************************************************************************
    函数名:fputc
    输  入:
    输  出:
    功能说明:
    重定义getc函数,这样可以使用scanff函数从串口1输入数据
*/
int fgetc(FILE *f)
{
    /* 等待串口1输入数据 */
    while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
    {}

    return (int)USART_ReceiveData(USART1);
}

这样,只要在需要用printf的文件里#include <stdio.h>就可以了,printf会自已的调用fputc函数来实现串口数据的输出。

2、添加Retarget.c,实现在KEIL下使用printf函数,以LPC2478为例

首先在Keil安装目录下面ARM/Startup/Retarget.c找到Retarget.c文件将其复制到你的工程文件夹下面;并将其加入到工程中

在uart.c中添加如下代码

// Implementation of sendchar (also used by printf function to output data)
   int sendchar (int ch) {                 // Write character to Serial Port
   while (!(U0LSR & 0x20));
  return (U0THR = ch);
}
int getkey (void)  {                     // Read character from Serial Port
  while (!(U0LSR & 0x01));
  return (U0RBR);
}

这样,只要在需要用printf的文件里#include <stdio.h>就可以了,printf会通过Retarget中的fputc函数调用sendchar来实现串口数据的输出。

事实上,和第一种的方式是一样的。

3、自定义printf函数,以AVR为例

   前面介绍的是在KEIL编译器上使用printf函数,但不是所有的编译器平台都能适用,因此有时候我们需要自定义printf函数,下面以AVR在GCC下为例

在usart.c中添加如下代码

#include    <stdio.h>
#include    <stdarg.h>

/*********************************************************/
//向串口usart0发送一个字节函数
 void Uart0_putchar( unsigned char sdbyte)
 {
     UDR0=sdbyte;
     while(!(UCSR0A&0x40));
     UCSR0A|=0x40;
 }

//像串口发送一串数据,...表示函数实参不定
void Uart0_printf(char *str,...)
{
 char  buf[128];
 unsigned char i = 0;
 va_list ptr;
 va_start(ptr,str);
 vsprintf(buf,str,ptr);
 while(buf[i])
 {
     Uart0_putchar(buf[i]);
     i++;
 }
}

结语:

   有了printf格式化输出函数,调试起来就方便多了。

时间: 2024-12-29 10:02:55

[misc]如何在嵌入式平台使用printf功能的相关文章

嵌入式平台组件白盒测试gcov、lcov和genhtml 使用指导

在嵌入式平台上使用了gtest白盒测试工具,覆盖了被测函数,但是不知道自己测试的效果如何,测试行覆盖率.函数覆盖率,分支覆盖率的数据. 便开始研究gcov这个代码覆盖率工具能否使用,来检查白盒测试的效果,以及指引测试改进的方向.经过多次尝试和研究, 在嵌入式平台上可以使用gcov这个工具,不过操作稍微复杂点. 环境要求: 1.有被测组件的源代码 2.对应平台的交叉编译器必须包含gcov功能 3.安装好lcov工具 4.相应的嵌入式设备 使用gcov/lcov测试代码覆盖率,总共分为四步: 1.在

《ARM 嵌入式系统编程与优化》之 Linux/ARM 嵌入式平台

Linux/ARM 嵌入式平台是<ARM 嵌入式系统编程与优化>的第一章. 好好学学硬件,然后深入一下 Linux,修炼好自己的内功. ARM 处理器不是独立芯片产品,而是具有多样性和异质性嵌入式片上系统(SOC)的集成部件,是可以针对各种特定产品实现定制化的部件. 除了处理器内核外,典型的片上系统还包含: 一系列不同的存储接口(例如同步动态随机存储器.闪存等) 通信接口(USB.蓝牙.WiFi 等) 图形.视频专用处理器(例如图形处理单元,GPU) ARM 处理器包含了片上系统的“计算”部分

微信公众平台新增卡券功能 配合微信6.0卡包功能

今天早些时候,微信6.0发布更新,其中一个新增功能是微信卡包功能,如果商家没有发行电子打折卡.优惠券,那微信卡包就形同虚设了,微信公众平台新增卡券功能势在必行.傍晚获得的消息,公众平台发布新增卡券功能的公告,具体内容如下: 公众平台新增卡券功能 卡券功能,是公众平台向有投放卡券需求的公众号提供的推广.经营分析的整套解决方案,是“微信卡包”的重要组成部分,是连接商户与消费者的新渠道. 通过资质审核的商户,拥有卡券制作.管理.投放和数据分析的整套能力.目前支持的卡券类型有代金券.折扣券.礼品券.团购

00微信公众平台 - 以上五大功能整合,完整的代码。

一.代码实现如下(主程序代码,其他include代码见各个功能函数中) <?php /** * wechat php test * version 1 */ define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest(); $wechatObj->responseMsg(); //$wechatObj->valid(); class wechatCallbackapiTest

iTOP-4412开发板-嵌入式平台开机测试

iTOP-4412平台硬件的连接1.核心板和底板的连接 迅为iTOP-4412开发板采用工业级进口板对板连接器,拔插方便稳定可靠,如下图所示. 另外迅为独家提供两种封装的核心板,接口定义完全兼容,如下图所示. iTOP-4412开发平台,核心板和底板可分离.拆分核心板的时候,使用塑料的薄片在核心和底板任意一边轻轻撬动,听到清脆的响声,表明撬动的一边的连接器已经分离,接着依次分离其它三边. 安装核心板的时候,核心板和底板的箭头要指向同一方向,将核心板和底板对齐,然后按压核心板,听到四次清脆的响声,

QT嵌入式平台配置

Qt5 on ARM platforms - IntroductionQt5 ARM 平台移植#################################################### Introduction: This short post covers the background of Qt5, architec tural details, configuring for eglfs with Graphics drivers, building, and known i

微信公众平台的最新功能详细介绍与使用技巧!

近日微信官方发布消息,微信公众平台的操作进行了又一次"感天动地"的更新 且听我一一道来 本次主要重要改(Geng)革(Xin)凸显在三个地方 改(Geng)革(Xin)一:图文模版的收藏与使用 这,真的是一个超级实用的功能呀,那么如何使用呢?在哪里找呢? 首先告诉大家,如何收藏图文模板 选中编辑区的部分或者全部素材,然后点击添加模版,图文模板即可收藏成功: 当然,你还可以从外部进行粘贴和复制内容到图文模版. 那么,在哪里找到我收藏的模版呢?? 嗯,就在添加图文模版的旁边啦! 同时,你还

在Unity3D项目中接入ShareSDK实现安卓平台微信分享功能(可使用ShareSDK默认UI或自定义UI)

最近公司的大厅要重做,我协助主程一起制作新大厅和新框架,前面制作的编辑器也派上了用场.等全部功能做完后我会再写一个复盘,这两天主程在忙于写热更新的功能,所以把接入分享SDK功能的任务交给了我,ShareSDK官网的文档比较分散,而且关于Unity的文档比较简略,所以还是有不少的坑.写篇博客分享一下,并加强理解记忆. 第一步,先去ShareSDK的官网下载最新版本的ShareSDK(完全免费).地址:http://www.mob.com/ 我们选择ShareSDK For Unity3D,页面会直

微信公众平台原创声明功能公测 自媒体原创保护的福音

昨日晚间微信团队发布微信公众平台面向认证的媒体类型公众号公测原创声明功能的公告,势在维护作者权益,鼓励优质内容产生.心灵鸡汤.养生贴想必你已经厌倦了,甚至都不想关注公众号了(搜狗微信搜索 不用关注公众号就能在电脑查看图文消息),期待原创声明功能提高公众平台整体质量和用户的粘度. 如何申请公众平台原创声明? 原创者可在微信公众平台后台的“素材管理”处进入“图文消息”编辑,点击“申请原创声明”. 并填写提交原创声明的信息. 申请原创声明的文章在群发成功后,原创声明系统会对其进行智能比对,系统比对需要