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