В какой области памяти DDR размещена куча FreeRTOS (устройство Zynq 700)?

Я изо всех сил пытаюсь понять концепцию управления памятью в FreeRTOS и был бы признателен, если бы кто-нибудь подтвердил мое понимание вещей.

У меня есть устройство Zynq 7000, в котором я реализовал некоторую пользовательскую логику и контроллер AXI DMA на стороне FPGA SoC. Эта логика по существу генерирует некоторые выборки данных, которые затем записываются в память DDR. Что касается процессора, у меня установлена ​​FreeRTOS (v10), которая должна принимать эти данные, записанные в DDR, и выполнять некоторую обработку.

Теперь использование AXI DMA означает, что я должен указать некоторую область памяти в DDR для контроллера DMA, куда могут быть записаны сэмплы. В моем baremetal-приложении это было относительно просто, так как я мог указать любой регион в DDR, который не был зарезервирован системой (что я мог видеть на карте памяти). Что касается FreeRTOS, это не так просто, потому что, очевидно, FreeRTOS зарезервировала часть этой памяти для своей кучи, и я не знаю, какие области памяти можно использовать, а какие нет.

Итак, как мне узнать, какие области памяти все еще не распределены и свободны для использования? Или я могу (и должен) использовать pvPortMalloc(), чтобы сначала выделить часть памяти, которую я затем буду использовать для своих транзакций DMA? Безопасно ли использовать pvPortMalloc() в коде моего приложения? Кроме того, функция pvPortMalloc() выделяет мне память в куче FreeRTOS или из всей доступной памяти в DDR?


person rongard    schedule 23.11.2019    source источник


Ответы (2)


Итак, как мне узнать, какие области памяти все еще не распределены и свободны для использования? Или я могу (и должен) использовать pvPortMalloc(), чтобы сначала выделить часть памяти, которую я затем буду использовать для своих транзакций DMA? Безопасно ли использовать pvPortMalloc() в коде моего приложения?

Да, в отличие от приложения на «голом железе», в FreeRTOS вы можете выделить пространство памяти, просто вызвав pvPortMalloc(bytesize), а затем передать возвращенный ненулевой указатель и размер выделенного пространства в байтах. к вашему DMA-контроллеру. Также перепроверьте, что контроллер DMA не будет записывать за пределы выделенного пространства (поскольку это может нарушить внутреннюю структуру данных управления свободными блоками памяти).

Вам не нужно знать детали, например. какие блоки памяти свободны, какие уже выделены под другие задачи... и т.д. В зависимости от реализации кучи, выбранной в вашем проекте FreeRTOS, блоки свободной памяти внутренне управляются в heap_x.c см. различные реализации кучи в FreeRTOS

Кроме того, функция pvPortMalloc() выделяет мне память в куче FreeRTOS или из всей доступной памяти в DDR?

pvPortMalloc() выделяет место только в куче FreeRTOS, его размер определяется параметром определения configTOTAL_HEAP_SIZE.

person Han    schedule 23.11.2019

Если вы используете heap_1, heap_2, heap_4 (рекомендуется) или heap_5, то куча фактически является статически выделенный массив, что означает, что он переходит в раздел .bss - в какую память он затем попадает, зависит от того, где ваш скрипт компоновщика помещает .bss.

person Richard    schedule 24.11.2019