-
- Пощитать потоки и сделать циклический буфер для результата обработки с кучей (по числу потребителей) указателей на чтение и один на запись. ДМА-шный буфер тоже неплохо циклическим. Ж-) - Мущщина(13.10.2014 16:52)
- Не нада среднего - это слишком плохой фильтр... Надо по простому - ЦФНЧ 1- или 2-порядка. Будешь иметь фильтрованное значение в любой момент времени - argus98(13.10.2014 15:10)
- Стандартно - делишь буфер DMA на 2 части. Пока c помощью DMA заполняется одна половина, со второй изгаляешься, как хочешь. - Гудвин(13.10.2014 14:26)
- -> - Codavr(13.10.2014 14:39, ссылка)
- Спешить надо всегда. Если у тебя данные не успевают обрабатываться, то надо что то менять в консерватории. Если допустим пропуск данных, то добавляй флаги актуальности, готовности, обработки и пр. - Гудвин(13.10.2014 14:54)
- С неуспевчиком вариант не рассматртваем по причине очевидности. Обсуждается именно организация этих "флагов актуальности, готовности, обработки и пр." - Codavr(13.10.2014 14:57)
- Спешить надо всегда. Если у тебя данные не успевают обрабатываться, то надо что то менять в консерватории. Если допустим пропуск данных, то добавляй флаги актуальности, готовности, обработки и пр. - Гудвин(13.10.2014 14:54)
- -> - Codavr(13.10.2014 14:39, ссылка)
- Я бы сделал так: il-2(803 знак., 13.10.2014 11:40 - 11:49)
- Двойная буферизация, не? - Скрипач(13.10.2014 10:23)
- STM32F1 DMA не умеет работать с двойным буфером. А так да, внезапная иррациональная тяга Кодавра к перфекционизму была бы легко удовлетворена. - SciFi(13.10.2014 10:26)
- Ты уверен, что перфекционизм это мой диагноз, а не твой? С какого хера ты решил, что мое желание изготовить устройство которое будет работать как задумано, а не как тебе похуй - иррациональный перфекционизм? Может все же будем обсуждать тему, а не Codavr(84 знак., 13.10.2014 11:10)
- Да ладно, не кипятись. Ты же ТЗ так и не выкатил. Привёл несколько странных цифр, которые ничего не прояснили. - SciFi(13.10.2014 11:12)
- Ну я уже и не знаю как еще. Молотит АЦП несколько каналов и через DMA кидает в память. После каждого цикла опроса, в обработчике прерывания DMA делаются некие действия над этими данными. Разные действия для разных групп каналов, но общие для Codavr(508 знак., 13.10.2014 11:23 - 11:34)
- Семафоры могут быть не только бинарными, но и счетными. Ничего там не должно пропускаться - Petrovich(13.10.2014 11:42, )
- А как сделать так чтобы потребитель знал, что в момент потребления туда не произошла запись новых значений. А то ведь пока я буду первый int вычитывать у меня третий тынц и изменился, а мне это низзя. - Codavr(13.10.2014 11:45)
- Для этого есть критические секции и копирование. - =AlexD=(13.10.2014 11:46)
- Потребитель запускает критическую секцию, а у DMA пришло время новые данные обработать. Вот мне и хочется, чтобы потребитель не лез своим рылом в драгоценный процесс обработки, а просто знал что данные повреждены и следует униженно попросить дать Codavr(17 знак., 13.10.2014 11:50)
- Потребитель в критической секции копирует 4 байта результата в в свою локальную копию. Ну, задержится прерывание DMA на 100нс. Не будет же overrun'а АЦП. - Petrovich(13.10.2014 11:58, )
- Вроде да. А других граблей тут не может быть? - Codavr(13.10.2014 12:01 - 12:04)
- Ка говаривал М.Горький или старуха Извергиль, в жизни всегда есть место подвигу и граблям. если потребители должны быть синхронными - то подлая DAC может вклиниться и нарушить. - Petrovich(13.10.2014 12:07, )
- Потребители хавают что дали и не выеживаются. - Codavr(13.10.2014 12:18)
- Ка говаривал М.Горький или старуха Извергиль, в жизни всегда есть место подвигу и граблям. если потребители должны быть синхронными - то подлая DAC может вклиниться и нарушить. - Petrovich(13.10.2014 12:07, )
- Вроде да. А других граблей тут не может быть? - Codavr(13.10.2014 12:01 - 12:04)
- Потребитель в критической секции копирует 4 байта результата в в свою локальную копию. Ну, задержится прерывание DMA на 100нс. Не будет же overrun'а АЦП. - Petrovich(13.10.2014 11:58, )
- Потребитель запускает критическую секцию, а у DMA пришло время новые данные обработать. Вот мне и хочется, чтобы потребитель не лез своим рылом в драгоценный процесс обработки, а просто знал что данные повреждены и следует униженно попросить дать Codavr(17 знак., 13.10.2014 11:50)
- Для этого есть критические секции и копирование. - =AlexD=(13.10.2014 11:46)
- А как сделать так чтобы потребитель знал, что в момент потребления туда не произошла запись новых значений. А то ведь пока я буду первый int вычитывать у меня третий тынц и изменился, а мне это низзя. - Codavr(13.10.2014 11:45)
- При чём здесь вообще DMA? Тебе ж судя по всему нужно буферизировать не сырые данные, а результаты обработки. - =AlexD=(13.10.2014 11:36)
- Результаты работы АЦП (6 каналов) посредством DMA кладется в память (участок 12 байт). После того как все каналы опрошены происходит прерывание DMA и обработчик выполняет некоторые операции над этими (12 байт) данными и результат обработки Codavr(82 знак., 13.10.2014 11:40 - 11:43)
- Ну и? В чём проблема? Обработчик DMA копирует себе 12 байт, обрабатывает их, раскладывает результаты по корзинкам и сигналит потребителям что их можно забирать. В каком месте проблема? - =AlexD=(13.10.2014 11:44)
- Потребитель начинает их забирать, но все забрать не успел (причин тыща), а DMA в это время в корзиночку новые данные тынц. - Codavr(13.10.2014 11:47)
- Блокировка прерывания до копирования данных и разрешение после - гарантирует целостность данных полностью, не думаю что гипотетическое откладывание обработчика DMA на пару-тройку команд cpu отразятся на чём-либо негативно. - =AlexD=(13.10.2014 12:58)
- Прерывание можно даже не блокировать, а положить рядом с данными счетчик, который изменяется в прерывании вместе с данными. Если и до и после чтения данных этот счетчик неизменен, то данные годные, иначе перечитать. Хотя проще заблокировать. - mr-x(13.10.2014 14:48)
- Это уже перетерли. - Codavr(13.10.2014 14:55)
- Про критическую секцию уже перетерли. Это как вариант, возможно даже и лучший в этом случае. Просто хочется чтобы "огласили весь список". - Codavr(13.10.2014 13:46)
- Ну если хочется альтернативы... то банальный FIFO достаточной глубины позволяет неспешно работать с данными без пропусков, а если хочется иметь всегда оперативные данные, то потребитель просто вычёрпывает его и использует последнее значение. =AlexD=(105 знак., 13.10.2014 14:30)
- Кольцевой буфер имеется ввиду, где данные не двигаются, а только указатель начала и конца? - Codavr(13.10.2014 14:49)
- Да, кольцевой. - =AlexD=(13.10.2014 14:50)
- Это тема. Спасибо. - Codavr(13.10.2014 14:54)
- Да, кольцевой. - =AlexD=(13.10.2014 14:50)
- Кольцевой буфер имеется ввиду, где данные не двигаются, а только указатель начала и конца? - Codavr(13.10.2014 14:49)
- ping-pong buffer + некольцевой DMA уже перетирали? - Vit(13.10.2014 14:01)
- Вроде еще нет. Излагай шо за зверь. - Codavr(13.10.2014 14:01)
- 2+ буфера. в обработчике DMA первым делом перезаряжаешь указатель на свободный буфер и запускаешь, из теперь уже "предыдущего" буфера можешь грести медленно и печально и даже в том же обработчике - Vit(13.10.2014 14:07)
- А если такая ситуевина Codavr(172 знак., 13.10.2014 14:12)
- в любом случае - один длинный буфер или 2+ коротких - общая длина должна быть с каким-то запасом. значение указателя для DMA актуально для DMA, та же фигня со свободными буферами и их "потребителями". сильно неспеша это медленнее, чем достаточно, Vit(171 знак., 13.10.2014 14:45)
- То есть мы читаем из дальнего конца буфра до которого кровавая рука обработчика DMA гарантировано не дотянется? Тогда по мне эстетичнее один кольцевой использовать. - Codavr(13.10.2014 14:53)
- сами буферы при 2+ могут быть расположены в памяти совсем не подряд. - Vit(13.10.2014 15:01)
- Я подумал, что 2+ это 2 буфера и больше. Я не ошибся, а то может я просто не понял? - Codavr(13.10.2014 15:04)
- не ошибся. - Vit(13.10.2014 16:07)
- Я подумал, что 2+ это 2 буфера и больше. Я не ошибся, а то может я просто не понял? - Codavr(13.10.2014 15:04)
- случаи бывают разные. например, вывод в ЦАП в MP3-плеере - там с парой буферов на канал достаточно удобно получается. - Vit(13.10.2014 14:58)
- Ну да, по ситуации это наверное может быть удобнее. - Codavr(13.10.2014 15:06)
- сами буферы при 2+ могут быть расположены в памяти совсем не подряд. - Vit(13.10.2014 15:01)
- То есть мы читаем из дальнего конца буфра до которого кровавая рука обработчика DMA гарантировано не дотянется? Тогда по мне эстетичнее один кольцевой использовать. - Codavr(13.10.2014 14:53)
- в любом случае - один длинный буфер или 2+ коротких - общая длина должна быть с каким-то запасом. значение указателя для DMA актуально для DMA, та же фигня со свободными буферами и их "потребителями". сильно неспеша это медленнее, чем достаточно, Vit(171 знак., 13.10.2014 14:45)
- А если такая ситуевина Codavr(172 знак., 13.10.2014 14:12)
- 2+ буфера. в обработчике DMA первым делом перезаряжаешь указатель на свободный буфер и запускаешь, из теперь уже "предыдущего" буфера можешь грести медленно и печально и даже в том же обработчике - Vit(13.10.2014 14:07)
- Вроде еще нет. Излагай шо за зверь. - Codavr(13.10.2014 14:01)
- Ну если хочется альтернативы... то банальный FIFO достаточной глубины позволяет неспешно работать с данными без пропусков, а если хочется иметь всегда оперативные данные, то потребитель просто вычёрпывает его и использует последнее значение. =AlexD=(105 знак., 13.10.2014 14:30)
- Прерывание можно даже не блокировать, а положить рядом с данными счетчик, который изменяется в прерывании вместе с данными. Если и до и после чтения данных этот счетчик неизменен, то данные годные, иначе перечитать. Хотя проще заблокировать. - mr-x(13.10.2014 14:48)
- Так проблема в том, что потребитель не может забрать данные атомарно? Для этого есть простое решение: SciFi(391 знак., 13.10.2014 12:07 - 12:11)
- Хватит одного счётчика, который обработчик прерывания инкрементирует после обновления данных. Потребитель читает счётчик, потом данные, потом снова счётчик. Если значения совпали, - данные верны(13.10.2014 12:58, )
- А, ну да. - SciFi(13.10.2014 13:02)
- Счетный семафор это типа реверсивного счетчика, который подсчитывает сколько раз прощелкали клювом :) - Codavr(13.10.2014 12:22)
- А чем это отличается от инвертирования бита (обычного семафора)? Скрипач(84 знак., 13.10.2014 12:21)
- Если потребитель захватил семафор, то производитель сосет банан. А тут производитель всегда свободен, а потребитель имеет инфу о том что принятые данные корректны. - Codavr(13.10.2014 12:24)
- Значит потребитель не должен захватывать семафор. Только читать его. - Скрипач(13.10.2014 12:29)
- Ну вот я прочитал что семафор свободен. Взял словечко. В это время DMA хвать семафор, новые данные тынц, и тут же отдал семафор. Я как ни в чем не бывало читаю семафор, он свободен, беру второй байтик и писец Чернобыль-2. - Codavr(13.10.2014 12:31)
- *О механизмах блокировки рекомендую "Алгоритмические языки реального времени. Конструирование и разработка" С.Янг., 1982г. Скрипач(214 знак., 13.10.2014 12:34 - 12:42)
- Книга в PDF бомж(13.10.2014 17:56)
- Почитаю на досуге. Блин! Она у меня была, какая сука не вернула!? - Codavr(13.10.2014 12:40 - 12:54)
- Возможно, среди общепринятых примитивов синхронизации нет примочки с двумя счётчиками, потому что эта примочка ничего не гарантирует: в худшем (общем) случае можно ждать бесконечно. SciFi(97 знак., 13.10.2014 12:40)
- Ну когда ждем бесконечно потому что пожелал больше собственного веса - сам дурак. Эта ситуация тривиальная и ее не рассматриваем. - Codavr(13.10.2014 12:44)
- Она является "велосипедом с квадратными колесами", поскольку функционал идентичен обычному семафору :) - Скрипач(13.10.2014 12:43)
- Лукавить изволишь, боярин. С семафорами нужно ещё и FIFO городить, а тут этого нет. Такшта извени, не считается. - SciFi(13.10.2014 12:50)
бредЛогической связи семафора и FIFO не уловил. - Скрипач(13.10.2014 12:55)
- Ну тогда объясни на пальцах как правильно семафором это реализовать. У меня фигня получилась. Я согласен, что чего то не знаю наверное, вот потому и решил спросить у старших товарищей. Отсылка к книге дело полезная - она сила и источник знаний, и Codavr(257 знак., 13.10.2014 12:46 - 12:49)
- Если "в лоб", то вот так: Скрипач(568 знак., 13.10.2014 12:53 - 13:25)
- Чота нефкурил. Семафор здесь кто, lock? - Codavr(13.10.2014 13:00)
- Исправил. Семафор - lock. Но не простой, а счетный. Корректно обрабатывается "параллельное чтение" несколькими юзерами. - Скрипач(13.10.2014 13:10)
- То есть семафором рулит потребитель, а обработчик его только смотрит. Пока все потребитель не схавал, данные не обновляем. Понял. Спасибо. - Codavr(13.10.2014 13:23)
- Исправил. Семафор - lock. Но не простой, а счетный. Корректно обрабатывается "параллельное чтение" несколькими юзерами. - Скрипач(13.10.2014 13:10)
- Чота нефкурил. Семафор здесь кто, lock? - Codavr(13.10.2014 13:00)
- Если "в лоб", то вот так: Скрипач(568 знак., 13.10.2014 12:53 - 13:25)
- Лукавить изволишь, боярин. С семафорами нужно ещё и FIFO городить, а тут этого нет. Такшта извени, не считается. - SciFi(13.10.2014 12:50)
- *О механизмах блокировки рекомендую "Алгоритмические языки реального времени. Конструирование и разработка" С.Янг., 1982г. Скрипач(214 знак., 13.10.2014 12:34 - 12:42)
- Ну вот я прочитал что семафор свободен. Взял словечко. В это время DMA хвать семафор, новые данные тынц, и тут же отдал семафор. Я как ни в чем не бывало читаю семафор, он свободен, беру второй байтик и писец Чернобыль-2. - Codavr(13.10.2014 12:31)
- Значит потребитель не должен захватывать семафор. Только читать его. - Скрипач(13.10.2014 12:29)
- Если потребитель захватил семафор, то производитель сосет банан. А тут производитель всегда свободен, а потребитель имеет инфу о том что принятые данные корректны. - Codavr(13.10.2014 12:24)
- Ну да именно в этом. Интересный способ. Спасибо. - Codavr(13.10.2014 12:18)
- Хватит одного счётчика, который обработчик прерывания инкрементирует после обновления данных. Потребитель читает счётчик, потом данные, потом снова счётчик. Если значения совпали, - данные верны(13.10.2014 12:58, )
- Блокировка прерывания до копирования данных и разрешение после - гарантирует целостность данных полностью, не думаю что гипотетическое откладывание обработчика DMA на пару-тройку команд cpu отразятся на чём-либо негативно. - =AlexD=(13.10.2014 12:58)
- Потребитель начинает их забирать, но все забрать не успел (причин тыща), а DMA в это время в корзиночку новые данные тынц. - Codavr(13.10.2014 11:47)
- Ну и? В чём проблема? Обработчик DMA копирует себе 12 байт, обрабатывает их, раскладывает результаты по корзинкам и сигналит потребителям что их можно забирать. В каком месте проблема? - =AlexD=(13.10.2014 11:44)
- Результаты работы АЦП (6 каналов) посредством DMA кладется в память (участок 12 байт). После того как все каналы опрошены происходит прерывание DMA и обработчик выполняет некоторые операции над этими (12 байт) данными и результат обработки Codavr(82 знак., 13.10.2014 11:40 - 11:43)
- Семафоры могут быть не только бинарными, но и счетными. Ничего там не должно пропускаться - Petrovich(13.10.2014 11:42, )
- Ну я уже и не знаю как еще. Молотит АЦП несколько каналов и через DMA кидает в память. После каждого цикла опроса, в обработчике прерывания DMA делаются некие действия над этими данными. Разные действия для разных групп каналов, но общие для Codavr(508 знак., 13.10.2014 11:23 - 11:34)
- Да ладно, не кипятись. Ты же ТЗ так и не выкатил. Привёл несколько странных цифр, которые ничего не прояснили. - SciFi(13.10.2014 11:12)
- С двойным не умеет, зато с половинным умеет. Там есть флажок прерывания спецом чтоб мигать половинками буфера. - HTIFx(13.10.2014 10:51, )
- О! И в закольцованном режиме будет мигать? Тады ой, самое оно. - SciFi(13.10.2014 10:56)
- Ты уверен, что перфекционизм это мой диагноз, а не твой? С какого хера ты решил, что мое желание изготовить устройство которое будет работать как задумано, а не как тебе похуй - иррациональный перфекционизм? Может все же будем обсуждать тему, а не Codavr(84 знак., 13.10.2014 11:10)
- STM32F1 DMA не умеет работать с двойным буфером. А так да, внезапная иррациональная тяга Кодавра к перфекционизму была бы легко удовлетворена. - SciFi(13.10.2014 10:26)
- Во-первых обработчики прерываний ничего усреднять не могут. Буфер оттуда должен попадать в FIFO и далее в основном потоке усредняться, после чего вызываться все callbacks зарегистрироанных слушателей, после чего из fifo исключается и fk0123(568 знак., 13.10.2014 10:16, )
- А чем они мотивируют свою неспособность это делать? - Codavr(13.10.2014 11:12)
- Мотивируют фен шуем. - mr-x(13.10.2014 16:24)
- Для полного феншуя нужно еще и возврат из прерывания не делать :) - Codavr(13.10.2014 18:32)
- Мотивируют фен шуем. - mr-x(13.10.2014 16:24)
- Где-то там ещё нужно подключиться к облаку :-) - SciFi(13.10.2014 10:20)
- А чем они мотивируют свою неспособность это делать? - Codavr(13.10.2014 11:12)
- Может, усреднять вне обработчика DMA? Сделайте усреднение отдельной задачей и используйте т.н. отложенную обработку прерывания, по типу семафоров и прерываний freeRTOS, как описано в статьях Курниц(а). Пусть настоясчий обработчик только вгоняет Олдфаг(47 знак., 13.10.2014 08:38, )
- А задача-усреднитель будет раздавать результаты другим задачам, используя механизьм очередей (описано там же). - Олдфаг(13.10.2014 08:55, )
- Что мешает каждому потребителю усреднять прямо из буфера DMA? - SciFi(13.10.2014 00:52)
- А если их тыща и каждый будет усреднять, то ни на что другое ресурса не хватит. Нехрен делать одно и тоже много раз я щитаю. К тому же кто сказал что они будут получать неискаженные данные. - Codavr(13.10.2014 00:59)
- Можно сделать так: прерывание ДМА шлёт сигнал задаче, которая усредняет данные и после этого шлёт сигнал 20 заинтересованным задачам, которым уже не надо усреднять данные. Или так не годится? - Apтём(13.10.2014 10:36)
- Прерывание ДМА шлёт сигнал задаче, которая усредняет данные. Это собственно и есть обработчик если мы не хотим прощелкать следующий набор данных. Как организовать сигнал 20 заинтересованным задачам что данные корректны от начала до окончания Codavr(67 знак., 13.10.2014 12:37)
- А оно вам надо? Т.е. раньше вы писали что потребителям не нужна синхронизация с источником. Только атомарность. - Скрипач(13.10.2014 12:38)
- Ну да, только атомарность. На синхронизацию кладем однозначно. - Codavr(13.10.2014 12:42)
- По теории, на каждый критический ресурс - своя защита. - Скрипач(13.10.2014 12:46)
- Ну так вот в данном случае как быть. Только не отвечай как партизан бандеровцам. - Codavr(13.10.2014 12:51)
- По теории, на каждый критический ресурс - своя защита. - Скрипач(13.10.2014 12:46)
- Ну да, только атомарность. На синхронизацию кладем однозначно. - Codavr(13.10.2014 12:42)
- А оно вам надо? Т.е. раньше вы писали что потребителям не нужна синхронизация с источником. Только атомарность. - Скрипач(13.10.2014 12:38)
- Прерывание ДМА шлёт сигнал задаче, которая усредняет данные. Это собственно и есть обработчик если мы не хотим прощелкать следующий набор данных. Как организовать сигнал 20 заинтересованным задачам что данные корректны от начала до окончания Codavr(67 знак., 13.10.2014 12:37)
- "Нехрен делать одно и тоже много раз я щитаю" - ты будешь смеяться, но типичный процессор делает одно и то же миллион раз в секунду. Например, увеличивает счётчик цикла. Выкинь из головы этот бред. - SciFi(13.10.2014 01:02)
- Ну допустим мы имеем процессор с тактовой 24 МГц. Данные в DMA валятся с частотой 100 кГц. И у нас 20 потребителей. Нам нужно 5 раз в секунду иметь среднее значение. Сам зацени сколько процентов процессорного времени займет это дело когда Codavr(95 знак., 13.10.2014 01:08)
- Молодец, Эйнштейн. Ты забыл упомянуть размер массива, по которому проводится усреднение. Без этого все твои цифирьки можно написать на заборе. - SciFi(13.10.2014 01:11)
- Допустим я хочу иметь скользящее среднее для двух величин. Так постановка вопроса устроит? Да хер с ним средним, просто сумму. - Codavr(13.10.2014 01:18 - 01:30)
- И все таки хотелось бы обсудить вопрос заданный в голове топика, а не обходные маневры как и почему этого не делать :) - Codavr(13.10.2014 01:16)
- Всё-таки шашечки, а не ехать. Нунафиг, не интересно. - SciFi(13.10.2014 01:20)
- Как скажешь. - Codavr(13.10.2014 01:20)
- Всё-таки шашечки, а не ехать. Нунафиг, не интересно. - SciFi(13.10.2014 01:20)
- Молодец, Эйнштейн. Ты забыл упомянуть размер массива, по которому проводится усреднение. Без этого все твои цифирьки можно написать на заборе. - SciFi(13.10.2014 01:11)
- Ну допустим мы имеем процессор с тактовой 24 МГц. Данные в DMA валятся с частотой 100 кГц. И у нас 20 потребителей. Нам нужно 5 раз в секунду иметь среднее значение. Сам зацени сколько процентов процессорного времени займет это дело когда Codavr(95 знак., 13.10.2014 01:08)
- Можно сделать так: прерывание ДМА шлёт сигнал задаче, которая усредняет данные и после этого шлёт сигнал 20 заинтересованным задачам, которым уже не надо усреднять данные. Или так не годится? - Apтём(13.10.2014 10:36)
- А если их тыща и каждый будет усреднять, то ни на что другое ресурса не хватит. Нехрен делать одно и тоже много раз я щитаю. К тому же кто сказал что они будут получать неискаженные данные. - Codavr(13.10.2014 00:59)