Projet

Général

Profil

Actions

Atmel AVR » Historique » Révision 4

« Précédent | Révision 4/23 (diff) | Suivant »
Patrice Nadeau, 2024-01-27 14:43


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

Progmem

https://www.avrfreaks.net/s/topic/a5C3l000000U5SFEA0/t034767

Pour mettre des variables en lecture seule dans la section FLASH au lieu de SRAM avec <avr/pgmspace.h>.

L’accès à ces variables est faite via les macros de la librairie.

Le nom de la variable DOIT être suivie de _P

Exemple :

#include <avr/pgmspace.h>
...
/** @brief Variable en FLASH */
const int Variable1_P PROGMEM = 42;

Fonction main

Un microcontrôleur AVR ne termine jamais la fonction main.

  • Déclarer la fonction main avec l’attribut noreturn
  • La boucle sans fin la plus optimisé est le for (;;)

Justification : AVR035

Exemple :

#include <avr/io.h>

/** 
 * @brief Never ending loop
*/
void main(void) __attribute__((noreturn));

/* main function definition */
void main(void) {
    ...
    /* never return */
    for (;;) {
    };
};

Opérations « atomiques »

Opérations ne devant pas être interrompus (Ex. : charger un registre de 16 bits avec un registre de 8 bits).

La librairie avr-libc (util/atomic.h) fournit des macros permettant la gestion entre autre des interruptions.

Les instructions critiques sont insérées dans un ATOMIC_BLOCK.

Exemple :

#include <util/atomic.h>
...
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
    ...
}
...

Mis à jour par Patrice Nadeau il y a 11 mois · 4 révisions