Wpis z mikrobloga

Mirki wspomóżcie wiedzą - #programowanie #avr #avrgcc

Czy w konstrukcji switch-case

switch (zmienna)

{

case 0: {cos tam instrukcje; break;}

case 1: {cos tam inne instrukcje; break;}

...

}

w instrukcjach mogę modyfikować zmienną "zmienna"? Tzn czy wartosci "zmienna" decyduje o wykonaniu skoku, i już później nie jest sprawdzana, czy też jest to odpowiednik:

if (zmienna==0) {cos tam pierwsze instrukje}

if (zmienna==1) {cos tam inne instrukje}

czyli nie moge w instukcjach zmienić "zmienna" bo w kolejnym kroku jest ona powtórnie sprawdzana i może dojść do wykonania kilku case-ów po sobie, pomimo że miał być wybrany jeden z nich?
  • 18
@kuhar: dzięki, o to mnie chodziło. Mogę teoretycznie zrobić:

if (warunek==0)

{ instrkukcje dla zera; warunek=1;}

else if (warunek==1)

{ instrukcje dla jedynki; warunek=cos innego;}

else if (warunek==...)

itd.

ale dużo ładniej wygląda case, a że warunek jest całkowitą liczbą 0,1,2,3... to powinno się kopilować dużo prościej ze stałymi skokami, niż wolne ify
@kuhar: czytelność ważna, ale akurat tutaj mam przypadek, gdzie w przerwaniu muszę coś w miarę szybko, każdy oszczędzony cykl procesora się przyda, a robić wstawki w asemblerze mi się nie chce ;)
@hrumque: else if nie zadziała jeśli poprzednia instrukcja została wykonana. Musiałyby być same ify.

W języku wyższego poziomu instrukcje dla warunków można by zamknąć po prostu w funkcjach, nie wiem na ile to wydajne w C.
@Yahoo_:

else if nie zadziała jeśli poprzednia instrukcja została wykonana. Musiałyby być same ify.


Ale mi o to chodzi - by zależnie od wartości "zmienna" wykonać tylko jedną odpowiednią instrukcję (czy tam blok instrukcji), a nie pozostałe. Oraz w następnym przerwaniu - wykonać następny blok instrukcji, a nie tamte poprzednie. I liczy się tu jak najszybsze rozpoczęcie ich wykonywania od momentu przyjścia przerwania, oraz stały czas - by dojście do Ntego
@hrumque: Czekaj, czekaj. Czyli flow wygląda tak:

przerwanie -> switch -> wykonaj instrukcje 0 -> koniec-> następne przerwanie -> wykonaj instrukcje 1 etc.? Jeśli tak to switch oczywiście zadziała (o ile warunek nie będzie nigdzie indziej nadpisywany). Bo póki co napisałeś to tak jakbyś chciał zrobić coś bardziej w stylu:

przerwanie -> switch -> wykonaj instrukcje 0 -> wykonaj instrukcje 1->koniec (przynajmniej ja to tak zrozumiałem i chyba moi przedmówcy).
@Yahoo_: ma wyglądać tak: (nr to jest volatile unsigned int, wiec moge go zmieniać tu-i-tam równocześnie, nie ma problemu z buforowaniem w rejestrze)

Przerwanie -> switch (nr) -> (wykonaj instrkukcje 0, nr=1) -> koniec

program główny sobie leci...

Przerwanie -> switch (nr) -> (wykonaj instrkukcje 1, nr=2) -> koniec

program głowny dalej sobie leci

Przerwanie -> switch (nr) -> (wykonaj instrukcje 2, nr=3) -> koniec... itd

program główny sobie leci... ale
@Analityk: ale widzę że jednak nie jest to idealnie, bo każda kolejna pozycja jest comparowana i ewentualnie robiony skok. Jeśli piersza bedzie sie zgadzała - to skok jest robiony od razu. Jeśli ósma - to po 7x compare + 1x skok taktach procesora sie wykona.

Myślałem że to się ładniej skompiluje, na '51 w ASM robiło się taki ładny switch-case, że kolejne (stałe/równe) case były od razu wektorem skoku (razy wielkość
@deekox: szprytne, mniejwięcej o to samo mi chodzi, tylko po co człowiek ma się tak gimnastykować, by zmusić kompilator, by zrobił to tak, jak człowiek chce, skoro można od razu zrobić tak jak się chce, w ASM? W końcu od tego są wstawki - napisałem w ASM i jest dobrze :)