-
- Кто мешает проверять целостность данных ПОСЛЕ приема всего пакета? Обработка переполнения буфера во время приема по ДМА не требуется, а ошибка фрейма может возникнуть только при неудачном запуске приема (прямо во время байта), либо при 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)