Размещение кучи FreeRTOS в разделе CCMRAM для STM32
Заниматься оптимизацией кода, одновременно добавляя себе проблем с поиском новых ошибок, очень не хотелось. Поэтому своевременно вспомнилось, что данная версия микроконтроллера имеет на борту дополнительный сегмент ОЗУ размером 64К (CCM SRAM), который сейчас никак не был задействован. Эврика — вот оно, решение!
Но к сожалению, все оказалось не так просто.

Результаты поиска готового решения
В официальной документации на CCMRAM приводятся примеры для размещения в ней исполняемого кода, стека или отдельных переменных.
Поиск по форумам выдал несколько ссылок на разные способы использования CCMRAM, но к сожалению, все они являлись разными вариациями тех способов, которые были описаны в официальной документации. И все они требовали перелопачивать исходный код для добавления атрибутов при объявлении каждой функции или переменной.
Для GCC, в моем случае, примерно вот так:
__attribute__((section(".ccmram")));
В добавок, некоторые переменные имеют значение по умолчанию, что требует модифицировать загрузчик таким образом, что бы при старте прошивки такие переменные копировались в отдельную область для инициализированных или обнуленных переменных.
Ну и финальной сложностью были ограничения самой CCMRAM. Она висит на отдельной шине к которой у DMA нет доступа, а прямой доступ к памяти планировалось использовать очень активно.
Другими словами, решая одну проблему, можно было нечаянно добавить ворох других, и зарыться в отладку для поиска привнесенных багов.
К счастью, удалось найти простое решение со стороны FreeRTOS.
Размер кучи был меньше размера сегмента CCM RAM и решение напрашивалось само-собой — переместить кучу в данный раздел.
И это удалось сделать минимальными правками кода.
- В ld файле (в моем случае STM32F407VGTX_FLASH.ld) добавляется новая секция:
.ccmram : { . = ALIGN(8); . = . + _Min_Heap_Size; . = ALIGN(8); } >CCMRAM - В секции « ._user_heap_stack » комментируется или удаляется строка
/* . = . + _Min_Heap_Size; */Строки с _Min_Heap_Size требуются для выдачи предупреждений линковщиком в случае недостатка размера ОЗУ.
- В теле программы добавляется единственная переменная
uint8_t ucHeap[ configTOTAL_HEAP_SIZE ] __attribute__((section(".ccmram"))); - А при сборке проекта добавляется препроцессорное определение
configAPPLICATION_ALLOCATED_HEAP=1
В результате — куча FreeRTOS в CCM SRAM с минимальным количеством правок в исходном коде!
Утраченные устройства: по-настоящему карманный ноутбук HP Jornada 720
ИИ-система стоимостью $875 млн поможет управлять воздушным движением по всей территории США
[Перевод] TROS: как IBM хранила микрокод мейнфреймов в трансформаторах
Китайцы представили мини-ПК FEVM FNPH1 тоньше 2 см с 16 ядрами и мощной встроенной графикой за 135 тыс. рублей
Неужели это предел? Шарнир складного iPhone Duo начал выходить из строя после 440 тысяч сгибаний
Corsair выпустила прозрачный блок питания HX1000i Shift Crystal на 1 кВт с хабом на 24 устройства и гарантией 10 лет
GeForce RTX 5090 вернулись в продажу в США по цене втрое выше рекомендованной
ИИ Muse научился совершать телефонные звонки за человека