![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
TheDestroyer |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2007 Репутация: нет Всего: нет |
Здравствуйте
Ситуация: 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 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Возможно сцепляются переданные пакеты и мастер их читает за одно чтение. Т.е. если 2 пакета будет принято зараз, то общее время как раз увеличится в 2 раза. Пакеты при приеме разделяются по timeout'у
|
|||
|
||||
TheDestroyer |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2007 Репутация: нет Всего: нет |
Структура обмена такая:
запрос от master, ответ от slave Т.е. без запроса slave не пошлет информацию. Также в функции ReadFile явно указано количество байт для чтения (19 байт), соответственно читаться в два раза больший объем не может. Выключил в биосе компьютера функцию динамического изменения частоты, чтобы избежать проблем с подсчетом тактов процессора для таймера, всеравно проблема осталась. Соответственно замедляется чтение. Почему пока не могу понять... |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Попробуй поднять приоритет нитям обмена с COM портом (можно до realtime).
|
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: -1 Всего: 14 |
частота некотторых просессоров может меняться в зависимости от нагрузки
при этом даже частота ядер одного и того-же процессора и частота процессоров на многопроцессорных системах может не совпадать в конкретный момент времени |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Но скорость COM порта от этого меняться не должна ![]() 2 TheDestroyer - какая скорость порта? time_MainThr этой скорости соотвествует? Еще может сыграть встроенный FIFO в порте, он как раз чуть меньше размера пакета и таймаут по его заполнению может иногда срабатывать |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: -1 Всего: 14 |
может не скорость мняется, а время некорректно вычисляется |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
TheDestroyer, пробуй использовать GetTickCount, либо вычисляй частоту (QueryPerformanceFrequency) всякий раз перед замером (перед каждым стартовым отрезком замера: startTime)
просто на разных участках обработки буферов у тебя может быть и разная производительность, а ты ее всю под одну гребенку меришь, вот и выходят такие разрывы -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Да, это может быть. Хотя автор писал, что
Возможно не до конца выключил, или Винда включила обратно ![]() |
||||
|
|||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: -1 Всего: 14 |
вообще не стоит расчитывать в многозадачной системе на постоянное время - ещеж куча задач крутится
максимум что можно сделать - выставить процессу realtime приоритет - но и в этом случае есть еще системные задачи - например по обслуживанию железа |
|||
|
||||
TheDestroyer |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2007 Репутация: нет Всего: нет |
Спасибо за советы.
Приоритеты на потоки поставил:
Проверил, выставились нормально. Спонтанные задержки в чтении пропали только после того, как на обоих (master и slave) компьютерах выставил realtime приоритет потоков. Интересно то, что при стандартном приоритете потока цикл while(1) {i++;} занимает ровно 50% процессорного времени (двухядерный процессор), но оба ядра загружены неравномерно, то одно больше, то другое. При наивысшем приоритете этот цикл занимает тоже ровно 50% процессорного времени, но одно ядро загружено всегда на 100%, а второе почти не грузится. Замер времени показал, что сильная задержка возникала в
т.е. шло ожидание окончания чтения. Спасибо большое за советы, xvr и J0ker по "плюсу", но пока постов недостаточно |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |