Projet

Général

Profil

Actions

Wiki » Historique » Révision 158

« Précédent | Révision 158/169 (diff) | Suivant »
Patrice Nadeau, 2024-01-20 21:21


Règles de codage C

Le langage C, version C99 utilisé avec le compilateur GCC.

gcc n'est pas entièrement compatible avec le standard C99 (https://gcc.gnu.org/c99status.html).



Style

Commentaires Doxygen

Fichiers


Objets et macros

Préprocesseur

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

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

Macros

Définis dans le fichier config.h

Liste :

  • 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.

Types

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

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 10 mois · 158 révisions