21ic电子技术开发论坛 单片机与嵌入式系统 ARM技术论坛 CoIDE 1.6.2下使用ARM GCC 4.7 Newlib-nano printf 重定向到UART
发新帖我要提问
返回列表
打印

CoIDE 1.6.2下使用ARM GCC 4.7 Newlib-nano printf 重定向到UART

[复制链接]
4565|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
赛德克巴莱|  楼主 | 2012-12-29 16:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 赛德克巴莱 于 2012-12-29 16:45 编辑

从别人那里转得哦,很好很强大,共同学习yi
下载安装CoIDE1.6.2: coocox.org/Tools/CoIDE-1.6.2.exe

并用附件中的文件(下载后先解压),替换CoIDE安装目录下/plugins/org.coocox.builder.ui_1.0.0.201212141638.jar

org.coocox.builder.ui_1.0.0.201212141638.zip (912.97 KB)

下载 GNU Tools for ARM Embedded Processors  Version: 4.7
下载地址是:
launchpad.net/gcc-arm-embedded/+milestone/4.7-2012-q4-major 地址前面加上 h t t p s : / / 哦
CoIDE中设置工具链,这里不详细说明

这里以Cookie板子为例,说明CoIDE下 Newlib-nano printf 重定向到UART过程,一共分为三步
1.新建工程,并添加printf语句
2.选择Newlib-nano,支持打印浮点数
3.重定向printf

1.新建工程,并添加printf语句


新建一个M051的工程,如何新建工程这里不详细说明
勾选如下组件



在UART组件中添加cookie_printf例子到工程


打开cookie_printf.c文件,添加 #include <stdio.h>这个头文件
并在while(1)循环中加上
        printf("Nano Clib test:int=%d   float=%f\r\n",255,123.456);

2.选择Newlib-nano,支持打印浮点数




点击配置按钮进入配置:


进入link标签页
在Linked Library中添加
D:\Program Files\GNU Tools ARM Embedded\4.7 2012q4\arm-none-eabi\lib\armv6-m\libc_s.a
D:\Program Files\GNU Tools ARM Embedded\4.7 2012q4\arm-none-eabi\lib\armv6-m\libg_s.a


注意:用于Cookie是M0的芯片所以选armv6-m下面的库,如果使用M3则选armv7-m,M4则选armv7e-m
ARM Core multilib
Cortex-M0+armv6-m
Cortex-M0armv6-m
Cortex-M1armv6-m
Cortex-M3armv7-m
Cortex-M4 armv7e-m





如果需要支持浮点数打印,则在Misc Consle中添加 -u;_printf_float;(注意,标准命令是 -u _printf_float,CoIDE的原因,不得已而为之)



3.重定向printf


打开syscalls.c,编写如下代码

/**************************************************************************//*****
* @file     stdio.c
* @brief    Implementation of newlib syscall
********************************************************************************/

#include <stdio.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdarg.h>

#include "xhw_types.h"
#include "xhw_ints.h"
#include "xhw_memmap.h"
#include "xuart.h"

#undef errno
extern int errno;
extern int  _end;

caddr_t _sbrk ( int incr )
{
  static unsigned char *heap = NULL;
  unsigned char *prev_heap;

  if (heap == NULL) {
    heap = (unsigned char *)&_end;
  }
  prev_heap = heap;

  heap += incr;

  return (caddr_t) prev_heap;
}

int link(char *old, char *new) {
return -1;
}

int _close(int file)
{
  return -1;
}

int _fstat(int file, struct stat *st)
{
  st->st_mode = S_IFCHR;
  return 0;
}

int _isatty(int file)
{
  return 1;
}

int _lseek(int file, int ptr, int dir)
{
  return 0;
}

int _read(int file, char *ptr, int len)
{
  return 0;
}

int _write(int file, char *ptr, int len) {
        int txCount;

        (void) file;

        for (txCount = 0; txCount < len; txCount++)
        {
                xUARTCharPut(xUART0_BASE,*ptr++);
        }

        return len;
}

void abort(void)
{
  /* Abort called */
  while(1);
}

/* --------------------------------- End Of File ------------------------------ */


用ColinkEx下载就可以看到串口打印了。



Newlib-nano 的好处,看看size就知道
不使用浮点数:


使用浮点数


相关帖子

沙发
Chocore| | 2013-1-4 09:11 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

2

帖子

0

粉丝
关闭 热门推荐
快速回复 在线客服 返回列表 返回顶部