Projet

Général

Profil

Atmel AVR » Historique » Version 2

Patrice Nadeau, 2024-01-27 14:42

1 1 Patrice Nadeau
# Atmel AVR
2
3
Particularités pour les microcontrôleurs 8 bits AVR d’Atmel.
4
5
[Atmel AVR4027: Tips and Tricks to Optimize Your C Code for 8-bit AVR Microcontrollers](https://ww1.microchip.com/downloads/en/AppNotes/doc8453.pdf)
6
7 2 Patrice Nadeau
## Règles
8
1. Macros définis dans le fichier config.h
9
    1. `F_CPU` : La fréquence utilisée par l’horloge (interne ou externe) du microcontrôleur
10
11
        > Les « fuses » doivent correspondent à la bonne source de l’horloge.
12
1. 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.
13
1. Progmem : Pour mettre des variables en lecture seule dans la section FLASH au lieu de SRAM.
14
    1. Inclue la librairie avr/pgmspace.h
15
    1. Le nom de la variable DOIT être suivie de _P
16
    1. Utiliser les macros de la librairie pour accéder à ces variables
17
1. Fonction main : Un microcontrôleur AVR ne termine jamais la fonction main.
18
    1. Déclarer la fonction main avec l’attribut noreturn
19
    1. Utiliser une boucle sans fin for (;;)
20
1. 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.
21
    1. Inclure la librairie util/atomic.h
22
    1. Insérer les instructions dans une section ATOMIC_BLOCK
23
6. Interruptions
24
25 1 Patrice Nadeau
### Fichier d’en-têtes
26
27
Vérification du modèle de microcontrôleur
28
    > Via l'option `-m` de [gcc](https://github.com/embecosm/avr-gcc/blob/avr-gcc-mainline/gcc/config/avr/avr-mcus.def)
29
30
```c
31
#ifndef defined (__AVR_ATmega48__) || (__AVR_ATmega48P__) || \
32
	(__AVR_ATmega88P__) || defined (__AVR_ATmega88__) || \
33
	(__AVR_ATmega168__) || defined (__AVR_ATmega168P__) || \
34
	(__AVR_ATmega328__) || defined (__AVR_ATmega328P__)
35
#warning "Cette librairie n'as pas été testée sur cette famille de microcontrôleur."
36
#endif
37
```
38
39
### Macros
40
41
Définis dans le fichier `config.h`
42
43
Liste : 
44
* `F_CPU` : La fréquence utilisée par l'horloge (interne ou externe) du microcontrôleur
45
46
    > Les « fuses » doivent correspondent à la bonne source de l'horloge.
47
48
### Types
49
50
De nouveau type d'entier sont fournis avec la librairie `<stdint.h>`.
51
52
L'utilisation de ces types DOIT être utilisé afin d'exprimer le nombre de bit d'un objet.
53
54
### Progmem
55
56
<https://www.avrfreaks.net/s/topic/a5C3l000000U5SFEA0/t034767>
57
58
Pour mettre des variables en lecture seule dans la section FLASH au lieu de SRAM avec `<avr/pgmspace.h>`.
59
> L’accès à ces variables est faite via les macros de la librairie.
60
61
Le nom de la variable DOIT être suivie de **_P**
62
63
Exemple :
64
```c
65
#include <avr/pgmspace.h>
66
...
67
/** @brief Variable en FLASH */
68
const int Variable1_P PROGMEM = 42;
69
```
70
71
### Fonction main
72
Un microcontrôleur AVR ne termine jamais la fonction `main`.
73
74
* Déclarer la fonction main avec l’attribut `noreturn`
75
* La boucle sans fin la plus optimisé est le `for (;;)`
76
77
Justification : [AVR035](https://ww1.microchip.com/downloads/en/AppNotes/doc1497.pdf)
78
79
Exemple :
80
```c
81
#include <avr/io.h>
82
83
/** 
84
 * @brief Never ending loop
85
*/
86
void main(void) __attribute__((noreturn));
87
88
/* main function definition */
89
void main(void) {
90
    ...
91
    /* never return */
92
    for (;;) {
93
    };
94
};
95
```
96
97
### Opérations « atomiques »
98
Opérations ne devant pas être interrompus (Ex. : charger un registre de 16 bits avec un registre de 8 bits).
99
100
La librairie `avr-libc` (util/atomic.h) fournit des macros permettant la gestion entre autre des interruptions.
101
102
Les instructions critiques sont insérées dans un `ATOMIC_BLOCK`.
103
104
Exemple :
105
```c
106
#include <util/atomic.h>
107
...
108
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
109
    ...
110
}
111
...
112
```