ARM newlib使用中遇到的问题
Newlib
是ANSI
C库的一个实现,是一个更加精简和易于移植的版本,我在移植Newlib
到CM4
上的时候遇到了一个比较奇怪的问题,串口上的getchar
工作不正常。
对Newlib
的移植比较简单的就是实现一些syscalls
函数就可以了,比较重要的是以下几个函数:
int _close(int file);
int _isatty(int file);
int _open(const char *name, int flags, int mode);
int _fstat(int file, struct stat *st);
int _write(int file, char *p, int len);
int _read(int file, char *p, int len);
static char *heap_end = (char *) __heap_start;
char *_sbrk(int incr);
int _kill(int pid, int sig);
上面很多函数一般都可以直接返回0或1或-1等等就可以了,和串口相关的函数是_write
和_read
,不过移植完成运行的时候printf
可以正常工作,但是运行getchar
的时候系统会锁住,跟踪调试发现到_read
函数的参数len
是1024,而不是我期望的1,我怎么可以串口一直按1024次呀,呜呜~~~
后来找了一大圈发现newlib
里面stdin
是一个文件,而这个文件是有一个1024长度的buffer的,所以没有读满这个buffer
是不会返回的,也就会一直在循环中等待,直到1024个字符读满,这个丧心病狂的设计,当然在真正系统设计中还是很有效率的。找到问题的根源就好办了,解决方法就是直接将这个buffer
设置为0就好啦,设置方法如下:
setvbuf(stdin, NULL, _IONBF, 0);
运行了上面的设置之后,系统运行正常,getchar
和putchar
运行都正常。
其实适配newlib
虽然有点小麻烦,不过后面可以不ASNC C
兼容,还是有一定的好处的,也可以降低后期的开发成本。
最后更新于 2018-06-28 01:46:14 并被添加「」标签,已有 2358 位童鞋阅读过。
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。