Цитата(koyodza @ Nov 9 2009, 19:17)

Или Вы предлагаете после получения совпадения CRC продолжать принимать пакет, параллельно пересчитывая CRC и убеждаясь (по другим признакам) что пакет битый, после чего ждать нового совпадения CRC?
Да, я предлагаю делать так.
До тех пор пока не прошел требуемый таймаут есть вероятность того, что произойдет ошибка (напр символ через 1.5 символьных интервала), поэтому переходить к приему сл. пакета нельзя, а раз нельзя то продолжаем принимать текущий.
Цитата
Данное нарушение пока не стало частью стандарта. И пока это является именно грубым нарушением.
Нет никакого нарушения стандарта, тем более грубого:
Код
1. При совпадении CRC текущего пакета background task создает копию принимаемого пакета,
и записывает перекресную ссылку (друг на друга) в текщий пакет и его копию,
а также взводит callback c таймаутом на отправку копии пакета.
2. background task приступает к формированию ответа на запрос незамедлительно,
ответ на запрос формируется в этой же копии пакета.
3. Взависимости от того что наступит раньше - вызов callback'а по таймауту
или прием символа по уарту:
a. вызов callback'а наступает раньше.
- удаляется перекресная ссылка из пакета и копии пакета (т.е. копия отвязывается от приемника)
- приемник (оригинал пакета) обнуляется - переход к приему нового пакета
- проверяется полностью ли сформирован ответ на запрос:
если ответ сформирован, тогда
он нативно отправляется ровно через указанный в стандарте минимальный межпакетный интервал
(в 99% случаев имеет место именно этот случай).
- если ответ еще не сформирован - повторно взводится callback с таймаутом в одно-символьный интервал.
b. eсли раньше примется символ, прошло не более 1.5 символьного интервала от последнего принятого символа,
копия помечается как бракованая (при вызове callback'a удалится автоматически), а символ добаляется к текущему
пакету и подсчет CRC продолжается.
с. если раньше примется символ, но 1.5 символьный таймаут уже пройден -
копия пакета помечается как бракованая и оригинальный пакет обнуляется.
Собсно вот так у меня реализовано, алгоритм ниоткуда не слизанный, просто устройств в сети много, и опрашиваются непрерывно. Эти 1-2% КПД канала это +1..2 устройства в сети без ухудшения характеристик всей системы.
Цитата
Вычитка" архива (да пусть хоть даже и запись) никакого отношения к процедуре обмена не имеет. Даже если вычитываются запрошенные данные, лучше не начинать "вычитку" не приняв до конца запрос.
Расскажите это мастеру который хочет прочитать данные со слейва которые лежат в i2c eeprom'е. Если быть точнее - расскажете мастеру почему ответ на его запрос появляется не через 3.5 символьных интервала, а через 7 (4-5ms - среднее время i2c транзакции).
Цитата
Минимальное время реакции на прерывания по разным причинам приходится обеспечивать в большинстве достаточно крупных проектов.
А вот понятия modbus и "максимально возможный КПД использования канала" - не вполне совместимы. Обычно modbus применяется там, где загрузка канала не очень высока. Иначе - нужно выбирать другой протокол, а (возможно) и другую "физику" (т.е. не 485)
Я считаю, гоняться за наносекундами в обработчиках прерываний - нет смысла. Что 32 регистра в стек будет сохраняться что 1, какая разница? это вопрос микросекунды. А если что-то совсем совсем критичное ко времени реакции - проще поставить плиску или какой-нибудь мелкий МК в помощь, чем лишать себя свободы в обработчиках прерываний. Тобиш минимальное время реакции это удел мелких проектов. В крупных проектах бывает удобно уменьшать число прерываний как таковых за счет пакетной обработки нескольких прерываний от нескольких периферийных модулей за один заход. Реакция возрастает, но накладные расходы на вход-выход в обработчик снижаются пропорционально количеству обработанных за один заход прерываний.
А вот там где счет идет на миллисекунды, предпочитаю их не терять.
Максимальный КПД канала он к любому протоколу применим, в т.ч. и к Модбас, т.к. в нем минимальное время между пакетами оговоренно стандартом, вот к нему надо стремиться.
Да и на 485-м можно иметь вполне причную скорость ~2Mbps.