Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega16 - [C]Zmiana wartości jednego bitu

Manrul 01 Sie 2014 20:46 1329 3
  • #1 01 Sie 2014 20:46
    Manrul
    Poziom 7  

    Witam, zaczynam przygodę z mikrokontrolerami i mam pewien problem, czytam kilka książek dla początkujących oraz przeglądam przykłady w internecie, i mam pewien problem, ponieważ widziałem kilka równoważnych zapisów(przynajmniej tak mi się wydaje), zmian wartości wybranego bitu.
    -makra(?) cbi() i sbi()
    -makro register_bit
    -makro _BV() w połączaniu z odpowiednią operacją logiczną
    - oraz ostatnie użycie (1<<nr bitu) +operacja logiczna,
    czy tylko mi się wydaje że mają takie same działanie?
    jeśli mam rację to które najlepiej wybrać(najszybciej działa), czy nie ma różnicy?
    bo jeśli nie to chyba po odpowiednim zdefiniowaniu najlepiej użyć makra register_bit.

    0 3
  • #2 01 Sie 2014 21:12
    Tomq
    Poziom 38  

    Cytat:
    -makra(?) cbi() i sbi()

    To są polecenia asemblera, często mówi się "wstawki assemblerowe"

    Cytat:
    jeśli mam rację to które najlepiej wybrać(najszybciej działa), czy nie ma różnicy?
    bo jeśli nie to chyba po odpowiednim zdefiniowaniu najlepiej użyć makra register_bit.

    Skoro uczysz się języka C, to warto uczyć się go dogłębnie, więc sugeruje używanie operacji bitowych:
    http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-operator-bitowy-and.html
    http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-operator-bitowy-or.html

    Przyda się gdy będziesz potrzebował zrobić jakieś działanie bitowe, operacje bitowe będziesz miał już "we krwi". Taka dygresja - można korzystać z gotowych makr, bibliotek, etc, ale jeśli ktoś uczy się języka to powinien się do tego przyłożyć, a nie sięgać po gotowce.

    0
  • #3 01 Sie 2014 22:50
    szczywronek
    Poziom 27  

    Do którejś wersji avr-gcc miał zdefiniowane makra cbi i sbi (de facto były to wstawki z odpowiednimi rozkazami asm). Tak czy siak aktualnie trzeba sobie obrać inną drogę.

    Cytat z źródło

    Cytat:
    Porting programs that use the deprecated sbi/cbi macros

    Access to the AVR single bit set and clear instructions are provided via the standard C bit manipulation commands. The sbi and cbi macros are no longer directly supported.


    Osobiście tak jak przedmówca polecam operacje bitowe. Nie uzależniasz się od fikuśnych makr, ćwiczysz operacje binarne, nie martwisz się że Twoje ulubione makro zostanie kiedyś "wycofane", nie jesteś zagubiony jak zmienisz toolchain... Same plusy ;)

    Co do szybkości: z tego co wyczytałem (mogą to być bzdury ;]) makra sbi/cbi wprowadzono, gdyż kompilator nie generował tych rozkazów procesora. Zamiast tego tworzył "tradycyjny kod" - załaduj rejestr, wykonaj operację bitową, zapisz rejestr - co trwało dłużej i nie było atomowe. Dlatego też wprowadzono makra, takie obejście problemu zamiast rozwiązania. Z czasem "poprawiono kompilator" i makra przestały być potrzebne. Kompilator sam tłumaczył zapis typu:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    na odpowiedni rozkaz sbi (i analogicznie cbi). Operacje bitowe są więc co najmniej tak samo szybkie jak użycie makr cbi, sbi.

    _BV jeśli się nie mylę jest makrem, które tylko przesuwa jedynkę... Coś w stylu:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    będzie więc działać tak samo szybko jak "manualne przesuwanie".

    Z "register_bit" się nigdy nie spotkałem ;)

    0
  • #4 01 Sie 2014 23:38
    piotrva
    Moderator na urlopie...

    Co do szybkości działania to i tak potem jest OPTYMALIZACJA.
    Ona najprawdopodobniej proste operacje (niezależnie od zapisu) zamieni podczas kompilacji na instrukcje ASM cbi i sbi.
    Za to np. ustawienie 2 czy 3 bitów na raz może być przez kompilator inaczej skompilowane.

    Reasumując piszesz w języku wysokiego poziomu, więc zapewniasz kompilatorowi pewną dowolność i on niezależnie od zapisu powinien wybrać optymalną metodę.

    Jeśli chcesz wiedzieć co się dzieje to sięgnij po czysty ASM.

    1