Projet

Général

Profil

Identifiants » Historique » Version 9

Patrice Nadeau, 2024-01-27 15:23

1 6 Patrice Nadeau
# Objets
2 3 Patrice Nadeau
3
## Règles
4
5 2 Patrice Nadeau
1. Comportent au maximum **31** caractères :
6
    1. Lettres minuscules
7 4 Patrice Nadeau
        > Les macros sont en lettres majuscules
8 2 Patrice Nadeau
    1. Nombres
9
    1. Trait de soulignement
10
1. Si plusieurs mots sont utilisés, ils sont séparées par des traits de soulignement
11
1. Les objets ne devant plus être utilisés, DOIVENT générer un message lors de la compilation (`-Wall`) si un appel est effectué.
12
    1. Les attributs`deprecated` ou `unavailable` DOIVENT être ajoutés à la déclaration.
13 7 Patrice Nadeau
    1. Les commentaires Doxygen suivants doivent être ajoutés : 
14
        1. `@deprecated` :
15
        1. `@since` :
16 1 Patrice Nadeau
17 3 Patrice Nadeau
## Exemple
18 1 Patrice Nadeau
``` c
19
/**
20
 * @brief OldFunction
21
 * @deprecated Utiliser NewFunction à la place
22
 * @since Version x.x.xx
23
 */
24
int OldFunction(void) __attribute__((deprecated));
25
26
/**
27
 * @brief OldFunction
28
 * @deprecated Utiliser NewFunction à la place
29
 * @since Version x.x.xx
30
 */
31
int OldFunction(void) __attribute__((unavailable));
32 4 Patrice Nadeau
33
/**
34
* @brief MACRO1
35
* @deprecated Utiliser NEWMACRO à la place
36 1 Patrice Nadeau
* @since Version x.x.xx
37
*/
38
#define MACRO1 43
39
#pragma GCC poison MACRO1
40
```
41 5 Patrice Nadeau
42
## Justification
43
* Linux kernel coding style : <https://www.kernel.org/doc/html/v4.10/process/coding-style.html#naming>
44
* GNU Coding Standards <https://www.gnu.org/prep/standards/html_node/Writing-C.html#Writing-C>
45
* Embedded C Coding Standard : <https://barrgroup.com/embedded-systems/books/embedded-c-coding-standard>
46 1 Patrice Nadeau
47
### Déclarations locales
48
49
Une déclaration n’ayant qu’une visibilité locale DOIT :
50
* Être de classe `static`
51
52
Exemple:
53
``` c
54
/**
55
 * @brief Fonction locale
56
 * @return Une valeur
57
 */
58
static int local_func(void) {
59
    ...
60
    return 0;
61
}
62
```
63
64
### Constantes
65
66
Utilisé au lieu d’une macro quand le type ou la visibilité de la variable doit être définis.
67
68
Exemple :
69
70
``` c
71
/** 
72
 * @name Liste des constantes
73
 * @brief
74
 */
75
/** @{ */
76
/** @brief La chaîne d'initialisation du projet */
77
static const char INIT_STR[6] = "POWER";
78
/** @brief Constante globale de la librairie `random` */
79
extern int RANDOM_MAX = 25;
80
/** @} */
81
82
/** @brief Constante */
83
const int ANSWER 42;
84
```
85
86
### Typedef
87
88
Format :
89
* En minuscule, suivie de **_t**
90
91
Exemple :
92
``` c
93
/** Type de la structure dans la librairie `ds1305` */
94
typedef struct {
95
    /** @brief Dernier deux chiffres : &ge; 00, &le; 99 */
96
    uint8_t year;
97
    /** @brief 01 - 12 */
98
    uint8_t month;
99
    /** @brief 01 - 31 */
100
    uint8_t date;
101
    /** @brief 1 - 7 */
102
    uint8_t day;
103
    /** @brief 00 - 23 */
104
    uint8_t hours;
105
    /** @brief 00 - 59 */
106
    uint8_t minutes;
107
    /** @brief 00 - 59 */
108
    uint8_t seconds;
109
} ds1305_time_t;
110
```
111
112
### Variables
113
114
Exemple :
115
``` c
116
/** @brief Variable locale */
117
static int ctr;
118
/** @brief Variable globale */
119
int RANDOM_CTR;
120
```
121
122
### Fonctions
123
124
* Le nom DOIT être dans le format suivant : *Item***_***Action***_***Attribut*
125
    * *Action* signifie :
126
        * **set**, **get**, **clear** : Règle, obtient ou vide un registre
127
        * **read**, **write** : Lis ou écris dans un fichier
128
        * **init** : Fonction d’initialisation
129
        * **is** : Vérifie un état
130
        * **setup** : Fonction de configuration des ports (AVR)
131
        * Exceptions
132
            * Les fonctions définies dans une librairie de bas niveau pour du matériel (« driver ») devraient utiliser le nom définis dans la fiche technique.
133
134
* Contient les champs Doxygen
135
    * `@brief` : Brève description de la fonction
136
    * `@param[in,out]` *paramètre* *Description* : Si nécessaire, sinon ne pas inclure le champ
137
    * `@arg` : Valeur prédéfinie d'un paramètre (`#`, `* *`), sinon ne pas inclure le champs
138
    * `@return` : Description de la valeur retournée, sinon le terme **Sans objet**
139
    * `@retval` : Si une valeur de retour est prédéfinie, une ligne pour chaque valeur, sinon ne pas inclure le champs
140
    * `@pre` : Chaque précondition, sur une ligne séparée, sinon le terme **Sans objet**
141
    * `@post` : Chaque postcondition, sur une ligne séparée, sinon le terme **Sans objet**
142
    * `@sa` : Si une référence a un autre objet doit être faite (#), sinon le terme **Sans objet**
143
    * Le bloc d'exemple, si nécessaire
144
        * `@par Example`
145
        * `@code`
146
        * ...
147
        * `@endcode`
148
149
Une fonction DEVRAIT retourner une valeur. 
150
* Type entier (oui/non) :
151
  * Succès : **0**
152
  * Erreur : **1**
153
* Type booléen (Librairie `<stdbool.h>`)
154
    * **true**
155
    * **false**
156
* Pointeur :
157
    * **NULL** : Erreur
158
    * Autre valeur  : adresse du pointeur
159
160
Justification :
161
* [AVR1000b](https://ww1.microchip.com/downloads/en/Appnotes/AVR1000b-Getting-Started-Writing-C-Code-for-AVR-DS90003262B.pdf)
162
163
Exemple :
164
165
``` c
166
/**
167
* @brief Vérifie si une horloge est initialisée
168
* @param[in] nb Le numéro du timer parmi 
169
* @arg #TIMER_1
170
* @arg #TIMER_2
171
* @return
172
* @retval true Horloge *nb* est initialisée
173
* @retval false Horloge *nb* n'est PAS initialisée
174
* @pre init_timer
175
* @post Sans objet
176
**/
177
static bool is_timer_set(uint8_t nb);
178
```