Jump to content
    

RapidJSON и FreeRTOS

Как правильно приделать одно к другому (в смысле аллокатора памяти)?

 

Share this post


Link to post
Share on other sites

А какие проблемы с аллокатором?

У FreeRTOS из 5 штук - выбирайте любой

RapidJSON:

  Allocator::Malloc -> pvPortMalloc

  Allocator::Free -> vPortFree

  Allocator::Realloc -> pvPortMalloc + vPortFree

 

Share this post


Link to post
Share on other sites

1 hour ago, tonyk_av said:

А память не утечёт?

С чего бы? Выделяете новую память требуемого размера, копируете в неё старое содержимое, старую память освобождаете.

 

Share this post


Link to post
Share on other sites

1 minute ago, xvr said:

С чего бы?

Но ведь на месте освобождённой будет "дырка". Где гарантия того, что при следующем обращении будет запрошена память размером с "дырку"?

Share this post


Link to post
Share on other sites

Just now, tonyk_av said:

Но ведь на месте освобождённой будет "дырка". Где гарантия того, что при следующем обращении будет запрошена память размером с "дырку"?

Этим занимается менеджер памяти (точнее heap_2, heap_4 или heap_5). Если будет запрос подходящего размера, то он займёт 'дырку'.

 

Share this post


Link to post
Share on other sites

В 21.05.2023 в 09:54, Axel сказал:

Как правильно приделать одно к другому (в смысле аллокатора памяти)?

Правильно - не использовать аллокатор вообще.

Share this post


Link to post
Share on other sites

3 часа назад, xvr сказал:

Этим занимается менеджер памяти (точнее heap_2, heap_4 или heap_5). Если будет запрос подходящего размера, то он займёт 'дырку'.

А потом снаружи поступят запросы неподходящего размера, менеджер дырки занять не сможет, исчерпает память и будет очередной "фобос-в-грунт". Проблема в непредсказуемости.

Share this post


Link to post
Share on other sites

1 hour ago, _3m said:

А потом снаружи поступят запросы неподходящего размера, менеджер дырки занять не сможет, исчерпает память и будет очередной "фобос-в-грунт".

Вот-вот, я на это и намекал.

Тем не менее, ИМХО, выход есть. Если известны размеры полей, то можно написать свой распределитель памяти, который будет учитывать специфику обрабатываемых данных и будет распределять память без "дырок".

1 hour ago, _3m said:

Проблема в непредсказуемости.

Она решается путём статического распределения памяти для определённого количества элементов. Да, будет резервироваться некоторый избыток памяти, который останется неиспользованным, но по другому нельзя, иначе " будет очередной "фобос-в-грунт".

Кстати, NASA разрешает использовать в программах malloc-free и new-delete до входа в основной цикл программы управления. Внутри него запрещено динамическое выделение памяти.

Share this post


Link to post
Share on other sites

5 hours ago, _3m said:

А потом снаружи поступят запросы неподходящего размера, менеджер дырки занять не сможет,

Это общая проблема любых алокаторов памяти. К связке FreeRTOS и RapidJSON она отношения не имеет.

 

Share this post


Link to post
Share on other sites

16 часов назад, tonyk_av сказал:

Она решается путём статического распределения памяти для определённого количества элементов. Да, будет резервироваться некоторый избыток памяти, который останется неиспользованным, но по другому нельзя

А почему "избыток" и откуда распространённое заблуждение, что статическое распределение требует больше памяти? Статическое распределение как правило требует меньше памяти. Но да - оно требует бОльшего мастерства от кодонаписателя.

Share this post


Link to post
Share on other sites

Фрагментация кучи на физической памяти — неустранимая проблема. Успешно она преодолевается при использовании  виртуальной памяти — сиречь через MMU.

Share this post


Link to post
Share on other sites

9 hours ago, jcxz said:

Сатическое распределение как правило требует меньше памяти.

Нет, бОльшего. Ведь приходится резервировать память, априори не зная реальную потребность. По-уму, нужно накопить статистику потребности, чтобы минимизировать избыточность.

9 hours ago, jcxz said:

Но да - оно требует бОльшего мастерства от кодонаписателя.

Как раз наоборот, меньшего.

 

У меня в ПЛК именно так сделана поддержка Модбас и I2C. Никто не может предсказать, сколько пользователь активирует функциональных блоков "Запрос по Модбас", поэтому выделяется какое-то разумное количество памяти для запросов.

3 hours ago, dxp said:

Фрагментация кучи на физической памяти — неустранимая проблема. Успешно она преодолевается при использовании  виртуальной памяти — сиречь через MMU.

По-честному- это не преодоление. Никто не знает, в какой момент потребуется переконфигурация MMU для уборки "дырок". Может, в этот момент будет работать алгоритм аварийной защиты, а мы остановим процессор для обслуживания памяти. По этой причине в контроллерах, управляющих ответственным оборудованием, запрещено использование языков программирования, которым необходимо динамическое управление памятью.

Edited by tonyk_av

Share this post


Link to post
Share on other sites

1 час назад, tonyk_av сказал:

Нет, бОльшего. Ведь приходится резервировать память, априори не зная реальную потребность...

Про оверлеи слышали? Функционал изделия довольно часто можно разбить на независимые части, которым не обязательно работать всегда одновременно...

Share this post


Link to post
Share on other sites

11 minutes ago, Arlleex said:

Про оверлеи слышали?

С ПЛК работали? Там такая штука не канает.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...