Projet

Général

Profil

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

  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.

  2. 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.
  3. Progmem : Pour mettre des variables en lecture seule dans la section FLASH au lieu de SRAM.
    1. Inclue la librairie avr/pgmspace.h
    2. Le nom de la variable DOIT être suivie de _P
    3. Utiliser les macros de la librairie pour accéder à ces variables
  4. Fonction main : Un microcontrôleur AVR ne termine jamais la fonction main.
    1. Déclarer la fonction main avec l’attribut noreturn
    2. Utiliser une boucle sans fin for (;;)
  5. 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
    2. 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

#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