Atmel AVR » Historique » Révision 12
Révision 11 (Patrice Nadeau, 2024-01-27 14:49) → Révision 12/23 (Patrice Nadeau, 2024-01-27 16:35)
# Atmel AVR Particularités pour les microcontrôleurs 8 bits AVR d’Atmel. [Atmel AVR4027: Tips and Tricks to Optimize Your C Code for 8-bit AVR Microcontrollers](https://ww1.microchip.com/downloads/en/AppNotes/doc8453.pdf) ## Règles 1. Macros définis dans le fichier config.h 1. `F_CPU` : La fréquence utilisée par l’horloge (interne ou externe) du microcontrôleur, en Hz microcontrôleur > Les « fuses » doivent correspondent à la bonne source de l’horloge. 1. De nouveau type d’entier sont fournis avec la librairie `stdint.h`. stdint.h. L’utilisation de ces types DOIT être utilisé afin d’exprimer le nombre de bit d’un objet. 1. Progmem : Pour mettre des variables en lecture seule dans la section FLASH au lieu de SRAM. 1. Inclue la librairie avr/pgmspace.h 1. Le nom de la variable DOIT être suivie de **_P** _P 1. Utiliser les macros de la librairie pour accéder à ces variables 1. Fonction main : Un microcontrôleur AVR ne termine jamais la fonction main. 1. Déclarer la fonction main avec l’attribut `noreturn` noreturn 1. Utiliser une boucle sans fin for (;;) 1. Opérations atomiques (opérations Certaines opérations ne devant doivent pas être interrompus) interrompus, par ex., charger un registre de 16 bits avec un registre de 8 bits. 1. Inclure la librairie `util/atomic.h` 1. Insérer les instructions dans une section `ATOMIC_BLOCK` 6. Interruptions ### Fichier d’en-têtes Vérification du modèle de microcontrôleur 1. TODO > Via l'option `-m` de [gcc](https://github.com/embecosm/avr-gcc/blob/avr-gcc-mainline/gcc/config/avr/avr-mcus.def) ## Exemple ```c #ifndef defined (__AVR_ATmega48__) || (__AVR_ATmega48P__) || \ (__AVR_ATmega88P__) || defined (__AVR_ATmega88__) || \ (__AVR_ATmega168__) || defined (__AVR_ATmega168P__) || \ (__AVR_ATmega328__) || defined (__AVR_ATmega328P__) #warning "Cette librairie n'as pas été testée sur cette famille de microcontrôleur." #endif ``` Exemple : ```c #include <avr/io.h> #include <avr/pgmspace.h> #include <util/atomic.h> ... /** @brief Variable en FLASH */ const int Variable1_P PROGMEM = 42; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { ... } /** * @brief Never ending loop */ void main(void) __attribute__((noreturn)); /* main function definition */ void main(void) { ... /* never return */ for (;;) { }; }; ``` ## Justifications * [Atmel AVR4027 : Tips and Tricks to Optimize Your C Code for 8-bit AVR Microcon-trollers](https://ww1.microchip.com/downloads/en/AppNotes/doc8453.pdf) * [AVR035 : Efficient C Coding for AVR6](https://ww1.microchip.com/downloads/en/AppNotes/doc1497.pdf) * [Vérification du modèle de microcontrôleur via l’option -m de gcc](https://github.com/embecosm/avr-gcc/blob/avr-gcc-mainline/gcc/config/avr/avr-mcus.def)