Cześć, pisząc program na mikrokontroler AVR zauważyłem ciekawą rzecz.
Mam pewną funkcję o nazwie LCD_refresh, która realizuje operacje odświeżania wyświetlacza LCD,
po czym zwraca rezultat - zawsze 0 (tylko taki rezultat na ten moment jest obsłużony - nic innego nie może być zwrócone).
W funkcji lcdRun wywoływana jest LCD_refresh - w wyrażeniu warunkowym sprawdzam rezultat, jeśli jest inny niż 0, to ustawiam flagę lcdError na 1.
I ku mojemu zdziwieniu, po uruchmieniu programu zmienna lcdError przyjmuje wartość 1, pomimo że LCD_refresh "na sztywno" zwraca 0:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jeżeli jednak lekko zmodyfikuję program, przez wołanie funkcji LCD_refresh przed wyrażeniem warunkowym, zapisując rezultat do zmiennej pomocniczej a następnie dokonuję sprawdzenia,
wtedy wszystko działa zgodnie z założeniami, czyli zmienna lcdError jest równa 0.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Co o tym myślicie? Wygląda mi na to na niejednoznaczne zachowanie kompilatora. Nie sprawdzałem co by się stało po zmianie optymalizacji podczas kompilacji- mam ustawioną domyślną.
Dodam że program nie jest wielowątkowy, nie ma tu nawet żadnych przerwań, czysty bare metal.