|
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, 06:46
|
Знающий
   
Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450

|
Цитата(Atlantis- @ Dec 2 2016, 09:20)  У меня предполагается только один malloc и один free, в прерывании USB, в разных командах. Посмотреть код malloc...он где то в библиотеках запрятан. Не подскажете где его найти для Keil ARM? тогда может и будет работать, если по времени успеет. Насчет исходников Keil - не знаю, у IAR были исходники в версии 2009 года, там просмотр связанного списка, поиск первой свободной области достаточного размера, сделана блокировка от повторного входа, но она поможет только в многозадачной среде, т.к. попытка остановить обработчик прерывания до окончания выполнения фоновой задачи добром не кончится. По длительности обработки malloc и free - там, скорее всего, просмотр списка занятых/свободных областей памяти в куче, чем сильнее фрагментирована куча - тем медленнее будет работать.
|
|
|
|
|
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:33
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Померял осциллографом время выполнения malloc, выполняется в основном за 1 мкс иногда за 3 мкс, потыкал, чтобы забить побольше памяти, стало выполняться иногда за 1,2 или 3,2 мкс. Функции вызова задачи FreeRTOS 4,5-6,9 мкс (для создания сообщения там тоже динамически выделяется память, но не с помощью malloc). Мда...
|
|
|
|
|
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
|
|
|
|
|
Dec 2 2016, 11:17
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(zltigo @ Dec 2 2016, 12:56)  Что Вы назвали "вызовом задачи" неведомо никому  . Это раз. Я имел ввиду создание сообщения (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 у меня не выполнялся, а это мизерная задержка.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|