Hallo, So nach drei Tagen Fehlersuche habe ich mein Problem auf ein minimum reduziert, hab schon nach Hardwarefehler gesucht. Compiler ist der WinARM GCC Optimierung ist aus U8 ist als unsigned Char definiert Der adcbuffer[] wird in ner Timerinterupptroutine mit ner Konstanten (10) gefüllt. Hab ich testweise gemacht um ein ADC Fehler auszuschliessen. Es sollten sich so im ganzen buffer die gleichen Werte befinden. U8 dx,dy,dc,dd; volatile U8 temp; while(1) { dc=adcbuffer[temp]; dd=adcbuffer[temp-1]; if (dc!=dd) {rprintf("%d %d\r",dd,dc);} temp--; } Wenn temp den Wert 0 annimmt tritt ein Fehler auf. Ich bin bisher davon ausgegangen das temp einen Wertebereich von 0-255 hat. ??? Wenn temp den Wert 0 annimmt erhalte ich als Ausgabe auf dem Terminelprg. 182 10 In diesem Fall scheint adcbuffer[temp-1] der temp Wert aus dem Wertebereich (0-255) herauszuhüpfen und übergibt mir nen falschen Bufferwert. Wie sorge ich nun in C dafuer das bei temp 0 temp-1 auch wirklich 255 ist ? oder wo mach ansonsten den Gedankenfehler. gruß, Bjoern
Siehe Zeile 6 sollte ein unsigned Char sein laut typedef. gruß, Bjoern
> Wenn temp den Wert 0 annimmt tritt ein Fehler auf.
Ja logisch.
Das Arrayelement adcbuffer[-1] existiert nicht.
Also kannst du dort auch nicht zugreifen um den
Wert von dort zu lesen.
Auch wenn temp den Datentyp unsigned char hat, so werden
arithmetische Ausdrücke in C immer als int (oder long)
durchgeführt. Mit anderen Worten, dein temp-1
wird gerechnet als
((unsigned int)temp)-1)
char U8; volatile U8 temp; kann temp so deklariert werden? wär mir neu
Er sagt doch er hat einen typedef dafür. typedef unsigned char U8; volatile U8 temp;
Hmm, kann ich in C den arithmetischen Ausdrücken irgenwie dazu zwingen ein unsigned char zu sein. Sonst muss ich mein ganzen Programm nochmal abaendern, son mist. gruß, Bjoern
Du kannst probieren: buffer [ ( temp - 1 ) & 0xFF ]; Das müsste auf jeden Fall gehen. Wenn du Glück hast, dann ist der Compiler schlau genug, rauszufinden dass dadurch die Erweiterung auf unsigned int völlig sinnlos ist und er lässt es bleiben (zwecks Laufzeit).
@Karl Heinz Der Compiler scheint schlau genug zu sein. Da im eigentlichen Programm der Fall das temp 0 wird nur sehr sellten vorkommt, muss ich das aber noch weiter beobachten. danke, Bjoern
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.