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