Форум: "Система";
Текущий архив: 2003.09.08;
Скачать: [xml.tar.bz2];
ВнизКак избавиться от потерь при чтении I/O портов? Найти похожие ветки
← →
Mishel (2003-06-25 14:49) [0]Есть подозрения, что винды повинны в потере данных при считывании I/O портов.
Имеется железяка, которая вставляется в PCI, и с которой из 9 портов читаются данные. За 1 сек по 8000 байт на 8 портах. 9-тый порт - готовность считывать данные с остальных 8-ми. Т.е. всего в 1 сек - 8000 * 8 = 64000 байт. Железяка сама имеет буфер на 128000байт = 2сек. Если буфер переполняется, данные пишутся по кольцу, затирая самые старые. На железяку не грешу т.к. прога под старый добрый ДОС успевает все читать.
Для доступа из-под Виндов XP написал драйвер - просто читать/писать в порты. Идут пропуски данных (чтение крутится в цикле Repeat-Until + даю отработать Application.ProcessMessages). Приблизительно 2 пропуска на секунду. Под Win 98 через драйвер - пропусков еще больше. Причем переписав прогу под 98 с доступом напрямую к портам (без драйвера, через ASM->In,Out) кол-во потерь не уменьшилось. Досовский вариант проги запущенный под 98 тоже начинает давать пропуски (хотя под голым Досом потерь небыло). Пробовал использовать доступ к портам через драйвер от Jungo WinDriver 6.02 - потери уменьшились, но только процентов на 20-25. Вроде объем данных невелик, а потери есть.
Какие-нибудь мысли есть по данному поводу? На комп не грешу - P4-2.4Ггц и т.д.
Сейчас пробую переписать драйвер, чтобы читать сразу все 9 портов за раз (уменьшу в 9 раз кол-во обращений за 1 итерацию цикла к драйверу). Но все-равно странно, что под 98 без драйвера - и тоже потери...
← →
N169 (2003-06-25 14:57) [1]Планировщик задач гадит. Потому, что не предназначен для управления реального времени. Добавьте в цикл чтения OutputDebugString() с сообщением и смотрите вывод с помощью DbgView. Увидите картину воочию.
Девайс имеет флаг готовности данных? А прерывание он может выдать при установке этого флага? Если да, то делаем обработчик в драйвере и прощайте-потери-данных.
← →
Mishel (2003-06-25 15:50) [2]To: N169
Так OutputDebugString() в цикле покажет тоже, что и драйвер читает. Флаг готовности лежит в одном из 9 портов как выставился - читаю остальные 8 и дальше распихиваю данные. Железяка прерывание выдавать в ближайшем будушем не сможет. Попутный вопрос - что, у вас бал опыт работы через прерывания и там нормально разрязывается?
Если планировщик гадит, как его загасить/поднять приоритет задачи?
Ведь остальное железо как-то работает в виндах и наверное тоже многое критично относится к потерям своих данных
← →
N169 (2003-06-25 16:02) [3]>что, у вас бал опыт работы через прерывания и там нормально
>разрязывается?
был, удавалось инициировать события от железяки по прерыванию. Обработка шла в драйвере. Частота запросов до 5 кГц максимум.
Потерянных запросов не наблюдалось вообще.
Программным опросом из приложения такие параметры не получить.
>Если планировщик гадит, как его загасить/поднять приоритет
>задачи?
Не поможет. Останется системный квант времени. Останутся несколько десятков потоков от приложений системы и пользователя.
В общем, цикл опроса всегда будет "рваным".
IMHO, в вашем случае годится только программно-аппаратное решение.
>Ведь остальное железо как-то работает в виндах
>и наверное тоже многое критично относится к потерям своих данных
"Всё железо" - понятие абстрактное. Некоторые девайсы используют аппаратные прерывания, некоторые - буферизацию (звуковые карты, например).
Только не все разработчики нестандартных девайсов знают про особенности Windows, а честные программисты потом мучатся!
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.09.08;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c