mikrocontroller.net

Forum: Compiler & IDEs kleines C Problem - brauch mal Hilfe


Autor: Bjoern Buettner (tishima)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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


Autor: Gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
volatile U8 temp; was ist U8 ?

Autor: Bjoern Buettner (tishima)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Zeile 6  sollte ein unsigned Char sein laut typedef.

gruß,
Bjoern

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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)


Autor: Gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char U8;
volatile U8 temp; kann temp so deklariert werden? wär mir neu

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Er sagt doch er hat einen typedef dafür.

typedef unsigned char U8;
volatile U8 temp;


Autor: Bjoern Buettner (tishima)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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).

Autor: Bjoern Buettner (tishima)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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




Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.