Перейти к содержанию
    

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

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

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

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 */

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 или как его там.

Изменено пользователем Arlleex

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, Arlleex said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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. Как это опредлено разработчиком. И не делать своих велосипедов. В любом случае спасибо за ответ. 

Изменено пользователем Andrey75

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Arlleex said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Arlleex said:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 его не использует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 minutes ago, aaarrr said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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. Как - первый абзац текущего сообщения.

Изменено пользователем Arlleex

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

 

Цитата

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...