Jump to content

    

Правильное распределение памяти

Здравствйуте коллеги.

У меня два вопроса

1. Написал программу. Использует heap_4. Задачи очереди и семафоры все создаю удаляю динамически. Использую pvMalloc и  pvFree. Добавил embedTLS. У этой либы все выделения памяти через calloc и free. Я хочу чтобы память выделалась для этой либы операционкой через pvMalloc, а не стандартными функциями. Попытался сделать как положено через макросы.

#define MBEDTLS_PLATFORM_C
#define MBEDTLS_PLATFORM_MEMORY

#define MBEDTLS_PLATFORM_FREE_MACRO pfvFree
#define MBEDTLS_PLATFORM_CALLOC_MACRO pvCalloc

Но не могу понять что не так делаю. Ругается по всему коду. Но в основном что не может найти эти функции. Я не вьеду как либе правильно подключить heap_4. Какой правильный путь подключения embeTLS? 

По этому пока написал заплатку. Она рабоатет но я не хочу терять такты на лишнем вызове перекрывая calloc и free.

/*-----------------------------------------------------------*/

void *pvPortCalloc(size_t count, size_t size)
{
	void *pvReturn = NULL;
	size_t len;
	len = count * size;
	pvReturn = pvPortMalloc(len);
	if (pvReturn != NULL)
		memset(pvReturn, 0x00, len);
	return (pvReturn);
}

void *malloc(size_t size)
{
	return (pvPortMalloc(size));
}
void free(void *pv)
{
	vPortFree(pv);
}
void *calloc(size_t count, size_t size)
{
	return (pvPortCalloc(count, size));
}

 

2. Не могу нигде найти информацию, сколько потребляет из стандартной памяти сама Freertos? Так как всё выделение памяти у меня происходит в ОС, то мне не нужны большие размеры стандартной памяти. 

_heap_size  = 400; /* required amount of heap  */
_stack_size = 400; /* required amount of stack */

Скоклько нужно оставлять сандартной памяти для операционки?

 

Share this post


Link to post
Share on other sites
2 часа назад, Andrey75 сказал:

но я не хочу терять такты на лишнем вызове перекрывая calloc и free.

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

Потерявши голову, по волосам не плачут (пословица)  :wink2:

Share this post


Link to post
Share on other sites

Динамическую память я вроде не использовал. Динамическое распределние использую, потому что памяти не хватает. Другого выхода нет.

Да и как бы вопрос не в этом. А в том как правильно подключать либу. Эта заплатка мне не нравится.

 

Share this post


Link to post
Share on other sites
4 часа назад, Andrey75 сказал:

1. Написал программу. ... Использую pvMalloc и  pvFree. Добавил embedTLS. У этой либы все выделения памяти через calloc и free. Я хочу чтобы память выделалась для этой либы операционкой через pvMalloc, а не стандартными функциями. Попытался сделать как положено через макросы.


#define MBEDTLS_PLATFORM_C
#define MBEDTLS_PLATFORM_MEMORY

#define MBEDTLS_PLATFORM_FREE_MACRO pfvFree
#define MBEDTLS_PLATFORM_CALLOC_MACRO pvCalloc

Но не могу понять что не так делаю. Ругается по всему коду.

Открыл heap_4.c. Нету там никаких pfvFree и pvCalloc. Есть pvPortMalloc и vPortFree.

Поэтому

#define MBEDTLS_PLATFORM_C
#define MBEDTLS_PLATFORM_MEMORY

#define MBEDTLS_PLATFORM_FREE_MACRO vPortFree
#define MBEDTLS_PLATFORM_CALLOC_MACRO pvPortСalloc

 

Естественно, в местах использования этих макроопределений должны быть известны vPortFree и pvPortCalloc. Для первой нужно подключить "portable.h", для второй - разрешить место определения функции pvPortCalloc. Например, объявлением.

 

 

55 минут назад, Andrey75 сказал:

Динамическую память я вроде не использовал. Динамическое распределние использую, потому что памяти не хватает. Другого выхода нет.

Браво. Это еще как понимать?

И да, как было правильно замечено, выигрыш от якобы "накладных расходов" на вызов функций является лишь кажущимся на фоне алгоритмов распределения памяти. Толку от него как от козла молока:wink: Но если Вам это лишь как синтаксический сахар - то пожалуйста - выше я описал, как это сделать.

 

Определение

_heap_size = 400;

не имеет к FreeRTOS и динамическому размещению памяти средствами FreeRTOS никакого отношения. Это значит, что эти 400 единиц памяти не будут интерпретироваться динамической памятью в экосфере FreeRTOS. И что значит нужно самой FreeRTOS? FreeRTOS не пользуется динамической памятью для себя, только Вы выделяете объекты, удаляете их и т.д. Для FreeRTOS все это выглядит одинаково как на статическом, так и на динамическом выделении. Она занимает лишь какую-то область памяти программ для хранения кода, памяти ОЗУ для реализации всех механизмов многозадачной ОС. В последнюю входят стек задач, стек самого ядра, глобальные переменные/массивы данных. Сколько выделять общей памяти на стек задач определяется в файле конфигурации FreeRTOSConfig.h или как его там.

Edited by Arlleex

Share this post


Link to post
Share on other sites
2 minutes ago, Arlleex said:

Браво. Это еще как понимать?

Как грамотный ответ на троллинг.

Share this post


Link to post
Share on other sites
1 час назад, Andrey75 сказал:

Динамическую память я вроде не использовал. Динамическое распределние использую, потому что памяти не хватает. Другого выхода нет.

Чушь пишете. Читаем википедию:  https://ru.wikipedia.org/wiki/Динамическая_память

19 минут назад, aaarrr сказал:

Как грамотный ответ на троллинг.

Проясните: что именно "грамотного" в том ответе? И в чём Вы узрели "троллинг"?

Share this post


Link to post
Share on other sites
1 hour ago, jcxz said:

Чушь пишете. Читаем википедию:  https://ru.wikipedia.org/wiki/Динамическая_память

Если принебрежительно относиться к определениям, то не понятно будет что вы имеете ввиду. внешний SDRAM или malloc. А вообще если по делу нечгео сказать, то лучше просто прочитать.

2 hours ago, Arlleex said:

Открыл heap_4.c. Нету там никаких pfvFree и pvCalloc. Есть pvPortMalloc и vPortFree.

Я не уточнил что версия 9.0. По этому возможно вы видете другие названия функций. что качается pvCalloc. То я написал, что я его сам добавил.

2 hours ago, Arlleex said:

Естественно, в местах использования этих макроопределений должны быть известны vPortFree и pvPortCalloc. Для первой нужно подключить "portable.h", для второй - разрешить место определения функции pvPortCalloc. Например, объявлением.

 Как бы это я понимаю. Только момент том, что макросы для mbedtls определяются в mbedtls/config.h а функции распределения памяти описны в freertos/.../Memmang/portable.h.  Но я не уверен что я должен там это прописывать. 

 Вы подключали эту либу или просто теоретически рассуждаете? Я хотел бы узнать как правильно подключать mbettls. Как это опредлено разработчиком. И не делать своих велосипедов. В любом случае спасибо за ответ. 

Edited by Andrey75

Share this post


Link to post
Share on other sites
2 hours ago, Arlleex said:

не имеет к FreeRTOS и динамическому размещению памяти средствами FreeRTOS никакого отношения. Это значит, что эти 400 единиц памяти не будут интерпретироваться динамической памятью в экосфере FreeRTOS. И что значит нужно самой FreeRTOS? FreeRTOS не пользуется динамической памятью для себя, только Вы выделяете объекты, удаляете их и т.д. Для FreeRTOS все это выглядит одинаково как на статическом, так и на динамическом выделении. Она занимает лишь какую-то область памяти программ для хранения кода, памяти ОЗУ для реализации всех механизмов многозадачной ОС. В последнюю входят стек задач, стек самого ядра, глобальные переменные/массивы данных. Сколько выделять общей памяти на стек задач определяется в файле конфигурации FreeRTOSConfig.h или как его там.

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

Share this post


Link to post
Share on other sites
2 hours ago, Arlleex said:

Браво. Это еще как понимать?

И да, как было правильно замечено, выигрыш от якобы "накладных расходов" на вызов функций является лишь кажущимся на фоне алгоритмов распределения памяти. Толку от него как от козла молока:wink: Но если Вам это лишь как синтаксический сахар - то пожалуйста - выше я описал, как это сделать.

Мне не нравятся обвёртки в которых нет вообще никакого смысла. Вызов и возврат из функции занимает не мало тактов  процессора и ест память в стеке.

Share this post


Link to post
Share on other sites
1 hour ago, jcxz said:

Проясните: что именно "грамотного" в том ответе?

Динамическая память и динамически распределяемая память - разные вещи. Даже в википедии.

 

1 hour ago, jcxz said:

И в чём Вы узрели "троллинг"?

Да вот, собственно:

2 hours ago, jcxz said:

Чушь пишете. Читаем википедию

 

10 minutes ago, Andrey75 said:

Вы хотите сказать что я  могу поставить хип и стек 0 и ядро запустится?

Если используется heap_4.c, то стандартный heap может быть 0 - FreeRTOS его не использует.

Share this post


Link to post
Share on other sites
30 minutes ago, aaarrr said:

Если используется heap_4.c, то стандартный heap может быть 0 - FreeRTOS его не использует.

А какой размер стека должен быть?

Share this post


Link to post
Share on other sites
1 час назад, Andrey75 сказал:

Как бы это я понимаю. Только момент том, что макросы для mbedtls определяются в mbedtls/config.h а функции распределения памяти описны в freertos/.../Memmang/portable.h.  Но я не уверен что я должен там это прописывать.

А что мешает-то подключить нужные файлы в mbedtls/config.h? Как API mbedtls будет знать о определениях, замещаемых символами MBEDTLS_PLATFORM_FREE_MACRO и MBEDTLS_PLATFORM_CALLOC_MACRO?

 

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

Вы подключали эту либу или просто теоретически рассуждаете? Я хотел бы узнать как правильно подключать mbettls. Как это опредлено разработчиком. И не делать своих велосипедов. В любом случае спасибо за ответ.

Не подключал. Рассуждаю исходя из логики раздельной компиляции программ и практики подключения различных готовых приложений (стеки, GUI, RTOS и т.д.).

 

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

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

Сколько вложенных вызовов в ядре ОС я не знаю. Расход памяти ядром есть на сайте https://www.freertos.org/FAQMem.html#RAMUse.

heap в 0, stack не в 0 (достаточный объем) и ядро запустится. Опять же, как было отмечено, в конфигурации heap_4.

 

54 минуты назад, Andrey75 сказал:

Мне не нравятся обвёртки в которых нет вообще никакого смысла. Вызов и возврат из функции занимает не мало тактов  процессора и ест память в стеке.

Значит дайте оберткам, предоставленным mbedtls, использовать функции, предоставленные FreeRTOS. Как - первый абзац текущего сообщения.

Edited by Arlleex

Share this post


Link to post
Share on other sites
5 часов назад, Andrey75 сказал:

Если принебрежительно относиться к определениям, то не понятно будет что вы имеете ввиду. внешний SDRAM или malloc. А вообще если по делу нечгео сказать, то лучше просто прочитать.

Как видно из этой строки - Вы пренебрежительно относитесь к русскому языку. Столько ошибок в одной строке! Тем не менее вас ведь понимают?

И если Вы сказанное по делу не понимаете, то может стоит вдумчивее читать? Хоть немного подумать? Прежде чем советовать что-то. Вроде как это вы тут совета просите, а я ваших - не просил.

А моя фраза совершенно понятна из её контекста. С какого перепуга там SDRAM вообще приплелось?

5 часов назад, Andrey75 сказал:

Вызов обычной функции использует стек.

С чего бы это? Учите матчасть! В частности: порядок вызова/возврата из функций в ARM.

Share this post


Link to post
Share on other sites
5 часов назад, Andrey75 сказал:

Мне не нравятся обвёртки в которых нет вообще никакого смысла. Вызов и возврат из функции занимает не мало тактов  процессора и ест память в стеке.

Ещё раз: вызов функции занимает просто многократно меньше тактов, чем само динамическое распределение памяти (так понятнее?).

Статическое распределение занимает == 0 тактов. Любой вызов malloc() (или там чего ещё) - будет несравненно больше. И если Вы уже зачем то использовали динамическую память, то бессмысленно говорить о каких-то тактах на вызов функции. Именно так следовало понимать мою первую фразу.

Share this post


Link to post
Share on other sites
5 часов назад, aaarrr сказал:

Динамическая память и динамически распределяемая память - разные вещи. Даже в википедии.

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

И какое именно толкование имеется в виду - следует понимать из контекста использования.

Если совсем не понятно, то откройте https://ru.wikipedia.org/wiki/Модель_памяти_в_языке_Си и обратите внимание на параграф с заголовком "Динамическая память". Именно так: "Динамическая память".

 

Цитата

Да вот, собственно:

Похоже Вам просто хочется поспорить. По любому вздорному поводу....

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