реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Использование операторов new и delete в embedded
_Макс
сообщение Jun 15 2010, 08:03
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Слышал мнение, что использовать new и delete в embedded системах не желательно. Так ли это? С чем это связано? Как можно поступить иначе?
Go to the top of the page
 
+Quote Post
kurtis
сообщение Jun 15 2010, 08:14
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Действительно ли у вас есть такая необходимость в использовании динамически выделяемой памяти? Использовать то можно, только нужно смотреть по ресурсам, если у вас 32 мегабайта ОЗУ, то используйте, проблем никаких нет, а если 4 килобайта, то тут уже нужно думать или искать какой-то custom memory allocator.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 15 2010, 08:14
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Использование динамического выделения памяти неизбежно влечет за собой ряд проблем - оверхед, фрагментация. Но embedded-система - это весьма растяжимое понятие, надо взвешивать все за и против в конкретном случае.
Go to the top of the page
 
+Quote Post
_Макс
сообщение Jun 15 2010, 09:09
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Да собственно ресурсов то Cortex-M3, нужен канал FIFO глубиной до 500 байт. В функциях push и pop по привычке от PC программирования использовал new и delete. Код (субъективно) показался большим, но того хуже, при статическом вызове push (соответственно new внутри) порядка 30 раз программа отказывается выполняться. В отладчике будто она работает, останавливаю, в дизасемблере функции связанные с new и delete. Неужели нельзя сделать 30 вызовов new по три байта?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 15 2010, 09:14
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(_Макс @ Jun 15 2010, 13:09) *
Неужели нельзя сделать 30 вызовов new по три байта?

Вот это как раз хороший пример, как не надо использовать выделение памяти в системе, где этой памяти ограниченное количество. При выделении трех байт получите огромный оверхед по реальному расходу памяти.
Go to the top of the page
 
+Quote Post
_Макс
сообщение Jun 15 2010, 09:17
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Цитата(aaarrr @ Jun 15 2010, 12:14) *
Вот это как раз хороший пример, как не надо использовать выделение памяти в системе, где этой памяти ограниченное количество. При выделении трех байт получите огромный оверхед по реальному расходу памяти.

За счет чего получается оверхед? Сколько % он составляет по сравнению с чистой выделенной памятью?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 15 2010, 09:21
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(_Макс @ Jun 15 2010, 13:17) *
За счет чего получается оверхед?

За счет структур менеджера кучи.

Цитата(_Макс @ Jun 15 2010, 13:17) *
Сколько % он составляет по сравнению с чистой выделенной памятью?

В случае трех байт, пожалуй, более 200%. Точно можно сказать только зная внутренности менеджера.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 15 2010, 09:33
Сообщение #8


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(_Макс @ Jun 15 2010, 13:09) *
Да собственно ресурсов то Cortex-M3, нужен канал FIFO глубиной до 500 байт.

Ну так и забейте статический буфер 500 байт под свою очередь.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Jun 15 2010, 10:07
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Еще один из минусов - нереентерабельность операций new/delete (как впрочем и malloc, free smile.gif )
Да и ИМХО - любая система, динамически аллоцирующая память, должна обрабатывать возможность ее невыделения. Как в этом случае должна будет поступить embedded система, чтоб разработчику не было стыдно? )))
Go to the top of the page
 
+Quote Post
_Макс
сообщение Jun 15 2010, 10:38
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Переписал push и pop, было:
Код
9 030 bytes of readonly  code memory
    72 bytes of readonly  data memory
2 086 bytes of readwrite data memory

Cтало с буфером 300 байт, без единиого иного new:
Код
8 926 bytes of readonly  code memory
   128 bytes of readonly  data memory
1 862 bytes of readwrite data memory

Без особых улучшений, но работает теперь стабильно.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 15 2010, 10:46
Сообщение #11


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(_Макс @ Jun 15 2010, 14:38) *
Без особых улучшений, но работает теперь стабильно.

Статическая компоновка всегда более стабильная, чем динамическая.
В крайнем случае, ошибки вывалятся на этапе компиляции, а не в работе.

Что значит "без особых улучшений"?
Во втором случае уже размещённый буфер занимает места меньше, чем в первом ещё не размещенный


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
_Макс
сообщение Jun 15 2010, 11:48
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Сэкономил 200 байт RAM и 100 байт ROM smile.gif
Если new вызвано статически разве компилятор не выделит место сразу?
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jun 15 2010, 11:52
Сообщение #13


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(_Макс @ Jun 15 2010, 15:48) *
Если new вызвано статически разве компилятор не выделит место сразу?

нет конечно. на то она и динамическая память.
И вообще говоря, компилятор в случае динамической памяти ничего не выделяет. Он лишь функции malloc free вызывает. Готов быть поправленым, если неправ.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 15 2010, 12:06
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(_Макс @ Jun 15 2010, 14:48) *
Сэкономил 200 байт RAM и 100 байт ROM smile.gif
Значит где-то еще new осталось. Менеджер кучи в 100 байт ну никак не уместится.
Цитата(_Макс @ Jun 15 2010, 14:48) *
Если new вызвано статически
Это как? "Ппереведи!"


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Макс
сообщение Jun 15 2010, 12:19
Сообщение #15


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Цитата(Сергей Борщ @ Jun 15 2010, 15:06) *
Значит где-то еще new осталось. Менеджер кучи в 100 байт ну никак не уместится.
Это как? "Ппереведи!"

Точно new больше нету, искал по исходнику.
Я имел в виду например new int, на этапе компиляции известно о том сколько нужно выделить, значит это можно сделать заранее. Хотя сколько раз такой блок будет вызван неизвестно, только если это не конструктор...
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 08:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01406 секунд с 7
ELECTRONIX ©2004-2016