Différences Mémoire Flash et RAM
Les microcontrôleurs STM32 utilisent une architecture Harvard où le code et les données sont stockés séparément : la Flash pour le code (non volatile) et la SRAM pour les données (volatile). Contrairement aux architectures x86 de type Von Neumann où code et données partagent la même mémoire RAM.
Concepts Fondamentaux
Mémoire Flash
Mémoire non volatile stockant le code exécutable et les constantes. Dans STM32, il s'agit de NOR Flash permettant une exécution directe du code. Organisée en pages (1-2 Ko), elle comprend :
- Mémoire principale : Code et constantes (adresse 0x08000000)
- Bloc d'information : Bootloader et paramètres système
Mémoire RAM (SRAM)
Mémoire volatile rapide (0x20000000) pour le stockage temporaire des données. Type SRAM avec accès aléatoire. Utilisée pour :
- Variables globales initialisées (.data)
- Variables non initialisées (.bss)
- Pile (stack) et tas (heap)
Architecture Mémoire STM32
Modèle Cortex-M3
Espace d'adressage 32 bits (4 Go) avec mappage linéaire. Zones critiques :
0x08000000 : Début Flash
0x20000000 : Début SRAM
0x1FFFF000 : Mémoire système (bootloader)
Organisation de la Flash
Contrôlée par le Flash Memory Interface. Écriture/effacement gérés par programmation interne. La lecture est bloquée pendant les opérations d'écriture.
Gestion Mémoire des Applications
Segments de Données en C/C++
- .text : Code machine (Flash)
- .rodata : Constantes (Flash)
- .data : Variables initialisées (Flash → RAM au démarrage)
- .bss : Variables à zéro (RAM)
- Heap : Allocation dynamique (malloc/free)
- Stack : Variables locales et contexte d'appel
Consommation Mémoire après Compilation
Avec MDK (Keil) :
Flash = Code + RO-data + RW-data
RAM = RW-data + ZI-data
Avec GCC :
Flash = .text + .data
RAM = .data + .bss
Configuration Mémoire
Le heap et la stack sont définis dans startup_stm32fxxx.s :
Stack_Size EQU 0x400 ; 1 Ko
Heap_Size EQU 0x200 ; 512 octets
Le heap croît vers les adresses hautes, la stack décroît depuis __initial_sp. Les débordements écrasent les zones adjacentes.
Analyse du Fichier .map (MDK)
- Section Cross References : Appels de fonctions entre fichiers
- Symbol Tables : Adresses des variables/fonctions locales/globales
- Memory Map : Mappage détaillé Flash/RAM
- Component Sizes : Taille des segments (.text, .data, etc.)
Exemple d'entrée RAM :
0x20000000 .data
0x20000100 .bss
0x20000200 Heap (taille configurée)
0x20000400 Stack
Compléments Techniques
Modes de Démarrage
| BOOT0 | BOOT1 | Mode |
|---|---|---|
| 0 | X | Flash Utilisateur (0x08000000) |
| 1 | 0 | Bootloader Système (0x1FFFF000) |
| 1 | 1 | SRAM (0x20000000) |
Différences Architectures CPU
STM32 (Harvard/RISC) :
- Instructions simples et pipelinées
- Accès mémoire limité aux opérations Load/Store
x86 (Von Neumann/CISC) :
- Instructions complexes (microprogrammes)
- Code et données dans la même mémoire