Jump to content

    

Настройки FreeRTOS

Создаю таски

FRTOS1_xTaskCreate((TaskFunction_t)operation_task, (signed char*) "tx", 1024, NULL, 1, NULL);  
FRTOS1_xTaskCreate((TaskFunction_t)log_managment_task, (signed char*) "rx", 512, NULL, 1, NULL);

Все работает.Но если увеличиваю размер стэка

FRTOS1_xTaskCreate((TaskFunction_t)operation_task, (signed char*) "tx", 1024, NULL, 1, NULL);  
FRTOS1_xTaskCreate((TaskFunction_t)log_managment_task, (signed char*) "rx", 1024, NULL, 1, NULL);

Заходит в исключение FRTOS1_vApplicationMallocFailedHook.

А где увеличить стэк?

В FreeRTOSConfig.h есть #define configMINIMAL_STACK_SIZE (200) /* stack size in addressable stack units */ - это для каждого таска или общий размер?

Edited by Jenya7

Share this post


Link to post
Share on other sites
В FreeRTOSConfig.h есть #define configMINIMAL_STACK_SIZE (200) /* stack size in addressable stack units */ - это для каждого таска или общий размер?

 

HeapSize

 

Share this post


Link to post
Share on other sites
В FreeRTOSConfig.h есть #define configMINIMAL_STACK_SIZE (200) /* stack size in addressable stack units */ - это для каждого таска или общий размер?
так мануалов полно в инете....

 

configMINIMAL_STACK_SIZE - это размер стека ТОЛЬКО для IDLE таска.

общий размер, который ртос отьест для всех задач, семафоров, очередей и т.п, задается параметром configTOTAL_HEAP_SIZE

 

Share this post


Link to post
Share on other sites

тогда я ничего не понимаю - у меня - #define configTOTAL_HEAP_SIZE (24576) /* size of heap in bytes */

Share this post


Link to post
Share on other sites

а что дает xPortGetFreeHeapSize() до xTaskCreate()?

Share this post


Link to post
Share on other sites
тогда я ничего не понимаю - у меня - #define configTOTAL_HEAP_SIZE (24576) /* size of heap in bytes */

Ну дык может это говорит о том, что имеет смысл увеличивать? Создали семафор - заняли heap, создали задачу - заняли heap и т.д.

Ваши 2 задачи уже 8кБ памяти будут отжирать сразу.

Share this post


Link to post
Share on other sites
а что дает xPortGetFreeHeapSize() до xTaskCreate()?

 

меня такого не - xPortGetFreeHeapSize()падает тут

       StackType_t *pxStack;

       /* Allocate space for the stack used by the task being created. */
       pxStack = ( StackType_t * ) pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) );

 

 

Ну дык может это говорит о том, что имеет смысл увеличивать? Создали семафор - заняли heap, создали задачу - заняли heap и т.д.

Ваши 2 задачи уже 8кБ памяти будут отжирать сразу.

 

увеличил до 32кило - он не заходит в FRTOS1_vApplicationMallocFailedHook но где то бродит по функциям FreeRTOS. Иногда попадает в функции тасков но программа не работает.

 

ой. заработало. спасибо.

Edited by Jenya7

Share this post


Link to post
Share on other sites

какой хип? heap_1.c, heap_2.c...or heap_4.c?

Share this post


Link to post
Share on other sites
какой хип? heap_1.c, heap_2.c...or heap_4.c?

 

#define configUSE_HEAP_SCHEME 4 /* either 1 (only alloc), 2 (alloc/free), 3 (malloc), 4 (coalesc blocks), 5 (multiple blocks), 6 (newlib) */

 

а какой лучше?

Edited by Jenya7

Share this post


Link to post
Share on other sites

Отладчиком религия не позволяет пользоваться ?

Share this post


Link to post
Share on other sites
Отладчиком религия не позволяет пользоваться ?

 

отладчик плохо работает с фриартосом. нужно ставить плагин.

Share this post


Link to post
Share on other sites

Чтобы бездумно не увеличивать размер стека под задачи и, соответственно, размер кучи, посмотрите столько реально каждая задача у вас сейчас потребляет. На хабре есть очень интересная статья по этому поводу - ссылка на статью

Share this post


Link to post
Share on other sites

какая-то кастомная FreeRTOS. Добавлена какая-то configUSE_HEAP_SCHEME , нет xPortGetFreeHeapSize()....

 

а какой лучше?
лучше та, которая вам нужна. Я обычно использую heap_1.c, мне не нужно динамически задачи создавать и удалять. не будет фрагментации. почитайте про схемы, выберете себе подходящую.

 

Вот тут про память, кучи, стеки разжованно. Если после запуска планировщика не создаете/удаляете задачи/симафоры/очереди, то heap_1.

Share this post


Link to post
Share on other sites
Чтобы бездумно не увеличивать размер стека под задачи и, соответственно, размер кучи, посмотрите столько реально каждая задача у вас сейчас потребляет. На хабре есть очень интересная статья по этому поводу - ссылка на статью

 

спасибо. интересная статья.

 

какая-то кастомная FreeRTOS. Добавлена какая-то configUSE_HEAP_SCHEME , нет xPortGetFreeHeapSize()....

 

лучше та, которая вам нужна. Я обычно использую heap_1.c, мне не нужно динамически задачи создавать и удалять. не будет фрагментации. почитайте про схемы, выберете себе подходящую.

 

Вот тут про память, кучи, стеки разжованно. Если после запуска планировщика не создаете/удаляете задачи/симафоры/очереди, то heap_1.

 

спасибо. у меня были сомнения - не люблю динамическую алокацию. попробую heap_1.

Share this post


Link to post
Share on other sites
отладчик плохо работает с фриартосом. нужно ставить плагин.

Даже не знаю, что и сказать на это замечание.

 

Наверное так - отладчику наплевать на FreeRTOS.

Как и всё остальное. Что скажешь, то и делает.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now