I compile the following program with

avr-gcc -mmcu=atmega8515 -o rjmp-test rjmp-test.c

program:

const char dummy[7000] __attribute__((__progmem__));
int main() {}

-----

Error:
The atmega8515 has 8Kb of flash memory. So gcc should not use
the rjmp/rcall instructions since they can only access 2Kb.
But avr-objdump shows this:

Disassembly of section .text:

00000000 <__vectors>:
       0:       bc cd           rjmp    .-1160          ; 0xfffffb7a
<__eeprom_e
       2:       d5 cd           rjmp    .-1110          ; 0xfffffbae
<__eeprom_e
       4:       d4 cd           rjmp    .-1112          ; 0xfffffbae
<__eeprom_e
       6:       d3 cd           rjmp    .-1114          ; 0xfffffbae
<__eeprom_e
       8:       d2 cd           rjmp    .-1116          ; 0xfffffbae
<__eeprom_e
       a:       d1 cd           rjmp    .-1118          ; 0xfffffbae
<__eeprom_e
       c:       d0 cd           rjmp    .-1120          ; 0xfffffbae
<__eeprom_e
...

Discussion:
All interrupt handlers are situated behind the 7000 byte array. Therefore
the jumps of the interrupt vectors have to span at least 7000 bytes.
That is not possible with the rjmp instruction which can span at most 2Kb.
This results in the strange negative offsets.

Solution:
Jumps which span more than 2Kb have to be encoded using "jmp" not "rjmp".


-- 
           Summary: use of rjmp on devices with more than 2kb flash
           Product: gcc
           Version: 4.0.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: hochstein at algo dot informatik dot tu-darmstadt dot de
 GCC build triplet: i686-pc-linux
  GCC host triplet: avr
GCC target triplet: avr


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26664

Reply via email to