1、AV R单片机GCC程序设计补充文档 (003) http:/ 关于WinAVR-20060421中的标准输入输出 WinAVR20060421对标准输入输出对象连接设备的形势进行了改进,导致本书中多个例子在WinAVR20060421中无法编译。下面先解释新版本中标准输入输出的使用方法。 先看avr-libc使用手册提供的例子: #include static int uart_putchar(char c, FILE *stream); static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRIT
2、E); static int uart_putchar(char c, FILE *stream) if (c = n) uart_putchar(r, stream); loop_until_bit_is_set(UCSRA, UDRE); UDR = c; return 0; int main(void) init_uart(); stdout = printf(“Hello, world!n“); return 0; 在默认情况下,fdevopen 以及浮点数转换的printf和scanf都需要动态内存分配(malloc),这将连接动态内存分配模块,导致代码膨胀,如果系统中不使用浮点数转
3、换,通过使用上面的方法连接设备可以避免连接动态内存分配模块,这对于资源有限的单片机系统是难得的。 替代fdevopen函数的是宏FDEV_SETUP_STREAM ,它将初始化一个标准的i/o对象(上例中为mystdout),由于这个对象是用户定义的变量,固然无需动态分配内存。FILE是标准I/O流使用的数据结构,stdin,stdout,stderr均为指向FILE结构的指针。正如上面的main函数中那样标准流对象stdout 指向用户定义的流对象数据结构后printf可以正常使用了。此时不能用fclose关闭,如果需要关闭的话使用fdev_close。 关于宏FDEV_SETUP_STRE
4、AM和相关参数说明请参考avr-libc用户手册。下面是书中相关示例的三种处理方法: 1. 使用WinAVR20060421之前版本编译。 2. 包含stdio.h文件之前定义宏 _STDIO_FDEVOPEN_COMPAT_12 如: #define _STDIO_FDEVOPEN_COMPAT_12 #include 。 这一种方法与前一种方法效果是一样的。意思是该宏的意思是兼容avr-libc1.2版本。 3修改代码使用新的方法连接设备. AV R单片机GCC程序设计补充文档 (003) http:/ 第一步:在全局声明FILE变量并用宏FDEV_SETUP_STREAM初始化 static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); 第二步:改变uart_putchar函数参数列表 int uart_putchar(char c, FILE *stream) 第三步:用stdout = 替换fdevopen的调用。 第三种方法(也是建议在新程序中使用的)它生成的代码量会比前两种方法生成的会更小。 时间仓促就写到这里了,如有错误之处请到本书网站留言指正!谢谢。 版权所有 芯艺设计室 保留所有权利 Copyright All Rights Reserved