while + return = böse?

OP #2756852
Lesenswert?

Hab hier nen ATMega 1284P als PID-Regler mit nem selbstgestrickten 
Frontend mit Menüführung. Die Steuerung der Menüführung (Bilderaufruf 
und weiterschalten) findet durch globale Schaltbits statt die je nach 
Notwendigkeit zT. auch in der ISR gesetzt und weggenommen werden. Um aus 
nem Menü herauszukommen stelle ich aber plötzlich fest, daß mir das nur 
gelingt wenn ich ein bedeutungsloses und nur zu Kompatibilitätszwecken 
eingefügtes

int encode_read2( void )         // read two step encoders
{
/*
  ...
  */
 return enc_delta2;
}

benutze. Andernfalls hängt das Programm.
1. Kann es sein, daß mir irgendwo der Stapel überläuft und der 
return-Befehl den Stapelzeiger wieder 'richtig' positioniert?
2. Ist es fatal wenn ich aus einer switch-case Abfrage mit return 
einfach abhaue (ich muß einen Programmteil überspringen) anstatt wie 
üblich mit break?
#2756966
Lesenswert?

Irgendwie versteh ich die Frage nicht. Du hast die Funktion so 
deklariert, dass es einen Rückgabewert gibt (nämlich int), also gehört 
logischerweise auch ein return dazu.
Es hindert dich aber auch niemand daran, die Funktion als "void" zu 
deklarieren, falls sie gar nicht unbedingt einen Rückgabewert braucht.

Ach so, oder ist das so gemeint dass ohne diese "Dummy-Funktion" dein 
Programm gar nicht mehr funktioniert? Dann hast du Mist gebaut. Ohne 
deinen Code zu sehen, dürfte es aber reichlich schwer sein zu sagen 
woran es liegt.

> 2. Ist es fatal wenn ich aus einer switch-case Abfrage mit return
> einfach abhaue (ich muß einen Programmteil überspringen) anstatt wie
> üblich mit break?

Was hindert Dich daran, direkt nach dem switch-case ein "return retval;" 
zu haben und in den verschiedenen cases den Rückgabewert für jeden Fall 
entsprechend zu setzen?
OP #2757050
Lesenswert?

>Ach so, oder ist das so gemeint dass ohne diese "Dummy-Funktion" dein
>Programm gar nicht mehr funktioniert? Dann hast du Mist gebaut.
Das ist der Punkt. Der Code wird durch die vielen Verschachtelungen 
allmählich immer mehr zum Matt-in-sieben-Zügen Problem... ich überlege 
ob ich das Probleme konzeptionell nicht irgendwie anders angehen kann...
Gast #2757054
Lesenswert?

Joachim ... schrieb:
> Das ist der Punkt. Der Code wird durch die vielen Verschachtelungen
> allmählich immer mehr zum Matt-in-sieben-Zügen Problem... ich überlege
> ob ich das Probleme konzeptionell nicht irgendwie anders angehen kann...

dann zeige doch mal her was du hast. Es werden dann bestimmt auch 
hilfreiche kommentare zur verbesserung kommen.
#2757114
Lesenswert?

Das ist ein volatile Problem.
Durch Einbau von Funktionen kann es kaschiert werden, aber dann in 
anderem Kontext wieder auftreten.

Zugriff auf Interruptvariablen muß im Main-Kontext volatile erfolgen.
Z.B.:
1
#define IVAR(x)         (*(volatile typeof(x)*)&(x))
2

3
uint8_t intvar;
4

5
int main()
6
{
7
  while( IVAR(intvar)); // wait until false
8

9
}

Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren