STM32: Problem mit return-Funktion

OP #7285240
Lesenswert?

Hallo,

Ich habe in meinem Projekt eine Software-Entprellung, die mittels
1
if( hw.semaDebounce->get_And_Reset_If_Larger(10) )
aller 5ms (Zeitbasis sind hier 500µs) eine Tasterauswertung laufen lässt 
und am Ende den Entprellzustand zurück gibt.
Seltsam war aber, dass der Code viel schneller als in 5ms Abständen 
ausgeführt wurde. Nach einer Weile rumprobieren blieb übrig, dass in der 
"return"-Variante anscheinend das Delay übersprungen wird. Denn als ich 
die Funktion testweise mal als "void" setzte, lief das alles 
erwartungsgemäß.
Anbei hab ich mal den AssemblyCode beider Varianten gegenübergestellt 
und dort sieht man, dass die Zeilen 7 bis 9 in der return-Variante 
fehlen. Das ist nämlich genau der Funktionsteil der Delay-Funktion.
(Dort habe ich den Delay so gesetzt, dass ich 1-Sekunden printouts 
bekomme.)

Was für Ideen habt ihr zu diesem Problem und wie kann ich das beheben?

Danke schon mal im Voraus.
Hannes
Angehängte Dateien:
OP #7285264
Lesenswert?

Hi Jörg,

Ok, ich dachte da gibt's vielleicht nen schnellen Tipp zum Starten...

Also die Entprellfunktion hatte ich dann auf das hier reduziert:
1
PressStates PushButton::debouncePB(void)
2
{  
3
  if(hw.semaDebounce->get_And_Reset_If_Larger(1000) ){ //repeated after 100ms
4
    printf("\n 1second");
5
    return this->pressState;
6
  }
7
}
und
1
void PushButton::debouncePB(void)
2
{  
3
  if(hw.semaDebounce->get_And_Reset_If_Larger(1000) ){ //repeated after 100ms
4
    printf("\n 1second");
5
  }
6
}
Also quasi fast leere Funktionen.

Die Datei mit den Semaphoren habe ich angehängt.
Angehängte Dateien:
Moderator Persönliche Seite #7285371
Lesenswert?

Εrnst B. schrieb:
> Und der Code läuft in einer ISR, und kann immer wieder aufgerufen
> werden, während der vorherige Aufruf noch in seinem printf steckt?

Naja, das printf wird ja hoffentlich keine Sekunde brauchen. ;-) Ich 
hätte aber da auch lieber 'ne LED blinken lassen.

Johannes H. schrieb:
> Also die Entprellfunktion hatte ich dann auf das hier reduziert:

Kannst du nicht doch irgendwie was mehr posten? In deiner Disassembly da 
oben fehlen beispielsweise die Adressen, sodass ich keine Idee habe, 
wohin einzelne der Sprünge da gehen. Vermutlich fehlen da auch noch 
relevante Teile des Codes, da sie außerhalb deines kleinen Ausschnitts 
sind. Kannst du vielleicht die zugehörigen .o-Dateien posten?
OP #7285389
Lesenswert?

Christian F. schrieb:
> Hier fehlt ein return-Statement falls die Bedingung nicht erfüllt ist.
> Das ist "Undefined Behavior".
Ohje... Es lag tatsächlich daran.

@Stefan
Die Option war bereits aktiviert und ich hatte dort am Ende der Funktion 
auch eine Warnung eingeblendet:
> control reaches end of non-void function [-Wreturn-type]
Aber nicht gedacht, dass das ein Problem sein könnte. Jetzt bin ich 
schlauer.

Also vielen Dank fürs korrekte Draufzeigen.

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