On Tue, Apr 23, 2013 at 12:36:30PM -0700, Eastman Hackney wrote: > > > I'm stumped & some help would be GREATLY appreciated. Weening myself from > Windows and AVR Studio (after realizing that it uses avr-gcc!). I apologize if > this posting is verbose - but I wanted to be thorough. > > > Using avr-gcc version 4.3.4 (obtained with 'apt-get install gcc-avr avr-libc > avrdude' ...). > > > Compiling and linking with commands copied from the avr-libc user manual: > > avr-gcc -c -gstabs -g -O0 -mmcu=avr5 -mmcu=atmega644p main.c > avr-gcc -mmcu=avr5 -mmcu=atmega644pa -o main.elf main.o -lm > avr-objdump -D -h -S main.elf > main.lst > avr-gcc -g -mmcu=avr5 -mmcu=atmega644pa -Wl,-Map,main.map -o main.elf main.o > avr-objcopy -j .text -j .data -O ihex main.elf main.hex > sudo avrdude -P usb -p m644 -c jtagmkII -e -U flash:w:main.hex:a
Can you drop the -mmcu=avr5 and try? I don't have a copy of 4.3.4 right now, but atleast the last few versions of the compiler (avr-gcc 4.6.2 and above) know what arch the mcu belongs to, and the driver automatically passes that on to the assembler/linker - you don't have to specify that explicitly. On the latest toolchain, I see the correct behavior if I drop the mmcu=avr5 i.e. > 20 entries in the vector table, and the behavior you describe if the option is present. Explicitly specifying -mmcu=avr5 when linking results in the following command line to the linker. /home/saaadhu/avr/install/libexec/gcc/avr/4.9.0/collect2 -m avr5 /home/saaadhu/avr/install/lib/gcc/avr/4.9.0/../../../../avr/lib/avr5/crtm16.o -L/home/saaadhu/avr/install/lib/gcc/avr/4.9.0/avr5 -L/home/saaadhu/avr/install/lib/gcc/avr/4.9.0/../../../../avr/lib/avr5 -L/home/saaadhu/avr/install/lib/gcc/avr/4.9.0 -L/home/saaadhu/avr/install/lib/gcc/avr/4.9.0/../../../../avr/lib /tmp/ccCrT1hV.o --start-group -lgcc -lm -lc --end-group Notice that it is linking against crtm16.o, which I guess is the "canonical" avr5 device according to libc, and the vector table is of course for that device. If you still see the same behavior after removing -mmcu=avr5 (atleast when linking), can you add -v and -Wl,--verbose and show us the output? Regards Senthil > > When flash is loaded, the code runs fine, including a Timer0 ISR. But if I > enable the UART1 > TXCIE1 interrupt flag (Atmega644 has two Uarts), the USART1_UDRE_vect does > not seem > > to show up in the interrupt Vector Table. > > > Looking at the compiler-generated code in main.lst shows only 21 vectors > (Atmega644 datasheet > lists 31 vectors), and does not include a vector for USART1_UDRE_vect. The > listed vectors seem > > correct for the Atmega644, but why won't it include vectors greater than > vector_20, and specifically > the one for USART1_UDRE_vect? > > Listing of main.lst: > > Disassembly of section .text: > > 00000000 <__vectors>: > 0: 0c 94 2a 00 jmp 0x54 ; 0x54 <__ctors_end> > 4: 0c 94 60 03 jmp 0x6c0 ; 0x6c0 <__vector_1> > 8: 0c 94 61 03 jmp 0x6c2 ; 0x6c2 <__vector_2> > c: 0c 94 62 03 jmp 0x6c4 ; 0x6c4 <__vector_3> > 10: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt> > 14: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt> > 18: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt> > 1c: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt> > 20: 0c 94 63 03 jmp 0x6c6 ; 0x6c6 <__vector_8> > 24: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt> > 28: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt> > 2c: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt> > 30: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt> > 34: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt> > 38: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt> > 3c: 0c 94 67 03 jmp 0x6ce ; 0x6ce <__vector_15> > 40: 0c 94 7e 02 jmp 0x4fc ; 0x4fc <__vector_16> > 44: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt> > 48: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt> > 4c: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt> > 50: 0c 94 64 03 jmp 0x6c8 ; 0x6c8 <__vector_20> > > 00000054 <__ctors_end>: > 54: 11 24 eor r1, r1 > > The C source code for the USART1_UDRE_vect is: > > ISR(USART1_UDRE_vect, ISR_NAKED) > { > uc cSREG; > > cSREG = SREG; > if (U1_tx_count > 0) > { > UDR1 = U1_tx_fifo[U1_tx_optr]; > U1_tx_optr++; > if (U1_tx_optr >= TX_FIFO_SIZ) > U1_tx_optr = 0; > U1_tx_count--; > } > else > UCSR1B &= ~(1 << UDRIE1); > SREG = cSREG; > reti(); > } > > > Thanks for considering this. East Hackney > _______________________________________________ > AVR-GCC-list mailing list > AVR-GCC-list@nongnu.org > https://lists.nongnu.org/mailman/listinfo/avr-gcc-list _______________________________________________ AVR-GCC-list mailing list AVR-GCC-list@nongnu.org https://lists.nongnu.org/mailman/listinfo/avr-gcc-list