Forum: Compiler & IDEs volatile Problem oder asm Frage


von JojoS (Gast)


Lesenswert?

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]);

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.