Projet

Général

Profil

Identifiants » Historique » Version 5

Patrice Nadeau, 2024-01-27 14:24

1 1 Patrice Nadeau
# Objets et macros
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 1 Patrice Nadeau
    1. La documentation DOIT indiquer les substituts à utiliser.
14
15 3 Patrice Nadeau
## Exemple
16 1 Patrice Nadeau
``` c
17
/**
18
 * @brief OldFunction
19
 * @deprecated Utiliser NewFunction à la place
20
 * @since Version x.x.xx
21
 */
22
int OldFunction(void) __attribute__((deprecated));
23
24
/**
25
 * @brief OldFunction
26
 * @deprecated Utiliser NewFunction à la place
27
 * @since Version x.x.xx
28
 */
29
int OldFunction(void) __attribute__((unavailable));
30 4 Patrice Nadeau
31
/**
32
* @brief MACRO1
33
* @deprecated Utiliser NEWMACRO à la place
34 1 Patrice Nadeau
* @since Version x.x.xx
35
*/
36
#define MACRO1 43
37
#pragma GCC poison MACRO1
38
```
39 5 Patrice Nadeau
40
## Justification
41
* Linux kernel coding style : <https://www.kernel.org/doc/html/v4.10/process/coding-style.html#naming>
42
* GNU Coding Standards <https://www.gnu.org/prep/standards/html_node/Writing-C.html#Writing-C>
43
* Embedded C Coding Standard : <https://barrgroup.com/embedded-systems/books/embedded-c-coding-standard>
44 1 Patrice Nadeau
45
### Déclarations locales
46
47
Une déclaration n’ayant qu’une visibilité locale DOIT :
48
* Être de classe `static`
49
50
Exemple:
51
``` c
52
/**
53
 * @brief Fonction locale
54
 * @return Une valeur
55
 */
56
static int local_func(void) {
57
    ...
58
    return 0;
59
}
60
```
61
62
### Constantes
63
64
Utilisé au lieu d’une macro quand le type ou la visibilité de la variable doit être définis.
65
66
Exemple :
67
68
``` c
69
/** 
70
 * @name Liste des constantes
71
 * @brief
72
 */
73
/** @{ */
74
/** @brief La chaîne d'initialisation du projet */
75
static const char INIT_STR[6] = "POWER";
76
/** @brief Constante globale de la librairie `random` */
77
extern int RANDOM_MAX = 25;
78
/** @} */
79
80
/** @brief Constante */
81
const int ANSWER 42;
82
```
83
84
### Énumérations
85
86
DOIT être utilisée pour définir une série de valeurs.
87
88
Exemple :
89
```c
90
/**
91
 * @name Liste des valeurs STATUS
92
 * @brief 
93
 * */
94
enum STATUS {
95
	/** @brief Le processus est OK */
96
	STATUS_OK = 0,
97
	/** @brief Le processus est en cours d'initialisation */
98
	STATUS_INIT,
99
	/** @brief Le processus est arrêté */
100
	STATUS_HALTED
101
};
102
```
103
104
### Typedef
105
106
Format :
107
* En minuscule, suivie de **_t**
108
109
Exemple :
110
``` c
111
/** Type de la structure dans la librairie `ds1305` */
112
typedef struct {
113
    /** @brief Dernier deux chiffres : &ge; 00, &le; 99 */
114
    uint8_t year;
115
    /** @brief 01 - 12 */
116
    uint8_t month;
117
    /** @brief 01 - 31 */
118
    uint8_t date;
119
    /** @brief 1 - 7 */
120
    uint8_t day;
121
    /** @brief 00 - 23 */
122
    uint8_t hours;
123
    /** @brief 00 - 59 */
124
    uint8_t minutes;
125
    /** @brief 00 - 59 */
126
    uint8_t seconds;
127
} ds1305_time_t;
128
```
129
130
### Variables
131
132
Exemple :
133
``` c
134
/** @brief Variable locale */
135
static int ctr;
136
/** @brief Variable globale */
137
int RANDOM_CTR;
138
```
139
140
### Structures
141
142
Format
143
* En minuscule, séparé par des «underscores» si nécessaire.
144
145
Exemple :
146
``` c
147
/**
148
* @brief Structure d'un menu local
149
* @see MenuSelect
150
*/
151
struct menu {
152
    /** @brief Caractère utilisé pour l'item */
153
    char choice;
154
    /** @brief Description de l'item */
155
    char *item;
156
};
157
```
158
159
### Fonctions
160
161
* Le nom DOIT être dans le format suivant : *Item***_***Action***_***Attribut*
162
    * *Action* signifie :
163
        * **set**, **get**, **clear** : Règle, obtient ou vide un registre
164
        * **read**, **write** : Lis ou écris dans un fichier
165
        * **init** : Fonction d’initialisation
166
        * **is** : Vérifie un état
167
        * **setup** : Fonction de configuration des ports (AVR)
168
        * Exceptions
169
            * 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.
170
171
* Contient les champs Doxygen
172
    * `@brief` : Brève description de la fonction
173
    * `@param[in,out]` *paramètre* *Description* : Si nécessaire, sinon ne pas inclure le champ
174
    * `@arg` : Valeur prédéfinie d'un paramètre (`#`, `* *`), sinon ne pas inclure le champs
175
    * `@return` : Description de la valeur retournée, sinon le terme **Sans objet**
176
    * `@retval` : Si une valeur de retour est prédéfinie, une ligne pour chaque valeur, sinon ne pas inclure le champs
177
    * `@pre` : Chaque précondition, sur une ligne séparée, sinon le terme **Sans objet**
178
    * `@post` : Chaque postcondition, sur une ligne séparée, sinon le terme **Sans objet**
179
    * `@sa` : Si une référence a un autre objet doit être faite (#), sinon le terme **Sans objet**
180
    * Le bloc d'exemple, si nécessaire
181
        * `@par Example`
182
        * `@code`
183
        * ...
184
        * `@endcode`
185
186
Une fonction DEVRAIT retourner une valeur. 
187
* Type entier (oui/non) :
188
  * Succès : **0**
189
  * Erreur : **1**
190
* Type booléen (Librairie `<stdbool.h>`)
191
    * **true**
192
    * **false**
193
* Pointeur :
194
    * **NULL** : Erreur
195
    * Autre valeur  : adresse du pointeur
196
197
Justification :
198
* [AVR1000b](https://ww1.microchip.com/downloads/en/Appnotes/AVR1000b-Getting-Started-Writing-C-Code-for-AVR-DS90003262B.pdf)
199
200
Exemple :
201
202
``` c
203
/**
204
* @brief Vérifie si une horloge est initialisée
205
* @param[in] nb Le numéro du timer parmi 
206
* @arg #TIMER_1
207
* @arg #TIMER_2
208
* @return
209
* @retval true Horloge *nb* est initialisée
210
* @retval false Horloge *nb* n'est PAS initialisée
211
* @pre init_timer
212
* @post Sans objet
213
**/
214
static bool is_timer_set(uint8_t nb);
215
```