On Thu, Apr 29, 2010 at 07:31:55AM -0700, Dave Hylands wrote: > On Thu, Apr 29, 2010 at 6:18 AM, Erik Christiansen wrote:
Incidentally, that was "23:18:32 +1000" at my keyboard. At 6:18 AM, it would have been well past my bedtime. Your MUA is converting to UTC? > > But the .eeprom output section specifies an LMA coincident with > > __data_load_end. To be safe, I'd place something like the following > > after the end of the .eeprom output section in the linker script: > > > > __vacant_flash = __data_load_end + SIZEOF(.eeprom); > > > > or with same effect: > > > > __vacant_flash = LOADADDR(.eeprom) + SIZEOF(.eeprom); > > Why include the .eeprom section? This is an image of what's to be > included in the EEPROM and normally isn't written to the flash. Well, while it's there mostly for tools like avrdude, we can load .eeprom to flash, to provide a run-time "Restore Defaults" option. I've just done an "objdump -h" on my nearest avr object file, and there's no "ALLOC, LOAD" for .eeprom, so it's not loaded to flash by default, and that executable would be OK without the suggested protection. However, the linker script does have: ******* .eeprom : AT (ADDR (.text) + SIZEOF (.text) + SIZEOF (.data)) { which _does_ set a load address of the first free flash byte. The trap is set. Anyone choosing to alter the section's "ALLOC, LOAD" status, to store EEPROM default values in flash, _will_ need something like my suggestion, because __data_load_end won't cut it any more. > I guess you could use it as a "default", so whether you include it or > not in the vacant_flash calculaton should depend on whether you > include it in the .hex file to you use to load to flash. Yes, the original protection will leave SIZEOF(.eeprom) flash bytes unused, if .eeprom is not deliberately loaded to flash. Since objcopy can change section flags after compilation, there would be no merit in modifying the vacant_flash calculaton on whether .eeprom is loadable at that time, even if a mechanism existed. However, we can do this in the linker script: __vacant_flash = DEFINED (__eeprom_in_flash) ? __data_load_end + SIZEOF(.eeprom) : __data_load_end ; /* ld should't care whether it's one line or wrapped. */ Now there will by default be no wasted flash bytes, because __vacant_flash = __data_load_end , but when we use on the commandline: ld --defsym __eeprom_in_flash=1 # Or in gcc-friendly syntax: avr-gcc ... -D eeprom_in_flash then our linker script will obediently shuffle __vacant_flash up to make room for .eeprom. Will that do? Erik -- If at first you don't succeed, try again. Then Quit. No use being a damn fool about it. - W.C. Fields _______________________________________________ AVR-GCC-list mailing list AVR-GCC-list@nongnu.org http://lists.nongnu.org/mailman/listinfo/avr-gcc-list