|
楼主 |
发表于 2009-9-19 16:44:18
|
显示全部楼层
顶!谢谢邵先生!
另外我试图启用AES加密,在Linker Options里添加了-nostartfiles,的确,代码空间节省了96byte。
优化选项设置最高级别“-0s”.
#define VERBOSE 0
#define CRCMODE 1
#define LED_En 0
做了以上事情代码量的确又减少了,但还是很难压缩在2Kbyte以内?
c:/winavr-20071221/bin/../lib/gcc/avr/4.2.2/../../../../avr/bin/ld.exe: address 0x2006 of Bootldr.elf section .text is not within region text
奇怪的是定义noIVT为1后代码量反而增加了8byte???
c:/winavr-20071221/bin/../lib/gcc/avr/4.2.2/../../../../avr/bin/ld.exe: address 0x200a of Bootldr.elf section .text is not within region text
分析一下:邵先生说去掉中断向量表减少的代码量,似乎不是这样?减少代码量的真正原因应该是在连接时设置了“-nostartfiles”查了一下“-nostartfiles”含义是:“ 当linking时,不使用标准的启动文件。但是通常是使用的。”
这里需要邵先生批判一下?
而且我希望用CRC16校验且不想删掉LED指示功能
换句话说,AES加密算法目前在BOOT区小于2Kbyte的单片机上基本用不了(mega8),不知邵先生试过用AES时将代码调试至2Kbyte以内吗?
用PC1_128是可以的,代码量少了很多,呵呵!
对于设置起始FLASH地址的问题,打开AVRstudio的project options帮助,找到了下列这段文字“The address must be given as a hexadecimal number prefixed with 0x. It is interpreted as a word address for flash memory and as byte addresses for sram and eeprom memory.”
这段文字
肯定了对FLASH操作是按“word”计算的,对SRAM和eeprom的操作是按“byte ”计算的。
另一方面打开default文件夹下的makefile看到:
## Linker flags
LDFLAGS = $(COMMON)
LDFLAGS += -nostartfiles -Wl,-Map=Bootldr.map
LDFLAGS += -Wl,-section-start=.text=0x1800
的确,-nostartfiles 在这里被添加进来了
而且显示FLASH的起始地址为0x1800。在makefile里对FLASH的计算是按byte的。这和project options里的说明矛盾了,就是“它”混淆了我们的视听。我觉得,既然我们使用AVRstudio,而且要在它的环境下编程,就完全按它的“规矩”来,这样自然不会错。事实证明也是这样,把BOOT首地址设为0xc00,就正确跳转了。至于makefile里的0x1800是给GCC编译器看的,既然我们选择在project options里配置让它自动生成makefile,那就完全相信project options吧,不要被它生成的makefile干扰了。看到很多网友也困扰于什么时候乘2什么时候不乘,不知道是不是这个原因。欢迎指正 |
|