Operácie

AVR - Definície konštánt

Zo stránky SensorWiki

Verzia tlače už nie je podporovaná a môže obsahovať chyby pri vykresľovaní. Prosím aktualizujte záložky vo svojom prehliadači a použite predvolenú funkciu pre tlač v prehliadači.

Spracované z niekoľkých zdrojov[REF 1][REF 2] na internete.

Niekde sa na definície konštánt (napr. pripojenie periférí ku konkrétnym pinom používa

static const int led = 13;              (1)

alebo

#define led 13                          (2)

alebo niekde aj

enum { led = 13 };                      (3)

Odpoveď je rôzna v závislosti od toho, či používame jazyk C++ alebo C. Pre C++ platí prvá možnosť, vždy použiť const. V jazyku C odpoveď záleží od použitia:

  • Ak potrebujeme aj pointer, tak musíme použiť (1),
  • pretože pre (2) pointer nevznikne.
  • Možnosti (1) a (3) vytvoria aj symbol pre debugger, možnosť (2) nie.
  • Ak potrebujeme určiť rozmer poľa alebo reťazca, nedá sa použiť (1).
  • Ak chceme použiť konštantu do príkazu switch, nedá sa použiť (1)
  • Ak chceme inicializovať statickú premennú, nemôžeme použiť (1)


Prečo použiť #define

Treba si uvedomiť, že #define nie je príkaz, ale tzv. makro. To znamená, že ešte pred samotným prekladom programu tzv. preprocesor nahradí všetky výskyty textu v kóde. Napríklad

#define ledPin 13

sa nahradia všetky výskyty textu ledPin číslom 13. Výhodou je, že premenná ledPin neobsadí žiadne miesto v cennej RAM pamäti. Dokonca vlastne žiadna premenná ledPin ani nevznikne.


Kedy použiť const

Ak použijeme modifikátor const, hovoríme kompilátoru, že daná premenná sa nebude (a ani nesmie) meniť. Obvykle sa vytvorí premenná v pamäti RAM a to aj s príslušným pointrom na túto premennú. Avšak prekladač avr-gcc väčšinou pochopí, že takýto kúsok kódu má preložiť tak, aby neobsadil žiadnu pamäť RAM. Napríklad

const int ledPin=13;

neobsadí v pamäti tiež žiadne miesto.


Ak si to chcete overiť a vyskúšať, dá sa to z príkazového riadku

avr-size -C sketch_nov11a.cpp.elf

alebo v konzole pri preklade v AVR studiu.


References

  1. Jonathan Leffler: “static const” vs “#define” vs “enum” Available online: https://stackoverflow.com/questions/1674032/static-const-vs-define-vs-enum
  2. James Lewis: Const vs #define – When do you use them and why? Available online: https://www.baldengineer.com/const-vs-define-when-do-you-them-and-why.html?