Witam!
Mam prośbę o pomoc w poprawieniu kodu.
Otóż mam zadeklarowane globalnie następujące zmienne:
W programie głównym mam 2 funkcje w pętli while.
Funkcja ComRdFrame wygląda następująco:
Natomiast przerwanie od odbioru:
W założeniu funkcja ComRdFrame ma zanalizować ramkę danych jeśli w buforze znajdzie się 5 znaków.
W rzeczywistości jest tak, że warunek if(x==5) jest wykonywany często kilkukrotnie tak jakby procesor nie widział, że zmienna uległa zmianie(po wejściu w warunek zeruję x). Dokładnie chodzi o to, że po odebraniu ramki na którą ATMEGA ma odpowiedzieć ramka z odpowiedzią odsyłana jest nie raz, a dwa, trzy lub cztery(ComWrt). Czytałem o optymailizacji. Ustawiłem nawet poziom optymalizacji w pliku Make na 0. Nie rozumiem takiego zachowania procesora. Na ASM się nie znam, więc raczej nie sprawdzę czy kompilator faktycznie traktuje x jako volatile. Czemu x się nie chce wyzerować w warunku w ComRdFrame?
Jak mam sprawdzić, czy w buforze znajduje się faktycznie 5 znaków i jak go zerować jeśli tak? Moja ramka nie ma znaków początku i końca transmisji, więc interesuje mnie jedynie wykonywanie poleceń w programie w przypadku, gdy x=5, przy czym oczywiście dla jednego odebranego polecenia ma wykonać się raz, a nie kilka razy jak to obserwuję.
Mam prośbę o pomoc w poprawieniu kodu.
Otóż mam zadeklarowane globalnie następujące zmienne:
Kod: C / C++
W programie głównym mam 2 funkcje w pętli while.
Kod: C / C++
Funkcja ComRdFrame wygląda następująco:
Kod: C / C++
Natomiast przerwanie od odbioru:
Kod: C / C++
W założeniu funkcja ComRdFrame ma zanalizować ramkę danych jeśli w buforze znajdzie się 5 znaków.
W rzeczywistości jest tak, że warunek if(x==5) jest wykonywany często kilkukrotnie tak jakby procesor nie widział, że zmienna uległa zmianie(po wejściu w warunek zeruję x). Dokładnie chodzi o to, że po odebraniu ramki na którą ATMEGA ma odpowiedzieć ramka z odpowiedzią odsyłana jest nie raz, a dwa, trzy lub cztery(ComWrt). Czytałem o optymailizacji. Ustawiłem nawet poziom optymalizacji w pliku Make na 0. Nie rozumiem takiego zachowania procesora. Na ASM się nie znam, więc raczej nie sprawdzę czy kompilator faktycznie traktuje x jako volatile. Czemu x się nie chce wyzerować w warunku w ComRdFrame?
Jak mam sprawdzić, czy w buforze znajduje się faktycznie 5 znaków i jak go zerować jeśli tak? Moja ramka nie ma znaków początku i końca transmisji, więc interesuje mnie jedynie wykonywanie poleceń w programie w przypadku, gdy x=5, przy czym oczywiście dla jednego odebranego polecenia ma wykonać się raz, a nie kilka razy jak to obserwuję.
