|
###########FunChip整理测试修编写######## A:我要写BootLoader程序,MakeFile应该怎么改写? Q: 在BootLoader 的程序编写中,就会遇到这样的问题,需要把我们的程序放到BOOT 区,而AVR 的BOOT 区的地址都在片内Flash 的尾部,这时候就需要改动Makefile 的 LDFLAGS 选项,即连接器选项(Linker Options)。 在BootLoader 的程序中,一般而言,我们是将整个程序放到BOOT 区去,以Mega8 为例,编写的Bootoader 的时候,我们将片内Flash的后1K 空间作为BootLoader 空间, 起始地址为0x1C00,Makefile 的LDFLAGS 可以改成如下所示: LDFLAGS = -Wl,-Map=$(TARGET).map,--section-start=.text=0x1C00,--cref 当然,如果你愿意的话,可以定义一个常量,来定位程序空间,比如: #在此确定程序在Flash 中的存放地址 FLASHADDR = 0x1C00 这个时候,LDFLAGS 将要改成如下: --section-start=.text=$(FLASHADDR)
在写一般应用的时候,将FLASHADDR 改成0x0000,而在写BootLoader 的时候改成0x1C00 即可 A:我如果要将一个函数放在特定的Flash地址,该然后操作? Q: 有时候,你如果需要把一些数据或者把某个函数定义到特定空间,这时候,仍然要 借助LDFLAGS 的帮助。一个简单的例子: #include <avr/io.h> #include <avr/pgmspace.h> #define LDFLAGSTEST __attribute__ ((section (".ldflagstest"))) #define LDFLAGSDATA __attribute__ ((section (".ldflagsdata"))) const unsigned char TDAT[2] LDFLAGSDATA = {0xcd, 0xce}; void LDFLAGSTEST test(void) { asm("nop"); } void main(void) { while(1); } MakeFile 的LDFLAGS 这样写: LDFLAGS = -Wl,-Map=$(TARGET).map,--section-start=.ldflagstest=0x0C00,--cref 首先make clean 清除先前的编译结果,然后重新make all,结果如下: Size after: test.elf : section size addr .ldflagstest 4 3072 .text 102 0 .data 0 8388704 .bss 0 8388704 .noinit 0 8388704 .eeprom 0 8454144 .ldflagsdata 2 102 Total 108 Test 函数被放到了3072(0x0C00)地址上,而TDAT 则被放到.text的尾端.
|