Projet

Général

Profil

Actions

Wiki » Historique » Révision 157

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


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

Directives du préprocesseur gcc.

#include

Pour inclure d’autres fichier comme les fichiers entête.

#ifdef / ifndef

Surtout utilisé pour des options de compilation sur différentes plateforme.
Utiliser une forme évitant les répétitions.

N’est pas documenté dans Doxygen.

Exemple :

const char BLUE =
  #if ENABLED(FEATURE_ONE)
    '1'
  #else
    '0'
  #endif
;

Diagnostiques

Les macros #warning et #error sont utilisées pour afficher des avertissements ou des erreurs lors de la compilation.

Ne sont pas documentées dans Doxygen.

Exemple :

#ifndef usart_AVR
    #error "__FILE_NAME__ is not supported on this AVR !"
#endif

#ifndef __test__
    #warning "test is not defined !"
#endif

Définitions

Un #define est utilisé pour remplacer une valeur au moment de la compilation

Pour la définition d'une valeur « integer », un enum DOIT être utilisé.

Exemple :

/**
* @name Nom des registres
*/
/** @{ */ 
/** @brief USART1 */
#define USART1 REG1
/** @brief USART2 */
#define USART2 REG2
/** @} */

USART1 = 0x0F;

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 · 157 révisions