Ich wollte mich wirklich nicht mit Codeoptimierung beschäftigen und gleichzeitig Probleme beim Auffinden neuer Fehler hinzufügen. Daher wurde rechtzeitig daran erinnert, dass diese Version des Mikrocontrollers ein zusätzliches 64-KByte-RAM-Segment (CCM-SRAM) an Bord hat, das bisher in keiner Weise verwendet wurde. Eureka - hier ist die Lösung!
Leider stellte sich heraus, dass nicht alles so einfach war.
Suchergebnisse für eine fertige Lösung
Die offizielle Dokumentation zu CCMRAM enthält Beispiele für das Platzieren von ausführbarem Code, einem Stapel oder einzelnen Variablen.
Das Durchsuchen der Foren ergab mehrere Links zu verschiedenen Verwendungsmöglichkeiten von CCMRAM. Leider handelte es sich bei allen um unterschiedliche Variationen der in der offiziellen Dokumentation beschriebenen Möglichkeiten. Alle mussten den Quellcode durchsuchen, um Attribute hinzuzufügen, wenn jede Funktion oder Variable deklariert wurde.
Für GCC in meinem Fall ungefähr so:
__attribute__((section(".ccmram")));
Darüber hinaus haben einige Variablen einen Standardwert, der eine Änderung des Bootloaders erfordert, sodass diese Variablen beim Start der Firmware in einen separaten Bereich für initialisierte oder auf Null gesetzte Variablen kopiert werden.
Nun, die letzte Schwierigkeit waren die Einschränkungen von CCMRAM selbst. Es hängt an einem separaten Bus, auf den DMA keinen Zugriff hat, und es war geplant, den direkten Speicherzugriff sehr aktiv zu nutzen.
Mit anderen Worten, wenn man ein Problem löst, kann man versehentlich eine Reihe anderer hinzufügen und sich mit dem Debuggen befassen, um die eingeführten Fehler zu finden.
Glücklicherweise ist es uns gelungen, eine einfache Lösung von FreeRTOS zu finden.
Die Heap-Größe war kleiner als die Größe des CCM-RAM-Segments, und die Entscheidung, den Heap auf diese Partition zu verschieben, lag auf der Hand.
Und das haben wir mit minimalen Codeänderungen geschafft.
- Der ld-Datei wird ein neuer Abschnitt hinzugefügt (in meinem Fall STM32F407VGTX_FLASH.ld):
.ccmram : { . = ALIGN(8); . = . + _Min_Heap_Size; . = ALIGN(8); } >CCMRAM
- Im Abschnitt "._user_heap_stack" wird eine Zeile kommentiert oder gelöscht
/* . = . + _Min_Heap_Size; */
Zeilen mit _Min_Heap_Size sind erforderlich, damit der Linker bei unzureichender RAM-Größe Warnungen ausgibt . - Dem Hauptteil des Programms wird eine einzelne Variable hinzugefügt.
uint8_t ucHeap[ configTOTAL_HEAP_SIZE ] __attribute__((section(".ccmram")));
- Beim Erstellen eines Projekts wird eine Präprozessordefinition hinzugefügt
configAPPLICATION_ALLOCATED_HEAP=1
Als Ergebnis - eine Reihe von FreeRTOS in CCM SRAM mit einer minimalen Anzahl von Änderungen im Quellcode!