-
- а SD Card на ДМА для Fatfs? - Constantin24(08.04.2017 20:43)
- Там вряд ли был кольцевой буфер ;) - vllv(08.04.2017 20:48)
- А вообщее идея с дма отличная, отказывался только из-за отсутствия кольцевого буфера, а оказывается, он есть )) блин ) - 0men(07.04.2017 13:18)
- Вот и я о том же. - SciFi(07.04.2017 13:23)
- Отказался от дма в стм32 после 5лет использования.Они постоянно меняют назначение бит , имена ,плюс кривые библиотеки.Каждый раз приходится изучать как с нуля , офигенные потери времени и нервов.Достали уже козлы.Буду применять только там где без plainuser(12 знак., 07.04.2017 12:44)
- Ну так и пиши, что после 5 лет бодания с кривыми библиотеками от них отказался. При чем тут ДМА? Я как раз пятилетку назад после перехода с AVR на STM первым делом освоил ДМА, и использую его везде. Кто не понимает преимуществ ДМА может идти ... э il-2(20 знак., 08.04.2017 06:55)
- "Изучать с нуля"? Чего там "изучать"? Гы-гы, пара регистров и десяток битов. Короче, пеши исчо :-) - SciFi(07.04.2017 12:46)
- Поговорим через 5лет. - plainuser(07.04.2017 12:49)
- Вот сейчас нашёл свой код 2010 года, там STM32 DMA. Можно и поговорить :-) - SciFi(07.04.2017 12:54)
- Поговорим через 5лет. - plainuser(07.04.2017 12:49)
- Не вижу существенного преимущества в DMA: при парсинге принятых данных все равно каждый байтик пройдет через аккумулятор процессора. Так уж и переложить из регистра в память -- совсем незаметный оверхед. DMA имеет смысл, если ты данные не fk0(163 знак., 07.04.2017 12:30)
- Именно что у STM FIFO нет (точнее есть - на 1 байт). Обычно фифо - 16 байт. А ДМА(циклический) - это тот-же фифо, только в ОЗУ и на любой размер. - il-2(08.04.2017 07:31)
- а ничего что при приёме через прерывания на каждый принятый/отправленный байт надо а) сохранить контекст, б) вызвать обработчик в) поколдовать с приёмником байтиков, успокоить контроллер прерываний г) восстановить контекст. Mahagam(127 знак., 07.04.2017 12:34)
- Вот-вот. Прерывания такие мягкие, незаметные, втираются в душу и как будто ничего не стоят… а я вот попробовал тактов наскрести, чтобы поменять плату на более дешёвую, и как раз прерывания у меня всё съели, так и забил на эту экономию. Николай Коровин(789 знак., 07.04.2017 13:02)
- Всё это прекрасно заменяется аппаратным FIFO - подождали пока заполнится до определённого уровня (или посмотрели что не пуст), выгребли, обработали. На каждый байт дёргаться не нужно, можно вообще в суперлупе неспешно опрашивать. - =AlexD=(07.04.2017 12:40)
- Циклический ДМА это как раз и есть аппаратный ФИФО, только в ОЗУ и любого размера. Еще приходится программно вести указатель на "хвост" буфера, но это фигня. - il-2(08.04.2017 07:34)
- нет его в стм32, а SciFi его пользует судя по коду - 0men(07.04.2017 12:42)
- ацтой и фуфел, ST на мыло - =AlexD=(07.04.2017 12:43)
- Какашка та еще , но дешево. - plainuser(07.04.2017 12:45)
- ацтой и фуфел, ST на мыло - =AlexD=(07.04.2017 12:43)
- Тоже недавно пробовал (на XMEGA) - очень удобно. Apтём(114 знак., 06.04.2017 18:49)
- Если пакет большой, то прерывание одно на пакет не представляет существенных потерь времени. Только в циклическом режиме можно ничего не делать - контроллер ДМА сам перезагрузит указатели и счетчик - но флаг готовности данных полезно взвести, в my504(64 знак., 07.04.2017 15:01)
- А Xmega циклический режим поддерживает? - Ксения(07.04.2017 14:02)
- Конечно поддерживает. Смотрите в мануале Table 5-4. Summary of triggers, transaction complete flag and channel disable according to DMA channel configuration. Apтём(184 знак., 07.04.2017 16:36)
- А как этому DMA задают, сколько байт надо ему качать, если буфер кольцевой? Например, DMA успел передать только часть данных из буфера, а в это время надо добавить в буфер еще порцию. Как тут поступить? Ждать завершения операции, чтобы потом дать Ксения(76 знак., 07.04.2017 21:53)
- Вы несколько переводите тему. Apтём(1898 знак., 07.04.2017 22:22)
- Но меня интересует передача. Буфер тоже кольцевой, в него время от времени подбрасываются еще порции. Какую тактику вы бы посоветовали в этом случае? - Ксения(07.04.2017 22:38)
- Я наверное сделал бы также как и при передаче с использованием прерывания UDRE, только с ДМА передавались бы не байты, а блоки из буфера передачи. Apтём(827 знак., 07.04.2017 23:09)
- Но здесь я не вижу разрешения коллизии, когда вызван SendBuffer(), когда DMA еще не окончил предыдущее задание. Разве запуск новой передачи StartDMATx() не повредит окончанию старой? - Ксения(07.04.2017 23:17)
- Коллизии нет никакой - надо просто правильно сделать (ошибку заложить конечно можно). Apтём(1082 знак., 07.04.2017 23:33 - 08.04.2017 02:03)
- Насколько я понимаю, CRITICAL_SECTION на DMA не действует. Ксения(686 знак., 08.04.2017 07:39)
- CRITICAL_SECTION: Apтём(1225 знак., 08.04.2017 14:11)
- Насколько я понимаю, CRITICAL_SECTION на DMA не действует. Ксения(686 знак., 08.04.2017 07:39)
- Коллизии нет никакой - надо просто правильно сделать (ошибку заложить конечно можно). Apтём(1082 знак., 07.04.2017 23:33 - 08.04.2017 02:03)
- Но здесь я не вижу разрешения коллизии, когда вызван SendBuffer(), когда DMA еще не окончил предыдущее задание. Разве запуск новой передачи StartDMATx() не повредит окончанию старой? - Ксения(07.04.2017 23:17)
- Я наверное сделал бы также как и при передаче с использованием прерывания UDRE, только с ДМА передавались бы не байты, а блоки из буфера передачи. Apтём(827 знак., 07.04.2017 23:09)
- Но меня интересует передача. Буфер тоже кольцевой, в него время от времени подбрасываются еще порции. Какую тактику вы бы посоветовали в этом случае? - Ксения(07.04.2017 22:38)
- Вы несколько переводите тему. Apтём(1898 знак., 07.04.2017 22:22)
- А как этому DMA задают, сколько байт надо ему качать, если буфер кольцевой? Например, DMA успел передать только часть данных из буфера, а в это время надо добавить в буфер еще порцию. Как тут поступить? Ждать завершения операции, чтобы потом дать Ксения(76 знак., 07.04.2017 21:53)
- Конечно поддерживает. Смотрите в мануале Table 5-4. Summary of triggers, transaction complete flag and channel disable according to DMA channel configuration. Apтём(184 знак., 07.04.2017 16:36)
- Как при этом DMA ведется обработка ошибок? - AlexBi(06.04.2017 17:20)
- Кто мешает проверять целостность данных ПОСЛЕ приема всего пакета? Обработка переполнения буфера во время приема по ДМА не требуется, а ошибка фрейма может возникнуть только при неудачном запуске приема (прямо во время байта), либо при my504(762 знак., 07.04.2017 08:37 - 08:44)
- Проверка целостности после приема требует добавления контрольных кодов, требует время на их проверку. Встроенный контроль фрейма (а возможно и четности) дает некий контроль ошибок задешево. AlexBi(299 знак., 07.04.2017 10:32)
- Использование ДМА позволяет не избавится от прерываний совсем (в этом нет никакого профита), а получить реальный выигрыш по КАЖДОМУ принятому в ДМА байту за счет ликвидации латентности и брутто-кода обработчика. То есть этот выигрыш умножается на my504(646 знак., 07.04.2017 11:48)
- Т.е. фактически ДМА используется для увеличения размера ФИФО УАРТа и имеет смысл там, где ФИФО нет или его размер почему-то не достаточный. - AlexBi(07.04.2017 12:28)
- Абсолютно согласен. По большому счету, FIFO и есть разновидность ДМА, только со стековой памятью. my504(91 знак., 07.04.2017 12:57)
- Стековая память это уже стало ФИФО ? :) - Petrovich(07.04.2017 15:06, )
- Наоборот. ФИФО и ЛИФО - две разновидности стековой памяти. Правда нынешняя терминология к стеку относит только ЛИФО, но я как то со времен института неправильно полагал стек видом безадресной памяти с последовательным доступом. - my504(07.04.2017 15:09 - 15:21)
- Вообще-то, если быть точным, LIFO - стек, FIFO - очередь. - Bill(07.04.2017 20:06)
- Наоборот. ФИФО и ЛИФО - две разновидности стековой памяти. Правда нынешняя терминология к стеку относит только ЛИФО, но я как то со времен института неправильно полагал стек видом безадресной памяти с последовательным доступом. - my504(07.04.2017 15:09 - 15:21)
- Стековая память это уже стало ФИФО ? :) - Petrovich(07.04.2017 15:06, )
- Абсолютно согласен. По большому счету, FIFO и есть разновидность ДМА, только со стековой памятью. my504(91 знак., 07.04.2017 12:57)
- Нет. Использование ДМА может оправдано при приеме большого пакета данных с заранее известной длиной, но чаще всего,например в Модбасе, не даст профита, кроме того, теряем аппаратную проверку ошибок каждого байта. - Petrovich(07.04.2017 12:11, )
- как раз очень хорошо использую дма для модбас. Под RTOS вызывают задачу каждые n-мс в зависимости от скорости, смотрю дма, если кол-во байт не изменилось с последней проверки и больше 0, тогда уже запускаю обработку. в общем случае получается AVF(127 знак., 07.04.2017 15:11)
- Если Modbus - RTU, то еще проверка таймаутов жизнь осложняет - AlexG(07.04.2017 19:18)
- А... флаг прихода байта не судьба пощупать? :) - Petrovich(07.04.2017 15:32, )
- С какой частотой щупать? Если 115200 - >10тыс раз в секунду. А если 1-2 МБит? Щупалка отвалится. - Apтём(07.04.2017 18:08 - 18:16)
- А я что либо говорил про Модбас? Я как раз НАОБОРОТ предупреждал, что все зависит от протокола. Стандартные протоколы никто не оптимизировал под ДМА. Естественно, что и профита не будет. - my504(07.04.2017 12:27)
- как раз очень хорошо использую дма для модбас. Под RTOS вызывают задачу каждые n-мс в зависимости от скорости, смотрю дма, если кол-во байт не изменилось с последней проверки и больше 0, тогда уже запускаю обработку. в общем случае получается AVF(127 знак., 07.04.2017 15:11)
- Кстати, у меня избавление от прерывания дало реальный профит. Потому что прерывание используется для важного процесса, и ему не хочется мешать. И с приоритетами заморачиваться тоже не хочется. "Вот как бывает"© - SciFi(07.04.2017 12:07)
- "Все остальные проверки (включая четность) легко осуществляются в парсере". Имеется ввиду одна ошибка четности на весь пакет? - vllv(07.04.2017 11:58)
- Т.е. фактически ДМА используется для увеличения размера ФИФО УАРТа и имеет смысл там, где ФИФО нет или его размер почему-то не достаточный. - AlexBi(07.04.2017 12:28)
- Всё-таки любая контрольная сумма с некоторой вероятностью пропускает испорченные данные, поэтому идеологически правильно ловить ошибки на уровне канала. - SciFi(07.04.2017 10:41)
- Использование ДМА позволяет не избавится от прерываний совсем (в этом нет никакого профита), а получить реальный выигрыш по КАЖДОМУ принятому в ДМА байту за счет ликвидации латентности и брутто-кода обработчика. То есть этот выигрыш умножается на my504(646 знак., 07.04.2017 11:48)
- Ога. Принял весь пакет и разбирай... красота! Особенно хорошо когда количество передаваемых данных указано в самом пакете) - Олдфаг(07.04.2017 08:42, )
- Обычно после пакета следует пауза, вот по ней и разбирать пакет. - Lightelf(07.04.2017 08:59)
- Не нужно использовать паузу в качестве конца пакета ни в коем случае. Ale3000(135 знак., 07.04.2017 11:54)
- даладна... И как Вы предполагаете без паузы добиться синхронизации модуля УАРТ с принимаемым байтом? - my504(07.04.2017 12:38)
- Даже я заметил, что не использовать паузу вообще и не использовать её в качестве маркера конца пакета — совершенно разные вещи %) В — Внимательность. Д — Дурацкий букварь. - Николай Коровин(07.04.2017 12:52)
- А я и не предлагал использовать ее в качестве маркера. Более того, маркер конца пакета нужен только при переменной и ПРОИЗВОЛЬНОЙ длине пакета, а в таком варианте невозможно использование ДМА. Пауза нужна ТОЛЬКО для синхронизации. Просто удобно my504(114 знак., 07.04.2017 13:01)
- Херали "при переменной и ПРОИЗВОЛЬНОЙ длине пакета, а в таком варианте невозможно использование ДМА"? Самый смак там и использовать DMA. Сделал буфер пожирнее (чтобы пакет заведомо влез) и алга. - LightElf(07.04.2017 13:11)
- повтор. - my504(07.04.2017 13:35 - 13:37)
- Дело не в буфере, а в определении момента завершения пакета. Сам буфер тут вообще не причем. Причем счетчик ДМА, который по завершении цикла счета генерирует прерывание, которое и есть событие конца пакета. - my504(07.04.2017 13:35)
- Момент завершения пакета - состояние линии IDLE. Т.е. байтики валятся, DMA их в память складывает. Когда буфер заполнился или на линии IDLE - смотрим в буфер и парсим то что там лежит. - LightElf(07.04.2017 13:55)
- Да не нужно ничего определять, нужно только эмулировать FIFO с помощью DMA, и на этом - всё. - =AlexD=(07.04.2017 13:46)
- Отлично, только с ДМА будет не все просто, потому что потребуется перезапускать ДМА по какому либо критерию и поддерживать актуальный указатель буфера ДМА, что при его кольцевом характере создаст
индусскийплохо читаемый код... - my504(07.04.2017 14:49)- Вы не поняли - ДМА аппаратно ведёт указатель на принятые данные. Большее от него не требуется. Apтём(398 знак., 07.04.2017 18:13)
- Это все и так было понятно. Проблема в расчете границы необработанных данных. В ФИФО все сделано аппаратно, а тут нужно считать ручками. - my504(07.04.2017 18:21)
- Эээ... Apтём(762 знак., 07.04.2017 18:42 - 18:48)
- Это все и так было понятно. Проблема в расчете границы необработанных данных. В ФИФО все сделано аппаратно, а тут нужно считать ручками. - my504(07.04.2017 18:21)
- А шо делать, а кому щас лехко. - =AlexD=(07.04.2017 14:58)
- Вы не поняли - ДМА аппаратно ведёт указатель на принятые данные. Большее от него не требуется. Apтём(398 знак., 07.04.2017 18:13)
- Отлично, только с ДМА будет не все просто, потому что потребуется перезапускать ДМА по какому либо критерию и поддерживать актуальный указатель буфера ДМА, что при его кольцевом характере создаст
- Херали "при переменной и ПРОИЗВОЛЬНОЙ длине пакета, а в таком варианте невозможно использование ДМА"? Самый смак там и использовать DMA. Сделал буфер пожирнее (чтобы пакет заведомо влез) и алга. - LightElf(07.04.2017 13:11)
- А я и не предлагал использовать ее в качестве маркера. Более того, маркер конца пакета нужен только при переменной и ПРОИЗВОЛЬНОЙ длине пакета, а в таком варианте невозможно использование ДМА. Пауза нужна ТОЛЬКО для синхронизации. Просто удобно my504(114 знак., 07.04.2017 13:01)
- Даже я заметил, что не использовать паузу вообще и не использовать её в качестве маркера конца пакета — совершенно разные вещи %) В — Внимательность. Д — Дурацкий букварь. - Николай Коровин(07.04.2017 12:52)
- даладна... И как Вы предполагаете без паузы добиться синхронизации модуля УАРТ с принимаемым байтом? - my504(07.04.2017 12:38)
- Если прием по ДМА, то разбор пакета делается по флагу установленному в прерывании по этому ДМА. А есть или нет паузы между пакетами в этом процессе значения не имеет. Пауза нужна лишь для поиска начала как пакета, так и байта. такая пауза длиной my504(209 знак., 07.04.2017 09:07)
- Пакеты могут быть переменной длины, в том числе - значительно короче буфера DMA. Пакет пришел - а прерывания от DMA нет. Ферштейн? - LightElf(07.04.2017 10:26)
- Вы все неправы. Надо передавать читаемые человеком строки. Числа - в десятичном виде. Завершать "\r\n". И ниипет! - SciFi(07.04.2017 10:32)
- Как здорово, если сам выбираешь протокол! А если протокол выбирает тебя? Вот вам устройство управления с ТАКИМ протоколом, будь добр выполняй на пакетах непредсказуемой длины. И с неизвестными паузами. Известны только признаки начала и (иногда) Лагунов(21 знак., 07.04.2017 11:50)
- +1, у меня, к сожалению, практически всегда так - 0men(07.04.2017 12:21)
- Вариант кстати, если у чипца UART умеет генерить прерывание по приему определенного символа. Но это не очень распространенная опция. А паузой в передаче обычно считается период 1 или 0.5 байт при текущей скорости. - LightElf(07.04.2017 10:39)
- Опять вы все неправы. У меня везде Main Loop. Парсить принимаемые данные байт за байтом ну нискольно не напрягает. - SciFi(07.04.2017 10:42)
- Ну это ж от конструкции софта зависит. Ежели так - то само собой. - LightElf(07.04.2017 10:44)
- Опять вы все неправы. У меня везде Main Loop. Парсить принимаемые данные байт за байтом ну нискольно не напрягает. - SciFi(07.04.2017 10:42)
- И недельная пауза между строками :) - Petrovich(07.04.2017 10:36, )
- Как здорово, если сам выбираешь протокол! А если протокол выбирает тебя? Вот вам устройство управления с ТАКИМ протоколом, будь добр выполняй на пакетах непредсказуемой длины. И с неизвестными паузами. Известны только признаки начала и (иногда) Лагунов(21 знак., 07.04.2017 11:50)
- Пауза не подходит, длина пакета не подходит. Значит, использование ДМА мало пригодно для обмена по УАРТ - Petrovich(07.04.2017 10:31, )
- Не для обмена по УАРТ, а ДЛЯ ВАШЕГО ПРОТОКОЛА (в смысле использованного Вами). - my504(07.04.2017 12:41)
- Вы все неправы. Надо передавать читаемые человеком строки. Числа - в десятичном виде. Завершать "\r\n". И ниипет! - SciFi(07.04.2017 10:32)
- Пакеты могут быть переменной длины, в том числе - значительно короче буфера DMA. Пакет пришел - а прерывания от DMA нет. Ферштейн? - LightElf(07.04.2017 10:26)
- Не нужно использовать паузу в качестве конца пакета ни в коем случае. Ale3000(135 знак., 07.04.2017 11:54)
- Обычно после пакета следует пауза, вот по ней и разбирать пакет. - Lightelf(07.04.2017 08:59)
- Проверка целостности после приема требует добавления контрольных кодов, требует время на их проверку. Встроенный контроль фрейма (а возможно и четности) дает некий контроль ошибок задешево. AlexBi(299 знак., 07.04.2017 10:32)
- У меня нет ошибок. - SciFi(06.04.2017 17:23)
- Кстати, вопрос. А нафига эти ошибки обрабатывать? bnb62(94 знак., 06.04.2017 18:29)
- UART не выходит за габариты изделия? - AlexBi(06.04.2017 17:25)
- Всё в пределах платы, сантиметров 10. - SciFi(06.04.2017 17:26)
- Кто мешает проверять целостность данных ПОСЛЕ приема всего пакета? Обработка переполнения буфера во время приема по ДМА не требуется, а ошибка фрейма может возникнуть только при неудачном запуске приема (прямо во время байта), либо при my504(762 знак., 07.04.2017 08:37 - 08:44)
- Где голова, из регистров DMA вычитывать? - vllv(06.04.2017 17:04)
- Естественно. SciFi(506 знак., 06.04.2017 17:22)
- А нельзя просто написать rxhead = RX_BUFSIZE - CNDTR и на этом успокоиться? - йцукен(07.04.2017 20:07, )
- Видимо, можно. Кажется, я перемудрил :-) - SciFi(07.04.2017 20:46)
- Подтверждаю, перемудрил :-) - il-2(08.04.2017 07:38)
- Видимо, можно. Кажется, я перемудрил :-) - SciFi(07.04.2017 20:46)
- rxtail ? - bnb62(06.04.2017 18:12)
- Вот: SciFi(121 знак., 06.04.2017 18:15)
- Спасиб за код. Ликбезу быть!!! Поздравляю с очередным достижением. bnb62(16 знак., 06.04.2017 18:36)
- Вот: SciFi(121 знак., 06.04.2017 18:15)
- А нельзя просто написать rxhead = RX_BUFSIZE - CNDTR и на этом успокоиться? - йцукен(07.04.2017 20:07, )
- Естественно. SciFi(506 знак., 06.04.2017 17:22)
- А как там определить начало/конец посылки без анализа каждого байта? Или в приемный буфер лезть периодически по таймеру? - 0men(06.04.2017 17:01)
- У многих мк есть прерывание rxidle. - Lightelf(06.04.2017 21:05)
- Сделай длину ПДП буфера=1, прерывайся и анализируй, а пришедшие данные естественно клади в кольцевой буфер :) - Petrovich(06.04.2017 17:06, )
- хорошая шутка )) - 0men(06.04.2017 17:09)
- когда у тебя таких уартов штук 8, то без DMA вообще тоскливо - Mahagam(06.04.2017 16:58)
- юзаю вот это XR16V798. Если кто знает аналоги может подскажите, с этой у пайщиков проблемка со статикой - Mikla(06.04.2017 18:42)
- а SD Card на ДМА для Fatfs? - Constantin24(08.04.2017 20:43)