Je ne voulais vraiment pas m'engager dans l'optimisation du code, en même temps ajouter des problèmes pour trouver de nouveaux bogues. Par conséquent, il était opportun de se rappeler que cette version du microcontrôleur avait un segment de RAM supplémentaire de 64K (CCM SRAM) à bord, qui n'a été utilisé d'aucune façon pour le moment. Eureka - la voici, la solution!
Mais malheureusement, tout s'est avéré moins simple.
Résultats de recherche pour une solution prête à l'emploi
La documentation officielle de CCMRAM fournit des exemples pour y placer du code exécutable, une pile ou des variables individuelles.
La recherche dans les forums a donné plusieurs liens vers différentes façons d'utiliser CCMRAM, mais malheureusement, il s'agissait toutes de différentes variantes des méthodes décrites dans la documentation officielle. Et tous ont nécessité de parcourir le code source pour ajouter des attributs lors de la déclaration de chaque fonction ou variable.
Pour GCC, dans mon cas, quelque chose comme ceci:
__attribute__((section(".ccmram")));
En outre, certaines variables ont une valeur par défaut, ce qui nécessite de modifier le chargeur de démarrage afin que, lorsque le micrologiciel démarre, ces variables soient copiées dans une zone distincte pour les variables initialisées ou remises à zéro.
Eh bien, la dernière difficulté était les limites du CCMRAM lui-même. Il se bloque sur un bus séparé auquel DMA n'a pas accès et il était prévu d'utiliser très activement l'accès direct à la mémoire.
En d'autres termes, en résolvant un problème, on pourrait accidentellement en ajouter un tas d'autres, et fouiller dans le débogage pour trouver les bogues introduits.
Heureusement, nous avons réussi à trouver une solution simple de la part de FreeRTOS.
La taille du tas était inférieure à la taille du segment de RAM CCM et la décision était évidente: déplacer le tas vers cette partition.
Et nous avons réussi à le faire avec des changements de code minimes.
- Une nouvelle section est ajoutée au fichier ld (dans mon cas STM32F407VGTX_FLASH.ld):
.ccmram : { . = ALIGN(8); . = . + _Min_Heap_Size; . = ALIGN(8); } >CCMRAM
- Dans la section "._user_heap_stack" une ligne est commentée ou supprimée
/* . = . + _Min_Heap_Size; */
Les lignes avec _Min_Heap_Size sont nécessaires pour que l'éditeur de liens émette des avertissements en cas de taille de RAM insuffisante. - Une seule variable est ajoutée au corps du programme.
uint8_t ucHeap[ configTOTAL_HEAP_SIZE ] __attribute__((section(".ccmram")));
- Et lors de la construction d'un projet, une définition de préprocesseur est ajoutée
configAPPLICATION_ALLOCATED_HEAP=1
En conséquence - un tas de FreeRTOS dans CCM SRAM avec un nombre minimum de modifications dans le code source!