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


Reply via email to