最近在研究菜单,发现没printf不太方便,然后就开始搞printf了。
搞了一晚上,还是没搞定printf输出浮点数,官方文档上明明说支持,但是一用就掉到Hardfauit里面去了。
要用printf,首先要创建一个叫做syscall.c的文件。其实叫什么不重要,重要的是里面要有那些函数。
我的是这样的,printf重定向到串口上
- #include "main.h"
- #include <stdio.h>
- #include <stdarg.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <stdarg.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;
- }
- void abort(void)
- {
- /* Abort called */
- while(1);
- }
-
- int _write(int file, char *ptr, int len)
- {
- uint16_t todo;
- for(todo = 0; todo < len; todo++)
- {
- USART_SendData(USART2, *ptr++);
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
- }
- return len;
- }
复制代码然后编译就行了
如果编译出错,检查libc.a和libgcc.a是否在链接的时候加进去了。
如果想要代码小点,可以加入选项--specs=nano.specs,编译器会使用newlib_nano库。
%s %d %x %o均可以正常显示。
fprint之类的由于涉及stdout等标准输入输出文件,因此需要fopen,fputc之类的桩函数。
一般图省事儿都是用不依赖桩函数的库函数,比如memcpy系列,snprintf等字符串操作系列,etc。
但是sprintf也不能输出浮点数,一用%f也会进入Hardfault中,不得其解。
一周热门 更多>