Projet

Général

Profil

Atmel AVR » Historique » Version 1

Patrice Nadeau, 2024-01-20 21:22

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