GCC: while Schleife, Zähler wann aktualisiert?

Gast #575663
Lesenswert?
• ▲
▼
Hallihallo,

voller Vorfreude stürz ich mich gerade wieder auf mein Projekt und werde 
wieder gebremst, könnt heule... ;-)
1
uint8_t pos_read, bytTMP;
2
voiatile uint8_t pos_in;
3

4
while (pos_read < pos_in) {
5
  bytTMP = bufrx[pos_read_rs232rx];
6
  bufread[pos_read] = bytTMP;
7

8
  pos_read = pos_read + 1;
9
  if (pos_read >= 64) {
10
    pos_read = 0;
11
  }
12

13
}

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...

1
...
2
  pos_in = pos_in + 1;
3
  if (pos_in >= 64) {
4
    pos_in = 0;
5
  }
6
...


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

Gruß Frank'l...
Gast #575680
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...
#575717
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
Gast #575908
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...
Gast #576112
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.