Projet

Général

Profil

Atmel AVR » Historique » Version 5

Patrice Nadeau, 2024-01-27 14:44

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
### Progmem
40
41
<https://www.avrfreaks.net/s/topic/a5C3l000000U5SFEA0/t034767>
42
43
Pour mettre des variables en lecture seule dans la section FLASH au lieu de SRAM avec `<avr/pgmspace.h>`.
44
> L’accès à ces variables est faite via les macros de la librairie.
45
46
Le nom de la variable DOIT être suivie de **_P**
47
48
Exemple :
49
```c
50
#include <avr/pgmspace.h>
51
...
52
/** @brief Variable en FLASH */
53
const int Variable1_P PROGMEM = 42;
54
```
55
56
57
Exemple :
58
```c
59
#include <avr/io.h>
60
61
/** 
62
 * @brief Never ending loop
63
*/
64
void main(void) __attribute__((noreturn));
65
66
/* main function definition */
67
void main(void) {
68
    ...
69
    /* never return */
70
    for (;;) {
71
    };
72
};
73
```
74
75
### Opérations « atomiques »
76
Opérations ne devant pas être interrompus (Ex. : charger un registre de 16 bits avec un registre de 8 bits).
77
78
La librairie `avr-libc` (util/atomic.h) fournit des macros permettant la gestion entre autre des interruptions.
79
80
Les instructions critiques sont insérées dans un `ATOMIC_BLOCK`.
81
82
Exemple :
83
```c
84
#include <util/atomic.h>
85
...
86
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
87
    ...
88
}
89
...
90
```