Actions
Atmel AVR » Historique » Révision 10
« Précédent |
Révision 10/23
(diff)
| Suivant »
Patrice Nadeau, 2024-01-27 14:47
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
Règles¶
- Macros définis dans le fichier config.h
-
F_CPU
: La fréquence utilisée par l’horloge (interne ou externe) du microcontrôleurLes « fuses » doivent correspondent à la bonne source de l’horloge.
-
- 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.
- Progmem : Pour mettre des variables en lecture seule dans la section FLASH au lieu de SRAM.
- Inclue la librairie avr/pgmspace.h
- Le nom de la variable DOIT être suivie de _P
- Utiliser les macros de la librairie pour accéder à ces variables
- Fonction main : Un microcontrôleur AVR ne termine jamais la fonction main.
- Déclarer la fonction main avec l’attribut noreturn
- Utiliser une boucle sans fin for (;;)
- 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.
- Inclure la librairie
util/atomic.h
- Insérer les instructions dans une section
ATOMIC_BLOCK
- Inclure la librairie
- Interruptions
Fichier d’en-têtes¶
Vérification du modèle de microcontrôleur
> Via l'option -m
de gcc
#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 :
#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 (;;) {
};
};
Mis à jour par Patrice Nadeau il y a 11 mois · 10 révisions