Projet

Général

Profil

Atmel AVR » Historique » Révision 11

Révision 10 (Patrice Nadeau, 2024-01-27 14:47) → Révision 11/23 (Patrice Nadeau, 2024-01-27 14:49)

# 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 

         > Les « fuses » doivent correspondent à la bonne source de l’horloge. 
 1. De nouveau type d’entier sont fournis avec la librairie 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 
     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 
     1. Utiliser une boucle sans fin for (;;) 
 1. Opérations atomiques Certaines opérations ne doivent pas être 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 
     > Via l'option `-m` de [gcc](https://github.com/embecosm/avr-gcc/blob/avr-gcc-mainline/gcc/config/avr/avr-mcus.def) 

 ```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)