Hallo
Ich rätzle gerade über dem von avr-gcc Assembler Listing (.lst Datei).
Die Einsprungsadresse für meine function BlinkLed() scheint nicht zu
passen. Funktionieren tut das Programm allerdings schon.
1 | ...
|
2 | 000000ec <BlinkLed>:
|
3 |
|
4 | void BlinkLed( uint8_t mytaskid ) {
|
5 | PINB |= (1<<PB4); // toggle pin
|
6 | ec: 1c 9a sbi 0x03, 4 ; 3
|
7 | }
|
8 | ee: 08 95 ret
|
9 | ...
|
Soweit, sogut. Die BlinkLed function steht also an 0x00EC. Dasselbe
steht auch im .map file, wird also wirklich so sein - oder?
Wenn ich das Listing weiter verfolge, steht da:
1 | AddTask( BlinkLed, 0, hz ); // start immediately, run every second
|
2 | 132: 86 e7 ldi r24, 0x76 ; 118
|
3 | 134: 90 e0 ldi r25, 0x00 ; 0
|
4 | 136: 60 e0 ldi r22, 0x00 ; 0
|
5 | 138: 70 e0 ldi r23, 0x00 ; 0
|
6 | 13a: 48 e5 ldi r20, 0x58 ; 88
|
7 | 13c: 52 e0 ldi r21, 0x02 ; 2
|
8 | 13e: 0e 94 ec 00 call 0x1d8 ; 0x1d8 <AddTask>
|
Das Registerpaar r25:r24 sollte doch 0x00EC enthalten?! ("hz" ist mit
600 #define'd, das sind 0x0258 in r21:r20, die 0 ist in r23:22
abgelegt).
AddTask() übernimmt die Adresse in ein array, damit die function durch
den scheduler periodisch ausgeführt wird. Das funktioniert auch - aber
weshalb??? %)