Размещение кучи 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 с минимальным количеством правок в исходном коде!
Airbus A220 первым из пассажирских самолётов получит систему навигации, не зависящую от GPS
Все 33 Raptor включились на 15 секунд: SpaceX провела успешные огневые испытания ускорителя Super Heavy B22
«Выбор очевиден»: Airbus намерен нарастить выпуск A350 — мировой авиации требуется больше широкофюзеляжных лайнеров
Samsung Galaxy S27 Ultra оснастят батареей на 5700 мА·ч, 60-ваттной зарядкой, 200-мегапиксельной камерой и защитой по стандарту IP68
Инсайдер слил характеристики Samsung Galaxy S27: дисплей на 6,3 дюйма, аккумулятор на 4300 мАч и защита IP68
Apple освоила проверку iPhone внутри закрытой упаковки
HMD снова выпустит модульный смартфон Fusion: экран 120 Гц, 12 ГБ ОЗУ, камера 108 Мп и аккумулятор на 5000 мАч
Роботов с ИИ будут тренировать на полигоне, воспроизводящем реальный мир и в физическом виде, и в симуляции