arm-none-eabi-gcc中的printf重定向

2019-12-17 21:30发布

最近在研究菜单,发现没printf不太方便,然后就开始搞printf了。

搞了一晚上,还是没搞定printf输出浮点数,官方文档上明明说支持,但是一用就掉到Hardfauit里面去了。

要用printf,首先要创建一个叫做syscall.c的文件。其实叫什么不重要,重要的是里面要有那些函数。
我的是这样的,printf重定向到串口上
  1. #include "main.h"


  2. #include <stdio.h>
  3. #include <stdarg.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <stdarg.h>


  7. #undef errno
  8. extern int errno;
  9. extern int  _end;

  10. caddr_t _sbrk ( int incr )
  11. {
  12.   static unsigned char *heap = NULL;
  13.   unsigned char *prev_heap;

  14.   if (heap == NULL) {
  15.     heap = (unsigned char *)&_end;
  16.   }
  17.   prev_heap = heap;

  18.   heap += incr;

  19.   return (caddr_t) prev_heap;
  20. }

  21. int link(char *old, char *new) {
  22. return -1;
  23. }

  24. int _close(int file)
  25. {
  26.   return -1;
  27. }

  28. int _fstat(int file, struct stat *st)
  29. {
  30.   st->st_mode = S_IFCHR;
  31.   return 0;
  32. }

  33. int _isatty(int file)
  34. {
  35.   return 1;
  36. }

  37. int _lseek(int file, int ptr, int dir)
  38. {
  39.   return 0;
  40. }

  41. int _read(int file, char *ptr, int len)
  42. {
  43.   return 0;
  44. }

  45. void abort(void)
  46. {
  47.   /* Abort called */
  48.   while(1);
  49. }
  50.          
  51. int _write(int file, char *ptr, int len)
  52. {
  53.         uint16_t todo;   
  54.         for(todo = 0; todo < len; todo++)
  55.         {
  56.                 USART_SendData(USART2, *ptr++);
  57.                 while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
  58.         }

  59.         return len;
  60. }
复制代码然后编译就行了

如果编译出错,检查libc.a和libgcc.a是否在链接的时候加进去了。
如果想要代码小点,可以加入选项--specs=nano.specs,编译器会使用newlib_nano库。

%s %d  %x %o均可以正常显示。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
dr2001
1楼-- · 2019-12-17 21:54
一般标准C库都存在桩函数的概念,在手册会提到。一组libc的函数,依赖于有限的桩函数;实现了对应的桩函数就能用对应的功能。
fprint之类的由于涉及stdout等标准输入输出文件,因此需要fopen,fputc之类的桩函数。

一般图省事儿都是用不依赖桩函数的库函数,比如memcpy系列,snprintf等字符串操作系列,etc。
笑笑我笑了
2楼-- · 2019-12-17 22:53
dr2001 发表于 2013-8-3 07:19
一般标准C库都存在桩函数的概念,在手册会提到。一组libc的函数,依赖于有限的桩函数;实现了对应的桩函数 ...

但是sprintf也不能输出浮点数,一用%f也会进入Hardfault中,不得其解。
micyoco
3楼-- · 2019-12-17 23:56
 精彩回答 2  元偷偷看……

一周热门 更多>