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

 
 
> 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
 
Start new topic
Ответов
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
novikovfb
сообщение Dec 2 2016, 05:47
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 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
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 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
k155la3
сообщение Dec 2 2016, 07:07
Сообщение #6


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

Группа: Свой
Сообщений: 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
Сообщение #7


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

Группа: Свой
Сообщений: 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
zltigo
сообщение Dec 2 2016, 09:56
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #9


Знающий
****

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



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

с каких пор просмотр связанного списка (а очень часто именно на нем делают управление кучей) перестал зависеть от длины этого списка?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Atlantis-   malloc и free в прерывании   Dec 1 2016, 15:06
|- - zltigo   QUOTE (Atlantis- @ Dec 1 2016, 17:41...   Dec 1 2016, 15:47
|- - novikovfb   Цитата(Atlantis- @ Dec 2 2016, 09:20...   Dec 2 2016, 06:46
|- - megajohn   Цитата(esaulenka @ Dec 2 2016, 10:48) А в...   Dec 2 2016, 09:21
|||- - zltigo   QUOTE (novikovfb @ Dec 2 2016, 12:15) с к...   Dec 2 2016, 12:03
||- - Atlantis-   Цитата(zltigo @ Dec 2 2016, 12:56) Что Вы...   Dec 2 2016, 11:17
||- - AlexandrY   Цитата(Atlantis- @ Dec 2 2016, 13:17...   Dec 2 2016, 11:52
||- - Atlantis-   Цитата(AlexandrY @ Dec 2 2016, 14:52) Реж...   Dec 2 2016, 12:18
||- - AlexandrY   Цитата(Atlantis- @ Dec 2 2016, 14:18...   Dec 5 2016, 14:23
|- - k155la3   Цитата(esaulenka @ Dec 2 2016, 11:48) (1)...   Dec 2 2016, 12:54
|- - jcxz   Цитата(esaulenka @ Dec 2 2016, 10:48) Есл...   Dec 3 2016, 10:50
- - Atlantis-   Понятно, а если эта куча выделена во внешней SDRAM...   Dec 2 2016, 07:06
- - Atlantis-   Померял осциллографом время выполнения malloc, вып...   Dec 2 2016, 09:33
- - haker_fox   QUOTE (Atlantis- @ Dec 1 2016, 23:06...   Dec 2 2016, 15:54
- - jorikdima   Если ксть СДРАМ, которой обычно много, вы уверены,...   Dec 2 2016, 18:49
|- - Atlantis-   Цитата(jorikdima @ Dec 2 2016, 21:49) Есл...   Dec 5 2016, 07:33
|- - novikovfb   Цитата(Atlantis- @ Dec 5 2016, 10:33...   Dec 5 2016, 10:04
|- - Atlantis-   Цитата(novikovfb @ Dec 5 2016, 13:04) есл...   Dec 5 2016, 12:10
- - Valentine Loginov   Просто пройду мимо и плюсану тех, кто говорил про ...   Dec 8 2016, 07:42
- - Atlantis-   Цитата(Valentine Loginov @ Dec 8 2016, 10...   Dec 8 2016, 08:45


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

 


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


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