Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > COM порт, задержки чтения |
Автор: TheDestroyer 6.5.2009, 11:44 | ||||||
Здравствуйте Ситуация: 2 компьютера (master и slave), 1 микроконтроллер (МК). Все общается по COM-портам. Микроконтроллер по запросу от компьютера slave передает ему информацию. Компьютер slave по запросу от master-а передает ему информацию. Программа на оба компьютера одна, у нее есть режим master и slave. Обмен с микроконтроллером в режиме slave крутится в отдельном потоке. Обмен компьютеров друг с другом в режимах master и slave тоже крутится в отдельных потоках. Следующая проблема: Все работает, но в какие-то моменты на master-е чтение из COM порта занимает время, больше обычного раза в два. Замеряю время с помощью точного таймера:
Инициализация порта:
Поток чтения на master-е выглядит следующим образом:
Переменные time1-time4, time_MainThr использую для замера времени выполнения кусков кода. Обычно получается time1 = 14мкс, time2 = 20мкс, time3= 1360мкс, time_MainThr = 2700мкс Общее время time4 =4100мкс Проблема в том, что time_MainThr примерно раз в 10 циклов = 5400мкс, а то и 8000мкс, т.е. проблема именно в том, что чтение из порта замедляется. Пробовал не в overlapped режиме, но результат тотже. Может замер времени происходит неправильно, а скорее замедляется чтение. Подскажите, пожалуйста, в чем может быть проблема? |
Автор: xvr 6.5.2009, 12:19 |
Возможно сцепляются переданные пакеты и мастер их читает за одно чтение. Т.е. если 2 пакета будет принято зараз, то общее время как раз увеличится в 2 раза. Пакеты при приеме разделяются по timeout'у |
Автор: TheDestroyer 6.5.2009, 13:24 |
Структура обмена такая: запрос от master, ответ от slave Т.е. без запроса slave не пошлет информацию. Также в функции ReadFile явно указано количество байт для чтения (19 байт), соответственно читаться в два раза больший объем не может. Выключил в биосе компьютера функцию динамического изменения частоты, чтобы избежать проблем с подсчетом тактов процессора для таймера, всеравно проблема осталась. Соответственно замедляется чтение. Почему пока не могу понять... |
Автор: xvr 6.5.2009, 13:36 |
Попробуй поднять приоритет нитям обмена с COM портом (можно до realtime). |
Автор: J0ker 6.5.2009, 19:39 |
частота некотторых просессоров может меняться в зависимости от нагрузки при этом даже частота ядер одного и того-же процессора и частота процессоров на многопроцессорных системах может не совпадать в конкретный момент времени |
Автор: xvr 6.5.2009, 19:57 | ||
Но скорость COM порта от этого меняться не должна ![]() 2 TheDestroyer - какая скорость порта? time_MainThr этой скорости соотвествует? Еще может сыграть встроенный FIFO в порте, он как раз чуть меньше размера пакета и таймаут по его заполнению может иногда срабатывать |
Автор: J0ker 6.5.2009, 20:27 |
может не скорость мняется, а время некорректно вычисляется |
Автор: GremlinProg 6.5.2009, 22:01 |
TheDestroyer, пробуй использовать GetTickCount, либо вычисляй частоту (QueryPerformanceFrequency) всякий раз перед замером (перед каждым стартовым отрезком замера: startTime) просто на разных участках обработки буферов у тебя может быть и разная производительность, а ты ее всю под одну гребенку меришь, вот и выходят такие разрывы |
Автор: xvr 7.5.2009, 08:42 | ||||
Да, это может быть. Хотя автор писал, что
Возможно не до конца выключил, или Винда включила обратно ![]() |
Автор: J0ker 7.5.2009, 09:07 |
вообще не стоит расчитывать в многозадачной системе на постоянное время - ещеж куча задач крутится максимум что можно сделать - выставить процессу realtime приоритет - но и в этом случае есть еще системные задачи - например по обслуживанию железа |
Автор: TheDestroyer 12.5.2009, 11:54 | ||||
Спасибо за советы. Приоритеты на потоки поставил:
Проверил, выставились нормально. Спонтанные задержки в чтении пропали только после того, как на обоих (master и slave) компьютерах выставил realtime приоритет потоков. Интересно то, что при стандартном приоритете потока цикл while(1) {i++;} занимает ровно 50% процессорного времени (двухядерный процессор), но оба ядра загружены неравномерно, то одно больше, то другое. При наивысшем приоритете этот цикл занимает тоже ровно 50% процессорного времени, но одно ядро загружено всегда на 100%, а второе почти не грузится. Замер времени показал, что сильная задержка возникала в
т.е. шло ожидание окончания чтения. Спасибо большое за советы, xvr и J0ker по "плюсу", но пока постов недостаточно |