🛠 Comprendre la mémoire : 2 Mo de flash, 1 Mo de RAM TCM/DMA, EEPROM émulée et LittleFS
Objetivos
La arquitectura de memoria del Teensy 4.0 es su mayor fortaleza — y su principal trampa de portabilidad. El chip NXP no tiene flash integrada: el programa reside en una flash SPI externa Winbond W25Q16JV de 2 MB (1984 KB utilizables — los 64 KB superiores almacenan la EEPROM emulada y el programa de rescate LED-blink), ejecutada mediante una caché de 65536 bytes a 66 MB/s. En cuanto a la RAM: 1024 KB en total, dividida entre RAM1 (TCM, acceso de un ciclo a través del bus de 64 bits ITCM/DTCM) y RAM2 (optimizada para DMA). Aprenderás las palabras clave de ubicación y la EEPROM emulada.
Las palabras clave de ubicación
- FASTRUN: ubicación explícita del código en RAM1 (el compilador ya coloca el código crítico allí por defecto — acceso de un ciclo, el más rápido).
- FLASHMEM: forzar una función en la flash (ahorra RAM, acceso a través de caché).
- PROGMEM / F: datos constantes en flash, fuera de la RAM.
- DMAMEM: datos en RAM2, donde los periféricos DMA (USB, SDIO, audio) funcionan mejor.
Código completo
// 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); }
Para los archivos (registros, muestras de audio), la flash restante se utiliza mediante LittleFS: SD.begin(BUILTIN_SDCARD) apunta al conector SDIO de los pads inferiores, mientras que LittleFS forma la zona libre de flash — misma API File.
Verificación esperada
El contador de sesiones sobrevive a los cortes de alimentación (1080 bytes persistentes). La medición de micros alrededor de EEPROM.update muestra la micro-interrupción de ejecución documentada por PJRC: la escritura desde la flash interrumpe el código — prohibido en un bucle de audio en tiempo real. Compara la duración de un bucle de caminoCritique con y sin FASTRUN para sentir la diferencia entre TCM y flash con caché.
Errores frecuentes
- Escribir en la EEPROM en cada vuelta de loop: no solo detiene la ejecución, sino que desgasta la flash — escribe solo cuando cambia el valor (EEPROM.update lo hace, EEPROM.put no).
- Creer que se dispone de 2048 KB de programa: son 1984 KB, los 64 KB superiores están reservados (EEPROM + restore).
- Poner los buffers DMA en RAM1 por reflejo: los controladores esperan RAM2 (DMAMEM) — de lo contrario, copias ocultas o comportamientos extraños.
- Portar un sketch de Teensy 3.x con constantes de punto flotante: el T4 tiene una FPU de doble precisión de 64 bits por hardware y ya no fuerza los literales a precisión simple — « this might cause some subtle errors on T4 » (hilo de salida); escribe 1.0f explícitamente.
- Almacenar archivos grandes en la EEPROM: 1080 bytes, punto final — para volumen, usa LittleFS en flash o tarjeta SD de 4 bits.
- Olvidar los 16 bytes de RAM del RTC (registros LPGPR0-3) respaldados por la pila VBAT: es el lugar ideal para un pequeño estado crítico ultra-persistente.
Otros tutoriales para esta placa
- Premiers pas sur le Teensy 4.0 : Teensyduino, Loader et premier Blink
- GPIO et PWM sous 3,3 V : les règles d'or du Teensy 4.0
- Entrées analogiques et capteur de température interne : le ADC et ses limites
- Piloter un ruban WS2812 sans bloquer le CPU : WS2812Serial et OctoWS2811
- Contrôleur MIDI USB : un potard qui joue du piano (MIDIx4/MIDIx16)
- Deux ports USB simultanés : périphérique 480 Mbit/s ET hôte USB sur les pastilles
Ejemplos de código para esta placa
clignotante.inoArduinotouche-capacitive.inoArduinoanalogique-12-bits.inoArduinomidi-piano.inoArduinopwm-respiration.inoArduinoservo-angle.inoArduino