www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik GCC: while Schleife, Zähler wann aktualisiert?


Autor: digifloh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallihallo,

voller Vorfreude stürz ich mich gerade wieder auf mein Projekt und werde 
wieder gebremst, könnt heule... ;-)

uint8_t pos_read, bytTMP;
voiatile uint8_t pos_in;

while (pos_read < pos_in) {
  bytTMP = bufrx[pos_read_rs232rx];
  bufread[pos_read] = bytTMP;

  pos_read = pos_read + 1;
  if (pos_read >= 64) {
    pos_read = 0;
  }

}


Das klappt jedenfalls nicht, pos_read wird erst NACH dem Verlassen der 
Schleife aktualisiert aber nicht in der Schleife, kapiere ich nicht.

pos_in wird in einem Interrupt ordendlich durchgeschoben...


...
  pos_in = pos_in + 1;
  if (pos_in >= 64) {
    pos_in = 0;
  }
...



Wo klemmen meine Gedanken? ;-)
Ich möchte in der Schleife den Zähler beeinflussen, geht das so nicht?

Gruß Frank'l...

Autor: Marco S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meckert der Compiler nicht, weil pos_read uninitialisiert ist? Setze 
doch einfach mal den Schalter "-pedantic" und nehme alle Warnungen 
ernst.

cu

Autor: digifloh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nee den initialisiere ich mit 0 beim Start also vor der Mainschleife.
Ich habe "-pedantic" gesetzt, das einzige was bemeckert wird ist das ich 
meine Komentare mit // anfange, das wird doch nicht das Problem sein?! 
;)

Gruß Frank'l...

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
digifloh wrote:

>
> Das klappt jedenfalls nicht, pos_read wird erst NACH dem Verlassen der
> Schleife aktualisiert aber nicht in der Schleife, kapiere ich nicht.

pos_read ist nicht volatile (muss es auch nicht sein), also kann der 
Compiler das nach belieben während des Schleifendurchlaufs in einem 
Register halten, und erst am Schluss wieder zurückschreiben.

Erklär doch mal genauer, was der Unterschied zw. erwartetem und 
beobachtetem Verhalten bei deinem Code ist.

/Ernst

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>pos_read wird erst NACH dem Verlassen der
>Schleife aktualisiert aber nicht in der Schleife, kapiere ich nicht.

Woran merkst du das?

Oliver

Autor: digifloh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin wieder drauf reingefallen!
Das ganze wurde wieder "geinlined" habs mir im Deassembler angesehen da 
wird brav der Vergleich gemacht.

Klappt auch alles wie erwartet... schade nur das man im AVRStudio nicht 
ganz so transparent in C in die Variablen schauen kann als wenn man es 
in ASM programmieren würde. Hat also alles Nach sowie Vorteile...

Sorry nix für ungut...

Gruß Frank'l...

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@digifloh :
> schade nur das man im AVRStudio nicht ganz so transparent in C in die
> Variablen schauen kann als wenn man es in ASM programmieren würde

kann man schon, wenn es die Variablen noch gibt. Der Compiler muss den 
Assembler code so erzeugen, dass das Programm so_funktioniert, wie du 
geschrieben hast, nicht so, dass es so aussieht. (Der compiler kann 
auch "besser" C als du, oder ich, oder die meisten anderen hier ;) )

Deshalb: wenn du dir das Assembler-Listing anschaust, schau zuerst nach 
den Sachen, die der Compiler nicht wegoptmieren darf (Hardwarezugriffe 
und alles andere, was "volatile" ist).

hth. Jörg

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.