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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> malloc и free в прерывании
AlexandrY
сообщение Dec 2 2016, 11:52
Сообщение #16


Ally
******

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



Цитата(Atlantis- @ Dec 2 2016, 13:17) *
Не знаю, дернул ножкой вверх до выполнения malloc и дернул вниз после выполнения. Хотя возможно в процессе вклинилось другое прерывание...ну не суть, главное, что дольше 3 мкс malloc у меня не выполнялся, а это мизерная задержка.


Режим Persistence на осциллографе был включен?

И что, израсходуете malloc только для этого единственного прерывания?
Потом будете жалеть, когда подзабудете весь код, а понадобится его реюзинг.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 2 2016, 12:03
Сообщение #17


Гуру
******

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



QUOTE (novikovfb @ Dec 2 2016, 12:15) *
с каких пор просмотр связанного списка (а очень часто именно на нем делают управление кучей) перестал зависеть от длины этого списка?

C тех пор, как по условиям теста этот список НЕ МЕНЯЕТСЯ. Разброс времен у Автора был вызван незакрытыми прерываниями при вызове менеджера и ничем более.


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


Местный
***

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



Цитата(AlexandrY @ Dec 2 2016, 14:52) *
Режим Persistence на осциллографе был включен?

Не уверен, что точно понял, что Вы имеете ввиду. На осциллографе у меня есть режим Auto и Normal, был включен второй - когда засеченный импульс не уплывает, а остается на экране.

Цитата(AlexandrY @ Dec 2 2016, 14:52) *
И что, израсходуете malloc только для этого единственного прерывания?
Потом будете жалеть, когда подзабудете весь код, а понадобится его реюзинг.

Зато избавлюсь от лишней задачи
Go to the top of the page
 
+Quote Post
k155la3
сообщение Dec 2 2016, 12:54
Сообщение #19


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

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



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

(1) - Я не настолько религиозен sm.gif
(2) Согласен. В рамках здравого смысла и уголовного кодекса.
(3) Согласен. Если не следовать (1,2)

Go to the top of the page
 
+Quote Post
haker_fox
сообщение Dec 2 2016, 15:54
Сообщение #20


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



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

Да, но я бы не стал (имхо). Нельзя ли просто выделить память статически, или динамически, но создавать её при подключении usb и удалять при отключении?

QUOTE (Atlantis- @ Dec 2 2016, 19:17) *
Менеджер памяти в FreeRTOS копается в внутренней RAM процессора (причем в статически выделенном ему кусочке этой RAM). А malloc выделяет память из внешней SDRAM.

А зачем так сложно? Сделайте один менеджер в SDRAM, переопределите операты new и delete, если используете Си++.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Dec 2 2016, 18:49
Сообщение #21


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

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



Если ксть СДРАМ, которой обычно много, вы уверены, что вообще нужна дин. память? Тем более только в одном месте, как сказали.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 3 2016, 10:50
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(esaulenka @ Dec 2 2016, 10:48) *
Если понимать, что происходит и представлять себе последствия, можно делать всё, что нужно.

Тоже подпишусь под этим высказыванием - Вы полностью правы!
Вот только из сообщений ТС видно, что он не представляет.

Цитата(esaulenka @ Dec 2 2016, 10:48) *
Прерывания в современных контроллерах (читай "cortex-M") - вполне себе недо-операционка. С многими уровнями вложенности задач, если надо.

.....только без возможности вытеснения более приоритетной "задачи" менее приоритетной, в случае захвата последней ресурса, нужного первой. Это корневое отличие.

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

Так и будет wink.gif И в случае начинающего велосипедостроителя (что мы имеем), первого компонента будет много больше чем 2-го wink.gif

Цитата(haker_fox @ Dec 2 2016, 18:54) *
Да, но я бы не стал (имхо). Нельзя ли просто выделить память статически, или динамически, но создавать её при подключении usb и удалять при отключении?

Для связных применений, особенно если в ПО имеется несколько каналов связи с несколькими драйверами, лучше создать "кучу" в виде распределённого статически массива блоков фиксированного размера. Размер блока (оптимально) == размеру максимального кадра протокола связи (протоколов, если обмен идёт по нескольким протоколам одновременно).
Выделение свободного блока из такой "кучи" можно организовать разными способами. Самый универсальный: изначально поместить дескрипторы всех блоков нашей "кучи" в FIFO-очередь свободных блоков, откуда их будет при необходимости брать каждый драйвер канала связи, заполнять и помещать в другую очередь (или какой другой механизм) на вход целевого процесса (процессов, если протоколов несколько) обработки входящих связных кадров. После обработки и освобождения блока, его дескриптор должен возвращаться в исходную очередь свободных дескрипторов.
Дескриптор блока здесь - это просто индекс соответствующего элемента в массиве-"куче".
Пул свободных дескрипторов и очереди дескрипторов между драйверами связи и обработчиками можно организовать и проще, если дескрипторов мало, то просто можно битмапом в переменной u32 например. Здесь по обстоятельствам.
Такие дескрипторы можно передавать через механизм очередей даже не только между задачами ОС или ISR, но и между процессорами в многоядерной среде, таким образом используя общий пул связных блоков для нескольких ядер.
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Dec 5 2016, 07:33
Сообщение #23


Местный
***

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



Цитата(jorikdima @ Dec 2 2016, 21:49) *
Если ксть СДРАМ, которой обычно много, вы уверены, что вообще нужна дин. память? Тем более только в одном месте, как сказали.

Начал немного сомневаться. В принципе, можно обойтись и статической. Но мне надо заполнять массивы разной длины. Наверно, я мог бы создать один гигантский массив размером во всю СДРАМ, а потом заполнять его, сохраняя адрес и размер выделенного кусочка. Но это же, по сути, делает и malloc. То есть я как бы избавил себя от лишней работы.
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Dec 5 2016, 10:04
Сообщение #24


Знающий
****

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



Цитата(Atlantis- @ Dec 5 2016, 10:33) *
Начал немного сомневаться. В принципе, можно обойтись и статической. Но мне надо заполнять массивы разной длины. Наверно, я мог бы создать один гигантский массив размером во всю СДРАМ, а потом заполнять его, сохраняя адрес и размер выделенного кусочка. Но это же, по сути, делает и malloc. То есть я как бы избавил себя от лишней работы.

если в один момент времени нужен только один экземпляр этого массива - конечно, лучше статически выделить кусок достаточно большого размера и не мучиться. Вот если этих массивов много и они создаются и уничтожаются в произвольном порядке - тогда необходимо malloc/free.
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Dec 5 2016, 12:10
Сообщение #25


Местный
***

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



Цитата(novikovfb @ Dec 5 2016, 13:04) *
если в один момент времени нужен только один экземпляр этого массива - конечно, лучше статически выделить кусок достаточно большого размера и не мучиться. Вот если этих массивов много и они создаются и уничтожаются в произвольном порядке - тогда необходимо malloc/free.

В один момент времени нужно от 1 до 15 экземпляров массива. Причем, возможна ситуация, когда из одного экземпляра массива читаются данные, а другой экземпляр уничтожается, создается новый другого размера и туда данные записываются.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Dec 5 2016, 14:23
Сообщение #26


Ally
******

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



Цитата(Atlantis- @ Dec 2 2016, 14:18) *
Не уверен, что точно понял, что Вы имеете ввиду. На осциллографе у меня есть режим Auto и Normal, был включен второй - когда засеченный импульс не уплывает, а остается на экране.


Persistence это вот такой вид как внизу.
Платформа Kinetis MK66 180 МГц, компилятор IAR, оптимизация максмимальная

Запись процесса выделения 1500 блоков памяти случайного размера, но не более 255 байт с помощью malloc
Прикрепленное изображение


Запись процесса освобождения 1500 блоков с помощью free.
Прикрепленное изображение


Ну что сказать..., юзайте malloc. Он вполне себе детерминированный.

Но все равно потом пожалеете. biggrin.gif
Go to the top of the page
 
+Quote Post
Valentine Logino...
сообщение Dec 8 2016, 07:42
Сообщение #27


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 7-04-10
Из: Пушкино
Пользователь №: 56 462



Просто пройду мимо и плюсану тех, кто говорил про memory pool'ы (что там у вас, 15 статически аллоцированных массивов максимальной длины).
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Dec 8 2016, 08:45
Сообщение #28


Местный
***

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



Цитата(Valentine Loginov @ Dec 8 2016, 10:42) *
Просто пройду мимо и плюсану тех, кто говорил про memory pool'ы (что там у вас, 15 статически аллоцированных массивов максимальной длины).

их не 15, их может быть 15 максимум, может быть один, занимающий почти всю память, может быть два и т.д.
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 - 09:13
Рейтинг@Mail.ru


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