Вставленное вами сообщение об ошибке указывает на то, что компоновщик прошел 780 байт за конец доступной области ОЗУ.В вашем случае (STM32F103R8T6) он попытался поместить 21260 байт (20 КБ + 780) в ОЗУ, которое определено для размещения только 20 КБ.Если вы уменьшите configTOTAL_HEAP_SIZE
на сумму, указанную компоновщиком, он, скорее всего, сработает.Однако для обычной / не относящейся к RTOS кучи останется 0 свободного места, поэтому malloc
или new
не будет успешным, если какая-либо часть вашего кода захочет его использовать.
Вы можете точно определить, что получитпоместите в ОЗУ ваш компоновщик, проанализировав файл * .map (sidenote: файл карты создается только в том случае, если ваша программа была успешно связана, поэтому вам нужно как минимум перевести ее в это состояние).Когда вы открываете его, ищите 20000000
(начало вашей области ОЗУ), и там вы должны увидеть, что именно там находится, включая размер каждого куска.
Если вы не сделали что-то необычное дляваш проект (который, я думаю, можно предположить, что вы этого не сделали, как вы упомянули при использовании сгенерированного проекта), область ОЗУ во время компоновки должна как минимум соответствовать следующим разделам:
.data
сегмент, где такие вещи, как глобальные переменные, инициализированные значением, живут
.bss
сегмент, который аналогичен приведенному выше, за исключением того, что значения инициализируются нулями.Это то место, где в конечном итоге будет помещен байтовый массив размером configTOTAL_HEAP_SIZE
, который RTOS использует в качестве своей собственной кучи
Stack (не путайте с размерами стека RTOS, этот совершенно отдельный) - стек, используемый вне задач RTOS.Это имеет постоянный размер - обратитесь к вашему файлу sections.ld
, чтобы найти значение.
Сегмент кучи, размер которого динамически рассчитывается компоновщиком и равен общему объему оперативной памяти минус.размер всех остальных разделов.Чем больше вы сделаете ваши другие сегменты, тем меньше будет ваша обычная куча.
Сказав это, помимо просмотра файла * .map, чтобы определить, что еще кроме кучи RTOSзанимает вашу оперативную память, я бы также дважды подумал о том, почему вам нужно 12 КБ (из общего количества 20 КБ), выделенных только для кучи RTOS.Такие вещи, как вам нужно так много задач, им нужны такие большие стеки, вам нужно так много / очень большие очереди / мьютексы / семафоры.