From: Eric Weddington: This sounds like a linker error. It would help if you could post the actual output from the toolchain.
OK Eric, here goes. I have shortened everything to make it more readable (and less boring). There are 10 sections of each type in fact. The result of 'Make' is: b...@tech42:~/Version 0.8> make avr-gcc -g -Wall -Os -mmcu=atmega644 -DF_CPU=20000000 -c -o main.o main.c tests.c:227: error: press_button causes a section type conflict make: *** [main.o] Error 1 b...@tech42:~/Version 0.8> Where the makefile contains: PRG = main OBJ = $(PRG).o MCU_TARGET = atmega644 OPTIMIZE = -Os F_CPU = 20000000 DEFS = -DF_CPU=$(F_CPU) LIBS = CC = avr-gcc CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS) LDFLAGS = -Wl,-Map,$(PRG).map \ -Wl,--section-start=.test0=0x2600 \ -Wl,--section-start=.testparms0=0x2e80 \ -Wl,--section-start=.test1=0x2f00 \ -Wl,--section-start=.testparms1=0x3780 \ -Wl,--section-start=.flashimage=0x8000 \ -Wl,--section-start=.bootloader=0xe000 \ -Wl,--section-start=.functions=0xff00 In "hardware.h" (included in main) the mapping of the sections: #define TESTIMAGE 0x2600 // Base address of test images #define TEST0_SECTION __attribute__((section (".test0"))) #define TEST1_SECTION __attribute__((section (".test1"))) #define TESTPARMS0_SECTION __attribute__((section (".testparms0"))) #define TESTPARMS1_SECTION __attribute__((section (".testparms1"))) #define FUNCTION_SECTION __attribute__((section (".functions"))) And in "tests.c" (inluded in main): /* ****************************************************************************** * Tester routine 1 ****************************************************************************** */ #undef CODESECTION #define CODESECTION TEST1_SECTION extern char press_button[]; extern char button_timeout[]; CODESECTION uint16_t test1(void) { ... test programme } CODESECTION char press_button[] = ">> Press UUT button <<"; //***** This one produces the error. // If the preceding function test1() is removed (only other object in this section), the error goes away. #undef PARMSECTION #define PARMSECTION TESTPARMS1_SECTION PARMSECTION uint16_t flash1 = 1024; // Bytes PARMSECTION uint16_t eep1 = 64; // Bytes PARMSECTION uint8_t sig1[] = {0x00, 0x00, 0x00}; // Test file PARMSECTION uint8_t fuse1[] = {0xfb, 0x13}; // Big-Endian PARMSECTION uint8_t np1 = 32; // Flash PARMSECTION uint8_t ps1 = 16; // In 16-bit words PARMSECTION uint8_t ts1 = 1; // Slot in NKP tester[0-9] PARMSECTION uint8_t tr1 = 1; // Routine in tester[0-9] PARMSECTION char pn1[] = "RKB Test V0.01 "; // Pad to exactly 24 chars //Local constants PARMSECTION char button_timeout[] = "******* Timeout ******* "; //***** This one works OK, but I have insufficient space here. So my conlusion is that the toolchain is treating a section containing a function as .text and refusing to place the string in it. When the section contains no function, then it is accepted. Hope this makes sense. Regards, Robert _______________________________________________ AVR-GCC-list mailing list AVR-GCC-list@nongnu.org http://lists.nongnu.org/mailman/listinfo/avr-gcc-list