volatile Problem oder asm Frage

Gast #566600
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]);

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren