Stuart Whelan wrote:
Hi Folks,

I am using gcc 3.4.4 and avr-libc 1.4.4 on win32....

I have been using the CodeVision compiler for a long time, but have decided to port my projects to gcc-avr.

My application jumps to the bootloader on receipt of jump to bootloader command, but the jmp I am using seems to be doing strange things. I cut it done down to the smallest test:

main()
{
        asm volatile("jmp 0x1c00"::);
}

And compiled it with:

avr-gcc -mmcu=atmega16 -o foo.obj foo.c
And the jmp command comes out as:
  96:   0c 94 00 0e     jmp     0x1c00 <__stack+0x17a1>

Now if I read that correctly, it is jmp'ing to 0e00, not 1c00.. I notice that 0e00 is 1c00/2...

Jumps are to word addresses. You can't jump to an odd address, so call/jmp (at the processor level) are in terms of words (not bytes).

When I step through this in the debugger, the program counter does indeed jump to 0e00, not 1c00.

That's correct.

The GNU toolchain (avr-gcc and avr-as, anyway) uses byte addresses.

The AVR uses word addresses for program memory (which is more than 1 byte wide).


Compare the code generated for the following jump:

typedef void (* funcptr) (void);
goto *(funcptr)0x1c00;  // a gcc extension; should do what you want:
  a4:   e0 e0           ldi     r30, 0x00       ; 0
  a6:   fc e1           ldi     r31, 0x1C       ; 28
  a8:   09 94           ijmp

--
Ned Konz
http://bike-nomad.com


_______________________________________________
AVR-GCC-list mailing list
AVR-GCC-list@nongnu.org
http://lists.nongnu.org/mailman/listinfo/avr-gcc-list

Reply via email to