Сейчас на форуме: vsv1, r0lka, -Sanchez-, testrev1337, johnniewalker (+3 невидимых) |
eXeL@B —› Крэки, обсуждения —› Помогите пофиксить чужой баг (Borland C++) |
<< . 1 . 2 . |
Посл.ответ | Сообщение |
|
Создано: 16 января 2010 01:31 · Поправил: SergX · Личное сообщение · #1 Описание софта: Есть софтинка CarTest-injector нужная мне для работы. Под неё уже сделано всё железо. Прога эта управляет стендом для чистки/проверки автомобильных бензиновых форсунок. Она формирует сигнал нужной формы на 4-ый пин COM порта (DTR). Ни как не проверяет наличие адаптера и не ждёт никакого ответа, просто посылает импульсы. Прога написана на Borland C++ и ни чем не пакована, защиты тоже нет. Не проблема конечно и самому написать аналог, но жалко времени, которого и так нет… Описание бага: Прога проверялась мной на нескольких стационарных компах и на нескольких ноутах. На ноутах при нажатии на кнопку “Start”, тест который должен идти 60сек доходит до 100% за 15-20сек при этом и частота импульсов левая… На стационарных всё нормально. Читал на форумах что у многих та же хрень. Что нарыл: Прога юзает файл IOPORT.DLL который вовсе не DLL а какая-то хрень. Событие при создание главного окна - 004025F0 Процедура кнопки СТАРТ - 00401784 Тут процедура СТАРТ начинает что-то чудить с IOPORT.DLL - 00401A93 Процедура кнопки СТОП - 00402488 Используется два VCL таймера, обработчик первого - 004025AC, со вторым не разобрался… Софт тут: Просьба ко всем у кого есть 3 свободные минуты: проверьте сколько времени у вас будет длится тест после нажатия кнопки “START” (без изменения настроек). В идеале должно быть 60сек. И напишите какой у вас результат по времени, проц и версия маздая. Буду благодарен за любые советы. |
|
Создано: 17 января 2010 14:24 · Поправил: SergX · Личное сообщение · #2 Всем большое спасибо. ToBad пишет: Ты не пробывал промониторить что идёт на ком порт? Может данные с ноутов вообще не посылаются? Импульсы есть на всех компах где есть COM порт. Подключив стенд с форсунками ошибиться тут не возможно. Проблема в длине импульсов и задержках между ними. ClockMan пишет: /*401DD7*/ PUSH 0049B531//Данная версии программы не является зарегестрированной и не будет работать на данном компьютере! SVLab пишет: SergX, конечно, говорил, что "Наличие устройства определить не возможно так как в нём нет никаких мозгов", но зачем тогда сообщение "Блок не найден! Проверьте правильность подсоединения блока и его питания!" Странно.. Получается, что прога действительно ломана... SVLab пишет: Отличие COM портов на ноутах может быть аппаратным, обычно уровни сигналов там не соответствуют стандарту RS232 ...........//............. По моему, для этого особые мозги устройству и ненужны, достаточно проверить уровни. Уровни могут конечно и отличаться, но программно можно узнать только состояние регистров COM порта. Устройство которое я сделал для этой проги подключается к СОМ порту только одним проводком к пину RTS. Этот пин однонаправлен и работает только как выход. Ещё раз напомню что устройство реагирует на команды с порка как на стационарных так и на ноутах, проблема только в частоте/скорости. Например в режиме кавитиции форсунки должны издавыть громкое жужжание, из за неправильных частот на ноутах слышен только писк. ToBad пишет: Фишка в том, что весь процесс при нормальных условиях должен занимать где то минуту, ибо играют роль продолжительность импульсов и время между ними. Со слов топикстартера ясно, что на ноутах всё работает так же, только за 20 секунд, то есть ускорено в 3 раза. Всё точно, но не ровно за 20 сек. это значение плавает +-5 сек. Причём меняется после перезапуска проги. ToBad пишет: p.s. В общем так получается, мы запоминаем значения вызвав функцию с инструкцией rdtsc, затем по адресу 401563 делаем секундную паузу sleep, затем ещё раз функу с rdtsc. Таким образом автор вычисляет на сколько изменился TSC (Time Stamp Counter) за секунду. Так или иначе проблема тут. У кого ещё остались сомнения - поменяйте интервал sleep в большую и меньшую сторону. Тут и ошибка про 4Ггц всплывёт, и проход за 15-20 секунд как на ноуте увидите на стационарном.... Всё сходится С rdtsc я не силён, сейчас буду гуглить. Насколько я понял могу решить проблему подбором константы для своего ноута ? |
|
Создано: 17 января 2010 16:04 · Поправил: Clerk · Личное сообщение · #3 NT не является операционной системой реального времени. Также и железо не позволяет использовать сверхточные таймеры. HPET, APIC, RTC подключены к одному и томуже тактовому генератору, просто разный коэффициент деления, это значит что погрешность одинаковая. Также и прерывания - если они слишком часты, то ось захлебнётся. TSC использовать в условиях вытесняющей мультизадачности смысла нет - исполнение потока будет отложено в случайный момент и может быть весьма продолжительным, например дисковые операции, или тотже RIT - имеет наивысший приоритет. Нормально реализуется в виде контроллера, который после сбора и обработки информации даст запрос на прерывание. Это позволяет разгрузить ось. |
|
Создано: 17 января 2010 16:30 · Поправил: SergX · Личное сообщение · #4 Clerk я уже давно пришёл к выводу что стабильной и удобной работы стенда под управление ПК не добиться. Со временем сделаю автономный девайс с кнопочками и экранчиком на микроконтроллере Atmel который будет всем этим делом управлять. Но перед тем как делать что-то своё хочу поработать на чужом, чтобы понять, что мне нужно. |
|
Создано: 17 января 2010 18:20 · Личное сообщение · #5 SergX пишет: Насколько я понял могу решить проблему подбором константы для своего ноута ? Да, если для одного ноута - то это идеальный вариант. Хотя оказаться может всё не так просто. Дело в том, что описанный мною участок замера кол-ва тактов за секунду - это не большая проблема, и подобрать легко таймером и заменить можно результат на готовую константу снятую со схожего по частоте стационарного компа. Хуже то, что уже после нажатия кнопки старта функция с rdtsc вызывается очень часто в цикле. Фактических вызовов всего 4, два при запуске софта для замера кол-ва тактов в секунду - остальные по ходу работы. Как бы сделал я для одного ноута если бы решил не вдаваться в дебри глюков функи на мобильных процах? Во первых заменил бы все 4 вызова на вызов своей функи из длл. В ней определял бы место вызова из кода обозначив номерами. Далее заставил бы свою функцию выдавать результат работы оригинальной функции и писал бы всё в лог файл. Думаю на точность расчётов сильно не повлияло бы... Как пишет Clerk NT не является операционной системой реального времени но тут речи и не идёт о супер точности и супер скорости, мы же не операцию на сердце делаем, форсунки блин жужжат по разному , проблема ведь в разнице 20 сек +-5 и 60 +-10, как я понял при минуте работы +-5-10 сек на разных компах не критично для подключенного оборудования... Следовательно логгер результатов работы функции запущенный на схожем с ноутом по быстродействию нормальном компе где нет проблемы - даст достаточно точные результаты для последующей эмуляции работы функции с вызовом rdtsc на ноуте... SergX В любом случае информируй об успехах, очень интересно чем всё закончится... |
|
Создано: 17 января 2010 18:46 · Личное сообщение · #6 ToBad > но тут речи и не идёт о супер точности и супер скорости Так как используется TSC, значит не достатончо частоты/стабильности(последнее в юзермоде теряет смысл): o Ядерных таймеров в юзермоде. o Системинфо. o Так как системные счётчики можно читать, посредством маппинга ядерной памяти, сюда отнесём и PIT. Тогда переносите весь функционал по обработке в ISR(дров как обычно). Тогда практически видно будет - работает или нет. В любом случае это не тру. Нужен полноценный интерфейс. |
|
Создано: 17 января 2010 22:42 · Личное сообщение · #7 |
|
Создано: 17 января 2010 23:06 · Поправил: SergX · Личное сообщение · #8 ToBad пишет: Clerk по тулзе видно, что автор писал как мог, а мог он не очень, отсюда и глюк для мобильных процов... бугага )) +100500 ToBad пишет: Думаю для инжекторов с которыми имеет дело SergX - -+10% погоды не сделает... Вся беда в том, что сделает... Дело не в продолжительности теста, а в частоте и скважности, на которой работает форсунка. Тот же режим кавитации или самопрокачки это не просто цоканье клапаном, а довольно сложный физический процесс. З.Ы. Хотя я не уверен что аффтор софта сделал правильно всё остальное кроме расчёта задержек. |
|
Создано: 18 января 2010 01:46 · Личное сообщение · #9 |
|
Создано: 18 января 2010 03:17 · Поправил: Clerk · Личное сообщение · #10 |
|
Создано: 18 января 2010 03:54 · Личное сообщение · #11 |
|
Создано: 18 января 2010 05:54 · Личное сообщение · #12 Цитата из книги Нестандартные приёмы программирования на DELPI автор Ревич.Ю.В. стр447 Отметим,что в Windows XP, согласно моим наблюдениям, ситуация одновременно и хуже и лучше: малые промежутки времени вообще не отмеряются, можно сказать никак,а большие (секунда и выше) измеряются точнее.Так обычно частоту процессора измеряют несколько раз, применяя ту же rdtsc, и затем усредняют полученные значения. Заметим также, что в ноутбуках с механизмом подстройки тактовой частоты всё это просто может не заработать ----- Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли. |
|
Создано: 27 января 2010 14:08 · Поправил: SergX · Личное сообщение · #13 ToBad пишет: SergX В любом случае информируй об успехах, очень интересно чем всё закончится... ToBad, в общем ты был абсолютно прав насчёт rdtsc. Спасибо Пофиксить трабл с rdtsc пока не вышло, пробовал разные варианты... В проге забил частоту проца константой и всё стало ок. А может и не всё... проц: Intel Pentium M processor 1600MHz Code:
ToBad пишет: Хуже то, что уже после нажатия кнопки старта функция с rdtsc вызывается очень часто в цикле. об этом я забыл... поковыряю, напишу о результатах. |
<< . 1 . 2 . |
eXeL@B —› Крэки, обсуждения —› Помогите пофиксить чужой баг (Borland C++) |