Hallo!
Nach Jahren des Assemblerprogrammierens bin ich heute auch für die uC
auf gcc umgestiegen. Dazu habe ich ein existierendes Projekt portiert,
möchste jedoch die ISRs weiterhin in Asm machen. Hatte testweise die ISR
in C geschrieben aber in der lss stand mir zu viel Blödsinn. Daher habe
ich meinen Asm-Code und den erzeugten Code kombiniert und eine *.S Datei
ausgelagert. Alles funktioniert soweit, jedoch habe ich zwei Probleme:
im C steht unter Anderem
1 | #define M1_PORT PORTC
|
2 | uint8_t steps[8];
|
in der S-Datei
1 | sts (m1_ist+1), r31
|
2 | sts (m1_ist+0), r30
|
3 | andi r30, 0x07 ; 7
|
4 | andi r31, 0x00 ; 0
|
5 | subi r30, lo8(steps)
|
6 | sbci r31, hi8(steps)
|
7 | ld r24, Z
|
8 | out _SFR_IO_ADDR(M1_PORT), r24
|
zwei Probleme:
1. Ich kann auf die Definition von "M1_PORT" nicht zugreifen. Hilfsweise
wiederhole ich die Definition in der S-Datei, das finde ich jedoch
"gefährlich".
2. Da es ja kein addi/adci gibt bzw. adiw nicht reicht (k <= 63) behilft
sich der Compiler bei der ADDITION der Speicheradresse des Arrays steps
mit einer Subtraktion der negativen Werte. Das berechnet er fix (beim
Linken?) und gut is. Ich kann jedoch blöderweise nicht (0-steps)
rechnen, da beklagt der Compiler:
1 | ../isr.S:98: Error: can't resolve `L0' {*ABS* section} - `steps' {*UND* section}
|
2 | ../isr.S:98: Error: expression too complex
|
Mit 0x0 etc geht's auch nicht. (steps-$FF) funktioniert, bringt mich
jedoch nicht weiter...
Vielen Dank!
Robert