Область хранения публичных переменных в среде freeRTOS - PullRequest
0 голосов
/ 19 сентября 2018

Где глобальные публичные переменные (не объявленные внутри тела задачи) хранятся в среде FreeRTOS?

Какая конфигурация размера памяти в системе гарантирует, что они получат достаточно (непересекающегося) пространства для хранения, например:

  1. configTOTAL_HEAP_SIZE, определенное в FreeRTOSConfig.hили

  2. эти параметры определены в скрипте компоновщика:
    _Min_Heap_Size = 0x200; /* required amount of heap */ _Min_Stack_Size = 0x400; /* required amount of stack */

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

FreeRTOS поставляется в виде исходного кода C, который скомпилирован как часть вашего проекта вместе с другим исходным кодом C - так, если только вы не используете скрипт компоновщика клиента (как в случае, если вы использовали версию FreeRTOS)который поддерживает защиту памяти), тогда ответ на оригинальный вопрос - где все хранится, точно так же, как если бы FreeRTOS не использовался, так как ваш компилятор просто видит C-код.Поэтому, как и в любой другой стандартной программе на C, вы можете увеличивать размер своих структур до тех пор, пока они не станут слишком большими, чтобы уместиться на используемом вами MCU - вы будете знать, когда это произойдет, потому что [при условии правильности сценария компоновщика] приложение не будетдлинная ссылка.Если вы видите, что эти структуры повреждены, то это по другой причине, например, переполнение стека, а не потому, что они хранятся не в том месте.Некоторые ссылки, которые могут помочь:
https://www.freertos.org/a00110.html#configASSERT
https://www.freertos.org/Stacks-and-stack-overflow-checking.html

0 голосов
/ 19 сентября 2018

Они хранятся в глобальной памяти, но не «в куче» в том смысле, что компилятор C не будет генерировать вызовы FreeRTOS heap_x.c (где x - один из номеров реализации кучи) длявыделите эту память, она просто вставит ее в правильный раздел, и компоновщик разместит этот раздел где-то в памяти.

Память, используемая в качестве резервного хранилища кучи, как правило, также будет иметь ту же форму,то есть мы имеем это в heap_2.c:

static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];

, который просто объявляет глобальную переменную, которая является массивом указанного размера;затем компоновщик поместит его в фактическую память, как и любая другая переменная.

Предполагается, что используется платформа на основе флэш-памяти, то есть не та, на которой программа FreeRTOS динамически *1012* загружается при запуске.- время от некоторого кода, в этом случае, конечно, этот код должен помещать все разделы программы в память и может действительно выделять кучу памяти для этого.

...