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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> malloc и free в прерывании
Atlantis-
сообщение Dec 1 2016, 15:06
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Здравствуйте!
Подскажите пожалуйста, можно ли использовать функции динамического выделения памяти malloc и free в обработчике какого либо прерывания? Если да, то как примерно оценить время выполнения этой функции?
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Dec 1 2016, 15:17
Сообщение #2


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Atlantis- @ Dec 1 2016, 17:06) *
Здравствуйте!
Подскажите пожалуйста, можно ли использовать функции динамического выделения памяти malloc и free в обработчике какого либо прерывания? Если да, то как примерно оценить время выполнения этой функции?


Где-то можно, а где-то нельзя.
Время оценивают по таймеру и статистике. Для этого есть инструменты профайлинга.
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Dec 1 2016, 15:41
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(AlexandrY @ Dec 1 2016, 18:17) *
Где-то можно, а где-то нельзя.

А с чем связана разница? Где можно и где нельзя? Мне надо использовать malloc и free в обработчике прерывания USB. То есть приходит команда по USB и в обработчике я выделяю или освобождаю память.


Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 1 2016, 15:47
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Atlantis- @ Dec 1 2016, 17:41) *
А с чем связана разница? Где можно и где нельзя?

Изучаете исходные тексты КОНКРЕТНОЙ используемой Вами в каждом конкретном случае функции и решаете в каждом КОНКРЕТНОМ случае можете такой вариант функции использовать или нет. Если нет, то можно-ли сие исправить, например, оберткой, или надо менять более серьезно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Dec 2 2016, 05:47
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



Цитата(Atlantis- @ Dec 1 2016, 18:41) *
А с чем связана разница? Где можно и где нельзя? Мне надо использовать malloc и free в обработчике прерывания USB. То есть приходит команда по USB и в обработчике я выделяю или освобождаю память.

Почитайте про понятие реентерабельности функций и посмотрите, как работают функции malloc и free в Вашей системной библиотеке. Может получиться, что прерывание возникнет в момент выполнения функции malloc или free, в прерывании будет вызвана функция malloc или free, может получиться либо выделение одного и того же буфера двум разным указателям или полное разрушение структуры кучи.
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Dec 2 2016, 06:20
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(novikovfb @ Dec 2 2016, 08:47) *
Почитайте про понятие реентерабельности функций и посмотрите, как работают функции malloc и free в Вашей системной библиотеке. Может получиться, что прерывание возникнет в момент выполнения функции malloc или free, в прерывании будет вызвана функция malloc или free, может получиться либо выделение одного и того же буфера двум разным указателям или полное разрушение структуры кучи.

У меня предполагается только один malloc и один free, в прерывании USB, в разных командах.
Посмотреть код malloc...он где то в библиотеках запрятан. Не подскажете где его найти для Keil ARM?
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Dec 2 2016, 06:46
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



Цитата(Atlantis- @ Dec 2 2016, 09:20) *
У меня предполагается только один malloc и один free, в прерывании USB, в разных командах.
Посмотреть код malloc...он где то в библиотеках запрятан. Не подскажете где его найти для Keil ARM?

тогда может и будет работать, если по времени успеет. Насчет исходников Keil - не знаю, у IAR были исходники в версии 2009 года, там просмотр связанного списка, поиск первой свободной области достаточного размера, сделана блокировка от повторного входа, но она поможет только в многозадачной среде, т.к. попытка остановить обработчик прерывания до окончания выполнения фоновой задачи добром не кончится.
По длительности обработки malloc и free - там, скорее всего, просмотр списка занятых/свободных областей памяти в куче, чем сильнее фрагментирована куча - тем медленнее будет работать.
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Dec 2 2016, 07:06
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Понятно, а если эта куча выделена во внешней SDRAM памяти, как у меня, наверно, еще медленнее будет.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Dec 2 2016, 07:07
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Atlantis- @ Dec 2 2016, 09:20) *
. . . в прерывании USB, в разных командах.
Посмотреть код malloc...он где то в библиотеках запрятан. . . . .

В прерываниях крайне нежелательно использовать "долгоиграющие" вызовы.
Тем более, что USB сейчас довольно "оборотистый", даже 2.0.
Как вариант - сделайте свой "malloc", работающий на заранее выделенной области памяти, c быстрым "выделением" и "освобождением"
через указател(и) и размер. Его и пользуйте в ISR.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Dec 2 2016, 07:48
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(k155la3 @ Dec 2 2016, 10:07) *
В прерываниях крайне нежелательно использовать "долгоиграющие" вызовы.

Крайне нежелательно мыслить исключительно догмами. Правильный ответ - во втором уже сообщении, "где-то можно, где-то нет".
Если понимать, что происходит и представлять себе последствия, можно делать всё, что нужно.
Прерывания в современных контроллерах (читай "cortex-M") - вполне себе недо-операционка. С многими уровнями вложенности задач, если надо.


Цитата(k155la3 @ Dec 2 2016, 10:07) *
Тем более, что USB сейчас довольно "оборотистый", даже 2.0.

USB, даже 2.0, даже в 2016 году ещё поискать надо. В большинстве контроллеров бесплатно (без дополнительного PHY) до сих пор full-speed. И его до сих пор хватает для очень многих изделий.

Цитата(k155la3 @ Dec 2 2016, 10:07) *
Как вариант - сделайте свой "malloc", работающий на заранее выделенной области памяти, c быстрым "выделением" и "освобождением"
через указател(и) и размер. Его и пользуйте в ISR.

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


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
megajohn
сообщение Dec 2 2016, 09:21
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(esaulenka @ Dec 2 2016, 10:48) *
А вот совет "из г-на и палок быстренько сделайте свой велосипед" может выйти боком, когда через полгода у этого велосипеда окажется 13 колёс.


давно ли пулы памяти это велосипед ?


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Dec 2 2016, 09:33
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Померял осциллографом время выполнения malloc, выполняется в основном за 1 мкс иногда за 3 мкс, потыкал, чтобы забить побольше памяти, стало выполняться иногда за 1,2 или 3,2 мкс.
Функции вызова задачи FreeRTOS 4,5-6,9 мкс (для создания сообщения там тоже динамически выделяется память, но не с помощью malloc). Мда...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 2 2016, 09:56
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (esaulenka @ Dec 2 2016, 09:48) *
А вот совет "из г-на и палок быстренько сделайте свой велосипед"....

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


QUOTE (Atlantis- @ Dec 2 2016, 11:33) *
Функции вызова задачи FreeRTOS 4,5-6,9 мкс (для создания сообщения там тоже динамически выделяется память, но не с помощью malloc). Мда...

Что Вы назвали "вызовом задачи" неведомо никому sad.gif. Это раз. Задачи как таковые никакие сообщения не создают, а при собственно передаче сообщения никакого динамического выделения памяти уже не происходит. Ну и третье, если есть уже один менеджер памяти, как в FreeRTOS, причем в исходниках, то вторым пользоваться незачем. Ну и пятое - измеряли время Вы НЕПРАВИЛЬНО, поскольку время отрабатывания парочки malloc/free при отсутствии других вызовов менеджера, не может меняться при хоть сколь-нибудь реальной реализации этих функций.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Dec 2 2016, 10:15
Сообщение #14


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



Цитата(zltigo @ Dec 2 2016, 12:56) *
время отрабатывания парочки malloc/free при отсутствии других вызовов менеджера, не может меняться при хоть сколь-нибудь реальной реализации этих функций.

с каких пор просмотр связанного списка (а очень часто именно на нем делают управление кучей) перестал зависеть от длины этого списка?
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Dec 2 2016, 11:17
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(zltigo @ Dec 2 2016, 12:56) *
Что Вы назвали "вызовом задачи" неведомо никому sad.gif. Это раз.

Я имел ввиду создание сообщения (Message) и отправку его в очередь (osMessagePut).
Данное сообщение потом разблокирует задачу и в ней выполняется malloc

Цитата(zltigo @ Dec 2 2016, 12:56) *
Задачи как таковые никакие сообщения не создают, а при собственно передаче сообщения никакого динамического выделения памяти уже не происходит.

Не создают, я сам создаю, в прерывании и память динамически выделяю, средствами RTOS

Цитата(zltigo @ Dec 2 2016, 12:56) *
Ну и третье, если есть уже один менеджер памяти, как в FreeRTOS, причем в исходниках, то вторым пользоваться незачем.

Менеджер памяти в FreeRTOS копается в внутренней RAM процессора (причем в статически выделенном ему кусочке этой RAM). А malloc выделяет память из внешней SDRAM.

Цитата(zltigo @ Dec 2 2016, 12:56) *
Ну и пятое - измеряли время Вы НЕПРАВИЛЬНО, поскольку время отрабатывания парочки malloc/free при отсутствии других вызовов менеджера, не может меняться при хоть сколь-нибудь реальной реализации этих функций.

Не знаю, дернул ножкой вверх до выполнения malloc и дернул вниз после выполнения. Хотя возможно в процессе вклинилось другое прерывание...ну не суть, главное, что дольше 3 мкс malloc у меня не выполнялся, а это мизерная задержка.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 23:50
Рейтинг@Mail.ru


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