[C++, C, Программирование микроконтроллеров, Компьютерное железо] Размещение кучи FreeRTOS в разделе CCMRAM для STM32
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
При разработке одного девайса на базе STM32F407 столкнулся с проблемой нехватки оперативной памяти. Назначение самого девайса не принципиально, но важно, что изначальный код писался для десктопной системы и его нужно было просто портировать на микроконтроллер под управлением FreeRTOS. А так как исходный код был написан на С++ и вопрос об экономии ОЗУ даже не стоял, то и вылезла соответствующая проблема.
Заниматься оптимизацией кода, одновременно добавляя себе проблем с поиском новых ошибок, очень не хотелось. Поэтому своевременно вспомнилось, что данная версия микроконтроллера имеет на борту дополнительный сегмент ОЗУ размером 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 с минимальным количеством правок в исходном коде!
===========
Источник:
habr.com
===========
Похожие новости:
- [Машинное обучение] 17 марта состоится ML meetup Online
- [Виртуализация, DevOps, Облачные сервисы, Удалённая работа] Вебинар «10 причин выбрать VDI как решение по организации удаленной работы»
- [Python, Разработка под MacOS, Разработка под Linux, Разработка под Windows] Трепещущий Kivy. Обзор возможностей фреймворка Kivy и библиотеки KivyMD
- [Научно-популярное, Биотехнологии, Химия, Экология] Странная парочка: основа симбиоза гавайского кальмара и светящихся бактерий
- [Управление проектами, Agile, Управление персоналом] Прогулка по картине мира
- [Космонавтика] Space Force заключила контракты с ULA и SpaceX на выполнение четырех миссий по обеспечению национальной безопасности
- [Браузеры, Исследования и прогнозы в IT, Медийная реклама, Контекстная реклама] Исследование: восприятие скорости работы браузера зависит от публикаций в СМИ
- [SaaS / S+S, Развитие стартапа, Управление продуктом, Управление продажами] Боль разработчика: «Никогда не давайте пользователям бесплатный тариф»
- [Развитие стартапа, Бизнес-модели, Финансы в IT] Краудфандинговые кампании, которые хайпанули
- [IT-инфраструктура, Карьера в IT-индустрии, DevOps] DevOps-практики: Кто? Где? Сколько?
Теги для поиска: #_c++, #_c, #_programmirovanie_mikrokontrollerov (Программирование микроконтроллеров), #_kompjuternoe_zhelezo (Компьютерное железо), #_stm32, #_stm32f4, #_freertos, #_blog_kompanii_timeweb (
Блог компании Timeweb
), #_c++, #_c, #_programmirovanie_mikrokontrollerov (
Программирование микроконтроллеров
), #_kompjuternoe_zhelezo (
Компьютерное железо
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 20:06
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
При разработке одного девайса на базе STM32F407 столкнулся с проблемой нехватки оперативной памяти. Назначение самого девайса не принципиально, но важно, что изначальный код писался для десктопной системы и его нужно было просто портировать на микроконтроллер под управлением FreeRTOS. А так как исходный код был написан на С++ и вопрос об экономии ОЗУ даже не стоял, то и вылезла соответствующая проблема. Заниматься оптимизацией кода, одновременно добавляя себе проблем с поиском новых ошибок, очень не хотелось. Поэтому своевременно вспомнилось, что данная версия микроконтроллера имеет на борту дополнительный сегмент ОЗУ размером 64К (CCM SRAM), который сейчас никак не был задействован. Эврика — вот оно, решение! Но к сожалению, все оказалось не так просто. Результаты поиска готового решения В официальной документации на CCMRAM приводятся примеры для размещения в ней исполняемого кода, стека или отдельных переменных. Поиск по форумам выдал несколько ссылок на разные способы использования CCMRAM, но к сожалению, все они являлись разными вариациями тех способов, которые были описаны в официальной документации. И все они требовали перелопачивать исходный код для добавления атрибутов при объявлении каждой функции или переменной. Для GCC, в моем случае, примерно вот так: __attribute__((section(".ccmram")));
В добавок, некоторые переменные имеют значение по умолчанию, что потребует модифицировать загрузчик, чтобы такие переменные при старте копировались в отдельную область для инициализированных или обнуленных переменных. Ну и финальной сложностью были ограничения самой CCMRAM. Она висит на отдельной шине к которой у DMA нет доступа, а прямой доступ к памяти планировалось использовать очень активно. Другими словами, решая одну проблему, можно было нечаянно добавить ворох других, и зарыться в отладку для поиска привнесенных багов. К счастью, удалось найти простое решение со стороны FreeRTOS. Размер кучи был меньше размера сегмента CCM RAM и решение напрашивалось само-собой — переместить кучу в данный раздел. И это удалось сделать минимальными правками кода.
В результате — куча FreeRTOS в CCM SRAM с минимальным количеством правок в исходном коде! =========== Источник: habr.com =========== Похожие новости:
Блог компании Timeweb ), #_c++, #_c, #_programmirovanie_mikrokontrollerov ( Программирование микроконтроллеров ), #_kompjuternoe_zhelezo ( Компьютерное железо ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 20:06
Часовой пояс: UTC + 5