Size: a a a

2021 March 25

SK

Stas Koynov in Embedded Group
ну если уж вообще быть честным, то на скорости 9600. как мы уже выяснили время байта ~1ms у вас кортекс. заход в прервыние 12 тактов выход 12. плюс минус в прерывании. это просто мелочи...
источник

AZ

Aleksander Zholtkovs... in Embedded Group
Evgen
нет полинга все на дма
завязано и прерываниях
плюс в старшей серии костыль таймера не надо
точнее на новых сериях
как нет поллинга, а как догадаться что пакет пришёл?
и зачем таймер? запулить кольцевой буфер через dma и вычитывать где-нибудь
источник

E

Evgen in Embedded Group
Aleksander Zholtkovskii
как нет поллинга, а как догадаться что пакет пришёл?
и зачем таймер? запулить кольцевой буфер через dma и вычитывать где-нибудь
по прерыванию?
у вас само прерывание скажет, что конец пакета
источник

SK

Stas Koynov in Embedded Group
тем более между пакетами 100ms вроде была инфа. вы даже не заметите что были в прервании уарта по принятию байта
источник

E

Evgen in Embedded Group
Stas Koynov
ну если уж вообще быть честным, то на скорости 9600. как мы уже выяснили время байта ~1ms у вас кортекс. заход в прервыние 12 тактов выход 12. плюс минус в прерывании. это просто мелочи...
это заготовка
Я потом её перенесу на modbus rtu, а сейчас делаю прием  протокола попроще
не вижу смысла 2 раза делать одно и то же
источник

AZ

Aleksander Zholtkovs... in Embedded Group
Stas Koynov
ну если уж вообще быть честным, то на скорости 9600. как мы уже выяснили время байта ~1ms у вас кортекс. заход в прервыние 12 тактов выход 12. плюс минус в прерывании. это просто мелочи...
во во.
ещё бывают контроллеры с маленьким аппаратным фифо, там совсем хорошо будет
источник

PB

Petr Belyaev in Embedded Group
Я делал modbus на IDLE прерывании по UART'u и циклическом DMA. Там как раз можно по IDLE парсить пакет и смотреть на длины, CRC и прочее. Так и ложные срабатывания выявить относительно легко. И в случае ложного срабатывания заставить DMA дописывать недопринятые байты. Ну и если совсем все плохо, состояние всей этой красоты можно сбрасывать при заполнении счетчика DMA (известно, что длина пакета MODBUS ограничена), либо по тайм-ауту. Как раз около 10мс можно сделать
источник

SK

Stas Koynov in Embedded Group
Evgen
это заготовка
Я потом её перенесу на modbus rtu, а сейчас делаю прием  протокола попроще
не вижу смысла 2 раза делать одно и то же
ну в модбасе тоже не все гладко. там нет длины, ее нужно вычислять + спец функции для своего железа или другого железа... + помехи или обрывы. таймер и принятие байта все равно нужно. так что сейчас ваше решение может и будет быстрее, но оно не будет проще
источник

E

Evgen in Embedded Group
Stas Koynov
ну в модбасе тоже не все гладко. там нет длины, ее нужно вычислять + спец функции для своего железа или другого железа... + помехи или обрывы. таймер и принятие байта все равно нужно. так что сейчас ваше решение может и будет быстрее, но оно не будет проще
вы поймите есть такой бит RTO и он вот решает все вопросы с принятиям байт по времени
прост в ф1 сейчас у меня его нет
источник

AK

Andrew K in Embedded Group
Evgen
это заготовка
Я потом её перенесу на modbus rtu, а сейчас делаю прием  протокола попроще
не вижу смысла 2 раза делать одно и то же
получилось?
источник

E

Evgen in Embedded Group
Andrew K
получилось?
да сижу вон пример ковыряю
Собираю
источник

К1

Ком 123 in Embedded Group
Evgen
в модбасе есть
только вам надо принять тогда минимум 3 байта, вырвать длину, прибавить контрольную сумму 2 байта
и пахнет костылями
Идея принимать пакет переменной длины по dma?
источник

E

Evgen in Embedded Group
Ком 123
Идея принимать пакет переменной длины по dma?
да
источник

AK

Andrew K in Embedded Group
я делал так есть буфер в ДМА устанавливаю его длину в CNT, если приняли все то это перебор и останавливаем прием
источник

E

Evgen in Embedded Group
Andrew K
я делал так есть буфер в ДМА устанавливаю его длину в CNT, если приняли все то это перебор и останавливаем прием
длина пакета переменной то длины
источник

AK

Andrew K in Embedded Group
по IDLE запоминаю текущее состояние CNT запускаю таймер, по его прерыванию смотрю приходили ли еще байты, если нет прием окончен
источник

AK

Andrew K in Embedded Group
количество принятых это разница между длиной и остатком в CNT
источник

PB

Petr Belyaev in Embedded Group
Evgen
длина пакета переменной то длины
Говоришь DMA принять 256 байт (максимальная длина фрейма), ловишь IDLE, останавливаешь DMA, если принял пакет, стартуешь DMA снова, с нуля
источник

К1

Ком 123 in Embedded Group
Evgen
да
Я делал так: запускаю dma на заголовок пакета * 2 по прерыванию половины заполнения буфера в нём же считаю длины и прямо в регистрах меняю значения размера буфера и адрес приёма данных + чищу флаги. Работало как часы=)
источник

PB

Petr Belyaev in Embedded Group
Andrew K
по IDLE запоминаю текущее состояние CNT запускаю таймер, по его прерыванию смотрю приходили ли еще байты, если нет прием окончен
^ или так
источник