ich habe ein Problem mit meinem Code zum Byte Array schieben. Das
rotieren in asm funktionierte eigentlich, die Routine wurde nacheinander
für 10 Zeilen aufgerufen. Erst mit Konstanten, dann habe ich es
ordentlicher mit einer Schleife gemacht. Dann noch die Compiler
Optimierung (-Os) an und schon funktioniert es nicht mehr, es sieht aus
als wird r doppelt inkrementiert in for(r=...) Wenn ich die Laufvariable
r volatile deklariere ist es wieder ok.
Meine Vermutung ist das im asm Teil was faul ist. In der clobberlist ist
nur "memory" drin, wie sage ich dem Compiler das ich den Pointer "e"
verbiege? "e" ist ja nur eine Speicherklasse, in der clobberlist wird
das nicht akzeptiert. Muss man "e" selber retten und restaurieren?
1 | void
|
2 | _rol_array(uint8_t *__data)
|
3 | {
|
4 | __asm__ volatile (
|
5 | "ld __tmp_reg__,%a0" "\n\t"
|
6 | "sec" "\n\t"
|
7 | "rol __tmp_reg__" "\n\t"
|
8 | "st %a0+,__tmp_reg__" "\n\t"
|
9 |
|
10 | "ld __tmp_reg__,%a0" "\n\t"
|
11 | "rol __tmp_reg__" "\n\t"
|
12 | "st %a0+,__tmp_reg__" "\n\t"
|
13 |
|
14 | // gleicher rotate noch 9x, wg. lesbarkeit entfernt
|
15 |
|
16 | : /* void */
|
17 | : "e" (__data)
|
18 | : "memory"
|
19 | );
|
20 | }
|
21 |
|
22 |
|
23 |
|
24 | //...
|
25 | // alle 10 Zeilen um eine Stelle verschieben
|
26 |
|
27 | uint8_t r;
|
28 |
|
29 | for (r=0; r<((DIGITS+1)*ROWS); r+=(DIGITS+1))
|
30 | _rol_array(&disp[r]);
|