|
发表于 2009-4-12 20:27:47
|
显示全部楼层
FUSES =
{
.low = LFUSE_DEFAULT,
.high = (FUSE_BOOTSZ0 & FUSE_BOOTSZ1 & FUSE_EESAVE & FUSE_SPIEN & FUSE_JTAGEN),
.extended = EFUSE_DEFAULT,
};
不是用户真正的代码,都是伪指令,是给编译器。不是所有的AVR C编译器都支持。ELF是一个打包的文件。这就是我说的第一种情况。
说是伪指令并不准确。
这段代码确实是一段C语言代码,展开来就是:
typedef struct
{
unsigned char low;
unsigned char high;
unsigned char extended;
} __fuse_t;
__fuse_t __fuse __attribute__((section (".fuse"))) =
{
.low = LFUSE_DEFAULT,
.high = (FUSE_BOOTSZ0 & FUSE_BOOTSZ1 & FUSE_EESAVE & FUSE_SPIEN & FUSE_JTAGEN),
.extended = EFUSE_DEFAULT,
};
上面的代码是定义一个结构体变量,初始化,并存放到段".fuse"。
GCC是把fuse单独作为一个地址段。
比如说,定义一个eeprom变量,这个变量会存放到eeprom段。
定义一个flash变量,这个变量会存放到flash段,且不能改变。
定义fuse变量,会存放到fuse段,不能改变。
GCC编译后,生成ELF文件,包含所有段信息,包括FLASH,EEPROM,FUSE,LOCK等等,可以用命令把flash,eeprom提取出来,
生成hex文件。这就是我们通常用到的flash.hex,eeprom.hex。
生成的flash.hex,eeprom.hex可以对单片机编程。
实际上,fuse也可以生成hex文件。如果有软件支持hex格式的fuse,那么就可以像编程eeprom那样编程fuse。
不过目前好像没有软件支持hex格式的熔丝位。生成fuse.hex也没什么用处。
一般并不需要生成HEX,而是直接使用ELF文件。
ELF文件已经包含了所有段信息,一次编程就可以把FLASH,EEPROM,FUSE,LOCK全部写到单片机里。
LOCK也是一样。 |
|