Размер heap FreeRTOSConfig.h и в настройках IAR. В чем разница?
С недавних пор решил освоить FreeRTOS, вроде все понятно, но есть пара вопросов по поводу кучи. Использую IAR и порт FreeRTOS для Cortex-M0.
В настройках линкера IAR есть два поля (размер stack и heap), с этим все понятно. Но в файле FreeRTOSConfig.h снова необходимо указать размер heap. Я так понимаю, размер кучи, указываемой в настройках линкера - это для функций malloc(), а размер, указываемый в файле FreeRTOSConfig.h - это для pvPortMalloc()?
Да, верно понимаете. У IAR и у FreeRTOS - у каждого свой heap. Если вы собираетесь выделять динамическую память только средствами ОС, можно смело поставить в настройках линкера размер heap = 0.
Со стеком немного сложнее. Есть стек, память под который выделяется линкером. Его отключать нельзя, иначе не сможет работать ОС. И плюс еще у FreeRTOS есть свой стек, точнее набор стеков, для каждого таска свой. За их размер отвечает параметр configMINIMAL_STACK_SIZE в конфиге. Кроме того, при создании таска размер стека для него можно переопределить.
Спасибо за ответ. А если использовать heap_3, в котором, как описано в документации, используется стандартный malloc()? Тогда размер heap для ОС будет выделяться из пространства, указанного в линкере?
Хотелось бы поправить @Ocelot
Есть стек для операционки, а есть стек для "основной части". В иаре вы настраиваете стек для прерываний, main и стартапа (если он юзает озушные данные). А куча фрертосины это уже чисто под задачи и всяческие сообщения и их производные. Поэтому стоит "подсчитать" стек прерываний и майна и выделить под это дело соответствующее место. У меня бывало что прерывания портили данные)) Замечу что обычный стек лежит в конце озу. Куча freertos просто массив в глобалке.
Рекомендую юзать heap4.c