avr-gcc doesn't know address space wraps?

Georg-Johann Lay avr@gjlay.de
Sun Jan 3 17:22:00 GMT 2016


Ralph Doncaster schrieb:
> avr-gcc 4.9.2 doesn't seem to know that the address space wraps, so
> that an rjmp in the last 2KB of the address space can reach code in
> the first 2KB.  The following code works fine with a jmp, but if I
> change the jmp ResetVector to rjmp, I get:
> (.bootloader+0x4): relocation truncated to fit: R_AVR_13_PCREL against
> `no symbol'
> 
> I'm compiling with:
> avr-gcc -mmcu=atmega328p -nostartfiles
> -Wl,-section-start=.bootloader=0x7E00   picobootSTK500.S   -o
> picobootSTK500

I don't quite get what your question has to do with the compiler proper. 
   As you are programming in assembly, the only thing that avr-gcc does 
is calling the assembler and the linker for you.

> .text
> ; this will be address 0x0000 which is the reset vector
> ; user application will over-write blink code
> ; dimly lights LED (using internal pullup) with a 1.5 s cycle time
> ResetVector:
> Blink:
>     sbi PINB, LEDPIN
>     ldi ZH, 60
> DelayLoop:
>     ; 11.8M cycles =~ .74s @ 16Mhz
>     rcall Delay3Cycle               ; 256 * 3 cycles
>     sbiw ZL, 1
>     brne DelayLoop
>     rjmp Blink
> 
> ; delay 3 cycles * r24 + 4 cycles (ret instruction)
> Delay3Cycle:
>     dec r24
>     brne Delay3Cycle
>     ret
> 
> 
> .section .bootloader,"ax",@progbits
> ; use -WL,--section-start=.bootloader=0xXf00
> 
> Boot:
>     in Temp, MCUSR
>     sbrs Temp, EXTRF
> JmpReset:
>     jmp ResetVector                ; jump to application code
> 



More information about the Gcc mailing list