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


von digifloh (Gast)


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

von Marco S (Gast)


Lesenswert?

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

cu

von digifloh (Gast)


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

von Εrnst B. (ernst)


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

von Oliver (Gast)


Lesenswert?

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

Woran merkst du das?

Oliver

von digifloh (Gast)


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

von Joerg X. (Gast)


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

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
Noch kein Account? Hier anmelden.