Сейчас на форуме: vsv1, r0lka, -Sanchez-, testrev1337, johnniewalker (+3 невидимых)

 eXeL@B —› Крэки, обсуждения —› Помогите пофиксить чужой баг (Borland C++)
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 226.0 (наставник), 67thx
Активность: 0.160
Статус: Участник

Создано: 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, со вторым не разобрался…

Софт тут: http://slil.ru/28485204 (Размер: 366.83KB) отчёт virustotal.com для параноиков


Просьба ко всем у кого есть 3 свободные минуты: проверьте сколько времени у вас будет длится тест после нажатия кнопки “START” (без изменения настроек). В идеале должно быть 60сек. И напишите какой у вас результат по времени, проц и версия маздая.

Буду благодарен за любые советы.



Ранг: 226.0 (наставник), 67thx
Активность: 0.160
Статус: Участник

Создано: 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 я не силён, сейчас буду гуглить. Насколько я понял могу решить проблему подбором константы для своего ноута ?



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 17 января 2010 16:04 · Поправил: Clerk
· Личное сообщение · #3

NT не является операционной системой реального времени.
Также и железо не позволяет использовать сверхточные таймеры. HPET, APIC, RTC подключены к одному и томуже тактовому генератору, просто разный коэффициент деления, это значит что погрешность одинаковая. Также и прерывания - если они слишком часты, то ось захлебнётся. TSC использовать в условиях вытесняющей мультизадачности смысла нет - исполнение потока будет отложено в случайный момент и может быть весьма продолжительным, например дисковые операции, или тотже RIT - имеет наивысший приоритет.
Нормально реализуется в виде контроллера, который после сбора и обработки информации даст запрос на прерывание. Это позволяет разгрузить ось.



Ранг: 226.0 (наставник), 67thx
Активность: 0.160
Статус: Участник

Создано: 17 января 2010 16:30 · Поправил: SergX
· Личное сообщение · #4

Clerk я уже давно пришёл к выводу что стабильной и удобной работы стенда под управление ПК не добиться. Со временем сделаю автономный девайс с кнопочками и экранчиком на микроконтроллере Atmel который будет всем этим делом управлять. Но перед тем как делать что-то своё хочу поработать на чужом, чтобы понять, что мне нужно.




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 17 января 2010 18:20
· Личное сообщение · #5

SergX пишет:
Насколько я понял могу решить проблему подбором константы для своего ноута ?


Да, если для одного ноута - то это идеальный вариант. Хотя оказаться может всё не так просто.
Дело в том, что описанный мною участок замера кол-ва тактов за секунду - это не большая проблема, и подобрать легко таймером и заменить можно результат на готовую константу снятую со схожего по частоте стационарного компа. Хуже то, что уже после нажатия кнопки старта функция с rdtsc вызывается очень часто в цикле. Фактических вызовов всего 4, два при запуске софта для замера кол-ва тактов в секунду - остальные по ходу работы. Как бы сделал я для одного ноута если бы решил не вдаваться в дебри глюков функи на мобильных процах? Во первых заменил бы все 4 вызова на вызов своей функи из длл. В ней определял бы место вызова из кода обозначив номерами. Далее заставил бы свою функцию выдавать результат работы оригинальной функции и писал бы всё в лог файл. Думаю на точность расчётов сильно не повлияло бы... Как пишет Clerk NT не является операционной системой реального времени но тут речи и не идёт о супер точности и супер скорости, мы же не операцию на сердце делаем, форсунки блин жужжат по разному , проблема ведь в разнице 20 сек +-5 и 60 +-10, как я понял при минуте работы +-5-10 сек на разных компах не критично для подключенного оборудования... Следовательно логгер результатов работы функции запущенный на схожем с ноутом по быстродействию нормальном компе где нет проблемы - даст достаточно точные результаты для последующей эмуляции работы функции с вызовом rdtsc на ноуте...

SergX В любом случае информируй об успехах, очень интересно чем всё закончится...



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 17 января 2010 18:46
· Личное сообщение · #6

ToBad
> но тут речи и не идёт о супер точности и супер скорости
Так как используется TSC, значит не достатончо частоты/стабильности(последнее в юзермоде теряет смысл):
o Ядерных таймеров в юзермоде.
o Системинфо.
o Так как системные счётчики можно читать, посредством маппинга ядерной памяти, сюда отнесём и PIT.
Тогда переносите весь функционал по обработке в ISR(дров как обычно). Тогда практически видно будет - работает или нет. В любом случае это не тру. Нужен полноценный интерфейс.




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 17 января 2010 22:42
· Личное сообщение · #7

Clerk по тулзе видно, что автор писал как мог, а мог он не очень, отсюда и глюк для мобильных процов... Думаю для инжекторов с которыми имеет дело SergX - -+10% погоды не сделает... Так что думаю подойдёт любой вариант который описан выше...



Ранг: 226.0 (наставник), 67thx
Активность: 0.160
Статус: Участник

Создано: 17 января 2010 23:06 · Поправил: SergX
· Личное сообщение · #8

ToBad пишет:
Clerk по тулзе видно, что автор писал как мог, а мог он не очень, отсюда и глюк для мобильных процов...

бугага )) +100500

ToBad пишет:
Думаю для инжекторов с которыми имеет дело SergX - -+10% погоды не сделает...

Вся беда в том, что сделает... Дело не в продолжительности теста, а в частоте и скважности, на которой работает форсунка. Тот же режим кавитации или самопрокачки это не просто цоканье клапаном, а довольно сложный физический процесс.

З.Ы. Хотя я не уверен что аффтор софта сделал правильно всё остальное кроме расчёта задержек.



Ранг: 65.3 (постоянный), 10thx
Активность: 0.020
Статус: Участник

Создано: 18 января 2010 01:46
· Личное сообщение · #9

Поправьте меня, если я неправ.
Можно заменить вызов Sleep() на цикл до прохода одной секунды? Тогда процессор не будет тормозиться, и он будет выдавать то же число в rdtsc.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 18 января 2010 03:17 · Поправил: Clerk
· Личное сообщение · #10

SergX
хм
tomac
Системный счётчик тиков имеет разрешение в ~64ms. Тоесть примерно 1/16 секунды. Добавим сюда планирование - при нормальном приоритете тред свопится ~100 раз в секунду. Поэтому значение считанное из тск будет сильно плавать.



Ранг: 226.0 (наставник), 67thx
Активность: 0.160
Статус: Участник

Создано: 18 января 2010 03:54
· Личное сообщение · #11

Clerk пишет:
хм

я что-то не так сказал ?




Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 18 января 2010 05:54
· Личное сообщение · #12

Цитата из книги Нестандартные приёмы программирования на DELPI автор Ревич.Ю.В. стр447

Отметим,что в Windows XP, согласно моим наблюдениям, ситуация одновременно и хуже и лучше: малые промежутки времени вообще не отмеряются, можно сказать никак,а большие (секунда и выше) измеряются точнее.Так обычно частоту процессора измеряют несколько раз, применяя ту же rdtsc, и затем усредняют полученные значения. Заметим также, что в ноутбуках с механизмом подстройки тактовой частоты всё это просто может не заработать


-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 226.0 (наставник), 67thx
Активность: 0.160
Статус: Участник

Создано: 27 января 2010 14:08 · Поправил: SergX
· Личное сообщение · #13

ToBad пишет:
SergX В любом случае информируй об успехах, очень интересно чем всё закончится...


ToBad, в общем ты был абсолютно прав насчёт rdtsc. Спасибо
Пофиксить трабл с rdtsc пока не вышло, пробовал разные варианты...

В проге забил частоту проца константой и всё стало ок. А может и не всё...

проц: Intel Pentium M processor 1600MHz
Code:
  1. 00401554     MOV EDX, 5F5E1000   ;(5F5E1000h=1600Mhz)
  2. ........     NOP
  3. 00401589     NOP


ToBad пишет:
Хуже то, что уже после нажатия кнопки старта функция с rdtsc вызывается очень часто в цикле.

об этом я забыл... поковыряю, напишу о результатах.


<< . 1 . 2 .
 eXeL@B —› Крэки, обсуждения —› Помогите пофиксить чужой баг (Borland C++)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати