Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Andrey V.Panukov Member
Зарегистрирован: 30.06.2004 Сообщения: 40 Откуда: Syktyvkar
|
Добавлено: Пт Сен 09, 2005 6:55 pm Заголовок сообщения: |
|
|
>либо не удавалось поймать момент, когда отключалась RTS.
Вот!
>А вот в старые времена Terminate умела отключать RTS, было видно
>невооружённым взглядом: идёт запись на диск, RTS гаснет...
Само собой, работа с регистрами реализовывалась в самой программе. Всё делалось последовательно, приняли, записали, приняли, записали и т.д.
В данном случае, если ПО не читает из порта(читает всегда, как правило), запись принимаемых данных осуществляется во внутренний буффер драйвера порта, если он переполнен и установлено аппаратное управление потоком - снимается RTS (программное - посылается XOFF).
В данном случае вырисовывается проблема другого характера, когда был принят новый байт данных, а предыдущий еще не был считан из UART. (Hardware overruns, а не buffer overruns).
Oxy,
Попробуйте увеличить/отключить FIFO на прием и на передачу. |
|
Вернуться к началу |
|
|
Technical Support Expert
Зарегистрирован: 31.10.2002 Сообщения: 6330
|
Добавлено: Пт Сен 09, 2005 7:09 pm Заголовок сообщения: |
|
|
Цитата: | В данном случае вырисовывается проблема другого характера, когда был принят новый байт данных, а предыдущий еще не был считан из UART. |
Именно так, но позвольте изложить идею несколько в другом свете. Во времена MS-DOS программы умели предугадывать возникновение ситуации, в которой драйвер последовательного порта (обычно встроенный в саму программу) не сможет получить управление в течении длительного промежутка времени и в результате не сможет вовремя считать данные из регистра (буфера) последовательного порта. Наиболее типичная ситуация - запись на диск. Предугадав такое развитие событий, программа отключала цепь RTS и таким образом принуждала модем накапливать данные в его (модема) буфере, пока ситуация не станет вновь благоприятной для приёма данных. Под Windows картина другая: ПО не умеет предугадывать неблагоприятные ситуации (в частности, переключение задач по Alt-Tab) и в результате RTS всегда включена (кроме маловероятной и не наблюдаемой на практике ситуации, когда прикладная программа не готова принять данные), и переключение задач приводит к появлению serial overruns. _________________ Inpro
Technical Support |
|
Вернуться к началу |
|
|
Andrey V.Panukov Member
Зарегистрирован: 30.06.2004 Сообщения: 40 Откуда: Syktyvkar
|
Добавлено: Пт Сен 09, 2005 7:26 pm Заголовок сообщения: |
|
|
Еще раз:
Коротенько и на пальцах.
ПО читает из порта, устанавливает таймауты, организуя запросы на чтение(буффер).
Прерывание(RDA|CTI), драйвер читает данные из UART, если в данный момент есть запрос на чтение, данные записываются в буффер запроса, если нет - во внутренний буффер.
При следующем запросе, если есть данные во внутреннем буфере - читаются из него.
Если внутренний буффер заполняется полностью и установлено аппаратное управление потоком, снимается сигнал RTS.
И в нормальном состоянии, Alt-tab ну ни как не должен вызывать overruns. (в случае w98/me - маловероятно, но возможно, учитывая архитектуру ядра). |
|
Вернуться к началу |
|
|
Technical Support Expert
Зарегистрирован: 31.10.2002 Сообщения: 6330
|
Добавлено: Пт Сен 09, 2005 10:06 pm Заголовок сообщения: |
|
|
Цитата: | Если внутренний буффер заполняется полностью и установлено аппаратное управление потоком, снимается сигнал RTS |
Этот момент полностью ясен, но разговор о другом.
Компьютер способен обрабатывать принимаемые данные с гораздо большей скоростью, чем модем их принимает и поставляет в последовательный порт. Именно поэтому буфер драйвера на практике не заполняется и RTS постоянно включена.
В направлении "на передачу" картина прямо противоположная: компьютер способен поставлять данные много быстрее, чем модем их передаёт. Поэтому постоянно происходит заполнение буфера модема, после чего он командует "подожди", отключая цепь CTS.
Вот почему мы говорили об "однонаправленном управлении потоком". Чтобы оно стало двунаправленным, должно произойти нечто из ряда вон выходящее, обрабатывающая принимаемые данные программа должна надолго "задуматься". На практике это видеть не приходилось.
Цитата: | И в нормальном состоянии, Alt-tab ну ни как не должен вызывать overruns. (в случае w98/me - маловероятно, но возможно, учитывая архитектуру ядра) |
Однако, serial overruns встречаются. Конечно, не можем со 100% уверенностью утверждать, что они порождаются именно Alt-Tab, но было подмечено, что их возникновение кореллирует с нажатием этих клавиш.
Давайте всё-таки вернёмся к обсуждению заданного вопроса, а именно: связано ли возникновение serial overruns с выбранным методом управления потоком (или отсутствием управления потоком вообще)?
Мы продолжаем утверждать, что эти вещи никак друг с другом не связаны, и Ваши комментарии лишь подтверждают эту мысль. Управление потоком призвано регулировать поступление данных в буфер драйвера, который находится между драйвером и программой, которая обрабатывает принимаемые данные. Serial overruns возникают при переполнении буфера UART последовательного порта, который "совсем другой буфер". Скажем так: если драйвер узнал, что в буфере UART есть принятый байт данных, но сохранить этот байт негде (буфер драйвера полон), то байт будет потерян и возникнет программная ошибка (переполнение буфера драйвера). Serial overrun - другое: драйвер слишком поздно узнал о том, что в буфере UART есть байт данных, пришёл следующий байт, и UART выставил признак ошибки (байт был потерян).
Всё правильно? _________________ Inpro
Technical Support |
|
Вернуться к началу |
|
|
Andrey V.Panukov Member
Зарегистрирован: 30.06.2004 Сообщения: 40 Откуда: Syktyvkar
|
Добавлено: Пт Сен 09, 2005 10:33 pm Заголовок сообщения: |
|
|
Совершенно верно. |
|
Вернуться к началу |
|
|
Oxy Member
Зарегистрирован: 03.03.2004 Сообщения: 175 Откуда: Киев
|
Добавлено: Пт Сен 09, 2005 11:28 pm Заголовок сообщения: |
|
|
2 Technical Support
Если быть точным, вопрос был именно по Hardware, а не по Serial Overruns (см. пост №5).
Цитата: | 2 All
А еще мне не нравится Hardware overruns=13 в статистике ModemSpd. |
А Serial Overruns у меня вроде не наблюдалось. |
|
Вернуться к началу |
|
|
Oxy Member
Зарегистрирован: 03.03.2004 Сообщения: 175 Откуда: Киев
|
Добавлено: Пт Сен 09, 2005 11:29 pm Заголовок сообщения: |
|
|
. |
|
Вернуться к началу |
|
|
Andrey V.Panukov Member
Зарегистрирован: 30.06.2004 Сообщения: 40 Откуда: Syktyvkar
|
Добавлено: Сб Сен 10, 2005 12:11 am Заголовок сообщения: |
|
|
Oxy,
В данном случае под serial overruns предполагалось hardware. |
|
Вернуться к началу |
|
|
Oxy Member
Зарегистрирован: 03.03.2004 Сообщения: 175 Откуда: Киев
|
Добавлено: Сб Сен 10, 2005 12:22 am Заголовок сообщения: |
|
|
Еще замечено, что Hardware overruns в статистике обычно ровно (реже -- почти) столько же, сколько CRC errors
Цитата: |
Downstream compression : None
Upstream compression : None
Connection speed : 31200 bps
Bytes received : 7243362 (at 606 B/sec)
Bytes transmitted : 682552 (at 57 B/sec)
Inactive time : 02:16:45 (efficiency 31.3 %)
Active receive speed : 1934 B/sec
Assumed cont-load recv speed : 1933 B/sec
Frames received : 21100
Frames transmitted : 0
CRC errors : 30
Timeout errors : 0
Alignment errors : 0
Hardware overruns : 31
Buffer overruns : 0
Framing errors : 0
|
Кстати, при скорости порта 230400 и коннекте 28800 Hardware Overrans все равно наблюдаются. |
|
Вернуться к началу |
|
|
Andrey V.Panukov Member
Зарегистрирован: 30.06.2004 Сообщения: 40 Откуда: Syktyvkar
|
Добавлено: Сб Сен 10, 2005 12:39 am Заголовок сообщения: |
|
|
>Еще замечено, что Hardware overruns в статистике обычно ровно
>(реже -- почти) столько же, сколько CRC errors
Естественно, пропал байт или два или ... - контрольная сумма пакета не сошлась.
>Кстати, при скорости порта 230400 и коннекте 28800 Hardware
>Overrans все равно наблюдаются.
Разумеется, увеличились?
Лучше посмотрите, в настройках порта буффера FIFO включены и на прием установлены в максимум?
Да и забейте на эти 230400, реально нафик не нужно, как припарка после бани.
зы. билли [800 кб] |
|
Вернуться к началу |
|
|
Oxy Member
Зарегистрирован: 03.03.2004 Сообщения: 175 Откуда: Киев
|
Добавлено: Сб Сен 10, 2005 1:14 am Заголовок сообщения: |
|
|
Цитата: | >Кстати, при скорости порта 230400 и коннекте 28800 Hardware
>Overrans все равно наблюдаются.
Разумеется, увеличились? |
Пока не знаю.
Цитата: | Лучше посмотрите, в настройках порта буффера FIFO включены и на прием установлены в максимум? |
Стояло по дефолту для WinME: 3/4 (наверное 12 байт).
Поставил на максимум, но вроде когда-то уже пробовал -- все равно Overruns были. |
|
Вернуться к началу |
|
|
Technical Support Expert
Зарегистрирован: 31.10.2002 Сообщения: 6330
|
Добавлено: Сб Сен 10, 2005 7:14 am Заголовок сообщения: |
|
|
Hardware overruns и serial overruns - два названия одного и того же явления. Рассмотрим простейший последовательный порт, без буфера FIFO. В нём есть два регистра, сдвиговый и буферный. Данные бит за битом поступают в сдвиговый регистр, пока не "соберутся" все 8 бит байта. После этого байт поступает в буферный регистр и последовательный порт информирует о готовности "отдать" байт. В это время в сдвиговый регистр поступает следующий байт.
Задача драйвера - прочитать (освободить) буферный регистр до того, как будет завершена сборка следующего байта. Если этого не происходит, то новый байт теряется и выставляется (аппаратно) флажок ошибки (переполнение данных, overrun). Когда драйвер в конце концов добирается до порта, он видит этот флажок и фиксирует ошибку. Счётчик таких ошибок и называется Serial overruns (в журнале модема в Windows) или Hardware overruns в ModemSpd.
При наличии FIFO суть дела не меняется, просто буферный регистр способен запомнить не один, а 16 байт, и соответственно, у драйвера есть больше времени на реагирование.
Цитата: | Стояло по дефолту для WinME: 3/4 (наверное 12 байт) |
Там не всё так линейно. Буфер всегда 16 байт. "Ползунок" задаёт, сколько байт должно накопиться в буфере, прежде чем UART последовательного порта скажет драйверу "можно забирать". И это пороги, если не ошибаемся, равны 1, 4, 8 и 14 байт. Из общих соображений понятно, что чем меньше порог, тем раньше драйвер узнает и больше у него шансов избежать переполнения буфера. С другой стороны, чем чаще "забирать", тем больше накладных расходов у драйвера.
И ещё, из общих соображений: чем выше скорость порта, тем быстрее происходит наполнение буфера и тем выше вероятность возникновения serial overrun, на что Вам и намекал уважаемый Andrey V.Panukov, который знает эти проблемы "изнутри". _________________ Inpro
Technical Support |
|
Вернуться к началу |
|
|
Oxy Member
Зарегистрирован: 03.03.2004 Сообщения: 175 Откуда: Киев
|
Добавлено: Сб Сен 10, 2005 7:05 pm Заголовок сообщения: |
|
|
Понял, попробую уменьшть порог.
Кстати, как я обещал: работоспособность моей системы на 230400 с драйвером shsmod v.1.93b подтверждаю (shsmod говорит, что чип Winbond W83977TF)
Вот только геморой появился: после выхода из Sleep Mode нужно запускать shsmod вручную.
Может кто подскажет, как автоматизировать запуск какой-либо проги при выходе из спящего режима WinME |
|
Вернуться к началу |
|
|
Technical Support Expert
Зарегистрирован: 31.10.2002 Сообщения: 6330
|
Добавлено: Сб Сен 10, 2005 7:53 pm Заголовок сообщения: |
|
|
Цитата: | Может кто подскажет, как автоматизировать запуск какой-либо проги при выходе из спящего режима WinME |
Вопрос выходит за рамки форума. Проблемы Windows обсуждаются в целой куче тематических конференций, обратитесь туда (или напрямую в техподдержку Microsoft). _________________ Inpro
Technical Support |
|
Вернуться к началу |
|
|
Oxy Member
Зарегистрирован: 03.03.2004 Сообщения: 175 Откуда: Киев
|
Добавлено: Сб Сен 10, 2005 9:44 pm Заголовок сообщения: |
|
|
Эт точно, оффтоп пошел
А с портом вроде разобрались. Всем СПАСИБО. |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group
|