Ich bin am Spielen mit dem Bootloader. Klappt so weit auch. Aber eine
Frage, die sich beim Lesen von
http://www.mikrocontroller.net/articles/AVR_Bootloader_in_C_-_eine_einfache_Anleitung
aufdrängt, habe ich:
Wenn ich in den Bootloader vom Application Flash springen will, wie
mache ich das richtig? Ich habe einen mega16, beide BOOTSIZE Bits
gesetzt = 1024 words, Startadresse => 0x1C00 (word)/0x3800 (byte)
Es geht:
aber auch
1 | ((void (*)(void))0x3800)();
|
Angeblich soll man ja bei AVR GCC die Adresse bei C (also im zweiten
Fall) in word Schreibweise angeben. Müßte also
1 | ((void (*)(void))0x1c00)();
|
lauten.
Schaue ich aber den generierten Maschinencode an, sehe ich bei
als Ergebnis
1 | int main()
|
2 | {
|
3 | asm("jmp 0x3800");
|
4 | 6c: 0c 94 00 1c jmp 0x3800 ; 0x3800 <__stack+0x33a1>
|
5 | 70: 80 e0 ldi r24, 0x00 ; 0
|
6 | 72: 90 e0 ldi r25, 0x00 ; 0
|
7 | 74: 08 95 ret
|
8 |
|
9 | ...
|
und bei
1 | ((void (*)(void))0x3800)();
|
erhalte ich
1 | int main()
|
2 | {
|
3 | ((void (*)(void))0x3800)();
|
4 | 6c: e0 e0 ldi r30, 0x00 ; 0
|
5 | 6e: f8 e3 ldi r31, 0x38 ; 56
|
6 | 70: 09 95 icall
|
7 | 72: 80 e0 ldi r24, 0x00 ; 0
|
8 | 74: 90 e0 ldi r25, 0x00 ; 0
|
9 | 76: 08 95 ret
|
10 |
|
11 | ...
|
Also sind beide schreibweisen in Byte Notierung doch eigentlich richtig,
denn bei
1 | ((void (*)(void))0x1c00)();
|
wird generiert:
1 | ((void (*)(void))0x1c00)();
|
2 | 6c: e0 e0 ldi r30, 0x00 ; 0
|
3 | 6e: fc e1 ldi r31, 0x1C ; 28
|
4 |
|
5 | ...
|
Das ist doch dann die falsche Adresse? Oder? Ich bin nun kein
Assembler-Kenner, aber wenn der Assembler auf 0x1c00 zeigt, dann
passiert das doch auch, oder?
Gibt man also immer Byte-Werte an? Obwohl das im Tutorial anders steht?
Verwirrter bittet um Hilfe.