🛠 Comprendre la mémoire : 2 Mo de flash, 1 Mo de RAM TCM/DMA, EEPROM émulée et LittleFS

Teensy 4.0 · intermediaire · Schéma : IMG-teensy-40-intermediaire-6-teensy40-memoire-flash-ram-eeprom.svg — carte mémoire du Teensy 4.0 : puce flash externe W25Q16JV 2 Mo (1984 Ko utilisables, 64 Ko réservés EEPROM+restore), RAM 1024 Ko coupée en RAM1 (TCM, accès 1 cycle) et RAM2 (optimisée DMA), 16 octets de RTC RAM sur pile VBAT, 1080 octets d'EEPROM émulée.

Objectifs

L'architecture mémoire du Teensy 4.0 est sa plus grande force — et son principal piège de portage. La puce NXP n'a pas de flash embarqué : le programme vit dans une flash SPI externe Winbond W25Q16JV de 2 Mo (1984 Ko utilisables — les 64 Ko du haut stockent l'EEPROM émulée et le programme de secours LED-blink), exécutée via un cache de 65536 octets à 66 Mo/s. Côté RAM : 1024 Ko au total, moitiés RAM1 (TCM, accès un cycle via bus 64 bits ITCM/DTCM) et RAM2 (optimisée pour le DMA). Vous apprendrez les mots-clés de placement et l'EEPROM émulée.

Les mots-clés de placement

Code complet

// Démonstration des zones mémoire + EEPROM émulée.
#include <EEPROM.h>

const char message[] PROGMEM = "constante en flash (F pour les littéraux)";
DMAMEM uint16_t tamponDMA[1024];        // RAM2 : idéal pour le DMA
FASTRUN void cheminCritique {         // code dans RAM1 (TCM)
  for (uint32_t i = 0; i < 1024; i++) tamponDMA[i] = i * 3;
}

void setup {
  Serial.begin(9600);
  Serial.println((const char*)message);

  // EEPROM : 1080 OCTETS émulés dans la flash (pas de vraie EEPROM !)
  uint8_t compteur = EEPROM.read(0);
  compteur++;
  uint32_t t0 = micros;
  EEPROM.update(0, compteur);   // écriture : le code S'ARRÊTE un instant
  uint32_t duree = micros - t0;

  Serial.printf("session %u, écriture EEPROM = %u us\n", compteur, duree);
}

void loop { cheminCritique; delay(1000); }

Pour les fichiers (logs, samples audio), la flash restante s'utilise via LittleFS : SD.begin(BUILTIN_SDCARD) vise le connecteur SDIO des pastilles inférieures, tandis que LittleFS forme la zone flash libre — même API File.

Vérification attendue

Le compteur de sessions survit à la coupure d'alimentation (1080 octets persistants). La mesure micros autour d'EEPROM.update montre la micro-coupure d'exécution documentée par PJRC : l'écriture depuis la flash interrompt le code — à bannir d'une boucle audio temps réel. Comparez la durée d'une boucle de cheminCritique avec et sans FASTRUN pour sentir la différence TCM vs flash cachée.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels