-
- У всех прошу прощения. Перебздел на рефакторинге. Все там
нормально, потокобезопасно и подтверждено многолетними тестами.
Хотя вот это мне не нравится (TxHead==TxTail) &&
(((USART1->ISR)&USART_ISR_TXE)!=0), какая то стрёмная
проверка IBAH(790 знак., 11.05.2022 20:42)
- за такой код надо по рукам бить до полного понимания. кста, переполнение фифо еще не ловил? проверок никаких... - huser(14.05.2022 16:22, )
- Не видно механизмов синхронизации доступа к данным. Не похоже, что это потокобезопасный код. В функции PutFifo1 прерывание может прилететь в каждом месте где есть "==", "!=", "=". Т.е. Если например сравниваем TxHead==TxTail при условии что TxHead и тxTail volatile. To '==' означает сравнение. Но перед сравнением переменные надо загрузить в регистры и это не гарантирует, что во время сравнения данные не будут изменены в прерываниях. Очень тяжело поймать такую ошибку. - framer(11.05.2022 21:13)
- Прошу пардону, но зачем же
через жопутак? Есть же прекрасное прерывание по Transmit Data Register Empty? LightElf(300 знак., 11.05.2022 21:04)- Тоже вариант. Но тут наслоение от программного 485 - IBAH(11.05.2022 21:27)
- Ну тогда в прерывании после отправки последнего байта надо разрешить прерывание по TXC и запретить по TXE. Вообще, всякие флаги надо проверять именно в обработчике прерывания. - LightElf(11.05.2022 21:59)
- По феншую, передача бутиков в УАРТ идёт по UartDataRegEmpty, а
переключение направления, имана по TXEnd. Когда насовываеццо по
УДРЕ, ТХЕнд не возгенеряецца. Если УАРТ халяльный. - mse homjak(11.05.2022 21:39)
- Нихуя не понял, но очень интересно IBAH(8 знак., 11.05.2022 21:48, youtube)
- Чего непонятного? mse homjak(409 знак., 11.05.2022 23:12)
- Для дополнительной помехоустойчивости Tyмблep(94 знак., 11.05.2022 23:51)
- Можно сам UART использовать как таймер. По первому TXC переключить
ножку TX в GPIO и "отправить" пустой символ. А уже по второму TXC
переключать драйвер. Будет пауза в один символ. - LightElf(12.05.2022 02:21)
- Интересное решение, однако надо 1,5. Tyмблep(103 знак., 12.05.2022 19:08)
- Никто не мешает аналогично сделать паузу любой длины. Отправляете
2, 3, 4 символа, меняете скорость/битность и тыды. Зависит от
наличных ресурсов: у STM обычно до чёртовой страсти таймеров (но
фигово, что они все разные) , а у более других камней не всегда так
шоколадно. Бывает и 4 таймера на 11 UART-ов. Поэтому считаю вариант
с использованием только ресурсов самого UART более универсальным. - LightElf(14.05.2022 14:58)
- Смысл использования таймера в другом. Tyмблep(578 знак., 23.05.2022 16:37)
- Проще сделать сколько нужно программных каналов на одном аппаратном
таймере. - Cкpипaч(14.05.2022 15:49)
- Проще, но точность времянок страдает. Задержка в полтора символа на
115200/230400 да на 3-4 UART-ах сразу - ну такое себе. А уж если
под линухом каким - совсем туши свет. LightElf(115 знак., 14.05.2022 22:52)
- Создавать таймеры под Линуксом "врукопашную" - полный бред. Для этого есть select. - Cкpипaч(15.05.2022 09:34)
- Я на ассемблере делал (на Си не умел ещё). Появляется задача
сделать выдержку. В этот момент, относительно текущего значения
таймера, вычисляется значение, при котором должна быть сработка.
Это значение помещается в очередь. В компаратор таймера заносится
ближайшее, по времени, значение. В прерывании таймера оповещается
соответствующий заказчик выдержки и в компаратор загружается
следующее, по времени значение. Отлично работало! - Nikolay_Po(14.05.2022 17:16)
- Мне проще думать "в обратной симметрии". С каким-то шагом
вызываются "обрабочики", они проверяют разные всякие условия,
смотрят задержку (разница сохраненного значения таймера и текущего)
и делают разные действия. - Cкpипaч(14.05.2022 17:56)
- У меня требование к точности времянок было. Минимально допустимая задержка начиналась от нескольких мкс, а выдержка была с джиттером в несколько периодов инструкций. Ассемблер... Архитектурно, сразу несколько прерываний в один момент не пересекались. Далеко не ОСРВ была. - Nikolay_Po(14.05.2022 18:57)
- +1. Давно к этому пришёл. Минимум требований: 1) достаточно одного
таймера на всех, 2) нужно просто следить, что обработчики
вызываются достаточно часто, чтобы гарантировать приемлемый
джиттер. Обработчики друг от друга никак не зависят. Сплошные
удобства, короче. - SciFi(14.05.2022 18:02)
- Из "тонкого тьюнинга". На самом деле, прерывание таймера -
"пустое". Биг-луп, начинается командой halt() и стоит ждет
у моря погодылюбого прерывания. В том числе, таймера. Все проверки - просто в биг-лупе. - Cкpипaч(14.05.2022 18:14)- Так точно. Прерывания практикую, когда биг луп с необходимой
времянкой ну точно не справится, что бывает крайне редко. - SciFi(14.05.2022 18:16)
- Я тоже пришёл к мнению что выбирать нужно из двух вариантов - 1) биглуп без прерываний 2) РТОСина со всем фаршем. Полумеры фтопку. - =AlexD=(23.05.2022 14:07)
- У дураков мысли сходятся :) - Cкpипaч(14.05.2022 18:17)
- Доставай белое :-) - SciFi(14.05.2022 18:25)
- Жена привезла с Кипра "Пять Королей" (это бренди такой :-) - Cкpипaч(14.05.2022 21:22)
- Доставай белое :-) - SciFi(14.05.2022 18:25)
- Так точно. Прерывания практикую, когда биг луп с необходимой
времянкой ну точно не справится, что бывает крайне редко. - SciFi(14.05.2022 18:16)
- Из "тонкого тьюнинга". На самом деле, прерывание таймера -
"пустое". Биг-луп, начинается командой halt() и стоит ждет
- Мне проще думать "в обратной симметрии". С каким-то шагом
вызываются "обрабочики", они проверяют разные всякие условия,
смотрят задержку (разница сохраненного значения таймера и текущего)
и делают разные действия. - Cкpипaч(14.05.2022 17:56)
- Проще, но точность времянок страдает. Задержка в полтора символа на
115200/230400 да на 3-4 UART-ах сразу - ну такое себе. А уж если
под линухом каким - совсем туши свет. LightElf(115 знак., 14.05.2022 22:52)
- Никто не мешает аналогично сделать паузу любой длины. Отправляете
2, 3, 4 символа, меняете скорость/битность и тыды. Зависит от
наличных ресурсов: у STM обычно до чёртовой страсти таймеров (но
фигово, что они все разные) , а у более других камней не всегда так
шоколадно. Бывает и 4 таймера на 11 UART-ов. Поэтому считаю вариант
с использованием только ресурсов самого UART более универсальным. - LightElf(14.05.2022 14:58)
- Интересное решение, однако надо 1,5. Tyмблep(103 знак., 12.05.2022 19:08)
- Ну, не знаю. Если это хост, то мобуть, если слэйв, то нуивона.
Хосту приспичит, а тут 1,5 символа на шине. - mse homjak(12.05.2022 00:12)
- Да как приспичит - без пауз в сети асинхронная передача невозможна. Tyмблep(46 знак., 12.05.2022 19:11)
- Ну, по памяти, Модбас, это один хост и куча слэйвов? ИМХО, это хост
должен обеспечить такой зазор в передачах, чтобы все гарантированно
словили конец транзакцыи и напряглись ловить следующую. - mse homjak(12.05.2022 21:38)
- В стандарте "зазор" четко прописан. - Cкpипaч(12.05.2022 21:40)
- Спору нет. Только кто его должен обеспечить? Чота кажется, что
слэйв, занимающий шину, плохой вариант. Оттарабанил и по последнему
стоп-биту отвалился от шины. А дальше пусть хост таймаут считает, у
него
головапамять большая. - mse homjak(12.05.2022 21:48)- Смотри, как я сделал в одной из систем. Tyмблep(1188 знак., 23.05.2022 13:48)
- ХЗ, канешно, но, по моему, паранойа какойты. Если есть растяжки, зачем всё это? - mse homjak(23.05.2022 19:14)
- Читайте стандарт, там все написано. - Cкpипaч(12.05.2022 21:51)
- Приспичит, почитаю. - mse homjak(12.05.2022 21:56)
- Смотри, как я сделал в одной из систем. Tyмблep(1188 знак., 23.05.2022 13:48)
- Спору нет. Только кто его должен обеспечить? Чота кажется, что
слэйв, занимающий шину, плохой вариант. Оттарабанил и по последнему
стоп-биту отвалился от шины. А дальше пусть хост таймаут считает, у
него
- В стандарте "зазор" четко прописан. - Cкpипaч(12.05.2022 21:40)
- Ну, по памяти, Модбас, это один хост и куча слэйвов? ИМХО, это хост
должен обеспечить такой зазор в передачах, чтобы все гарантированно
словили конец транзакцыи и напряглись ловить следующую. - mse homjak(12.05.2022 21:38)
- Да как приспичит - без пауз в сети асинхронная передача невозможна. Tyмблep(46 знак., 12.05.2022 19:11)
- Можно сам UART использовать как таймер. По первому TXC переключить
ножку TX в GPIO и "отправить" пустой символ. А уже по второму TXC
переключать драйвер. Будет пауза в один символ. - LightElf(12.05.2022 02:21)
- Для дополнительной помехоустойчивости Tyмблep(94 знак., 11.05.2022 23:51)
- Чего непонятного? mse homjak(409 знак., 11.05.2022 23:12)
- Нихуя не понял, но очень интересно IBAH(8 знак., 11.05.2022 21:48, youtube)
- Тоже вариант. Но тут наслоение от программного 485 - IBAH(11.05.2022 21:27)
- Попробуй сначала добавить байт в буфер Tyмблep(213 знак., 11.05.2022 16:53)
- Вот именно поэтому плюсы вредны. Пока вы о них думали, у вас
элементарный косяк в алгоритме был. Объектное ориентирование
заориентирует похлеще Сусанина. - SciFi(11.05.2022 16:34)
- А гидэ там упоминание о "плюсах"? - Argon(11.05.2022 21:31)
- Почерк - Kpoк(12.05.2022 21:59)
- Похоже, я его с кем-то спутал. Пардон муа. Но тезис-то верен: если
бы там были ещё и плюсы, было бы ещё хуже! :-) - SciFi(12.05.2022 21:45)
- Аа, "вшивый о бане"? Ну это регулярно! )) - Argon(13.05.2022 07:18)
- А гидэ там упоминание о "плюсах"? - Argon(11.05.2022 21:31)
- Кто то не умеет делать фифы? - ASDFS(11.05.2022 15:33)
- Govnocode detected. У нормальных пацанов ничего не висит :-) - il-2(11.05.2022 15:32)
- обоснуй ! - sav6622(11.05.2022 14:49)
- У всех прошу прощения. Перебздел на рефакторинге. Все там
нормально, потокобезопасно и подтверждено многолетними тестами.
Хотя вот это мне не нравится (TxHead==TxTail) &&
(((USART1->ISR)&USART_ISR_TXE)!=0), какая то стрёмная
проверка IBAH(790 знак., 11.05.2022 20:42)