|
malloc и free в прерывании |
|
|
|
 |
Ответов
|
Dec 1 2016, 15:41
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(AlexandrY @ Dec 1 2016, 18:17)  Где-то можно, а где-то нельзя. А с чем связана разница? Где можно и где нельзя? Мне надо использовать malloc и free в обработчике прерывания USB. То есть приходит команда по USB и в обработчике я выделяю или освобождаю память.
|
|
|
|
|
Dec 2 2016, 06:20
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(novikovfb @ Dec 2 2016, 08:47)  Почитайте про понятие реентерабельности функций и посмотрите, как работают функции malloc и free в Вашей системной библиотеке. Может получиться, что прерывание возникнет в момент выполнения функции malloc или free, в прерывании будет вызвана функция malloc или free, может получиться либо выделение одного и того же буфера двум разным указателям или полное разрушение структуры кучи. У меня предполагается только один malloc и один free, в прерывании USB, в разных командах. Посмотреть код malloc...он где то в библиотеках запрятан. Не подскажете где его найти для Keil ARM?
|
|
|
|
|
Dec 2 2016, 07:07
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(Atlantis- @ Dec 2 2016, 09:20)  . . . в прерывании USB, в разных командах. Посмотреть код malloc...он где то в библиотеках запрятан. . . . . В прерываниях крайне нежелательно использовать "долгоиграющие" вызовы. Тем более, что USB сейчас довольно "оборотистый", даже 2.0. Как вариант - сделайте свой "malloc", работающий на заранее выделенной области памяти, c быстрым "выделением" и "освобождением" через указател(и) и размер. Его и пользуйте в ISR.
|
|
|
|
|
Dec 2 2016, 07:48
|

Профессионал
    
Группа: Свой
Сообщений: 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 колёс.
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Dec 2 2016, 09:56
|

Гуру
     
Группа: Свой
Сообщений: 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). Мда... Что Вы назвали "вызовом задачи" неведомо никому  . Это раз. Задачи как таковые никакие сообщения не создают, а при собственно передаче сообщения никакого динамического выделения памяти уже не происходит. Ну и третье, если есть уже один менеджер памяти, как в FreeRTOS, причем в исходниках, то вторым пользоваться незачем. Ну и пятое - измеряли время Вы НЕПРАВИЛЬНО, поскольку время отрабатывания парочки malloc/free при отсутствии других вызовов менеджера, не может меняться при хоть сколь-нибудь реальной реализации этих функций.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|