Wait 1us..10us

Тема в разделе "WASM.WIN32", создана пользователем S_Alex, 28 янв 2010.

  1. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Доброго времени суток.
    Пишу прогу (точнее переписываю) чтение данных с последовательного АЦП (12бит).
    Девайс подключен к СОМ порту, интерфейс организовал через EscapeCommFunction, внаглую дергаю вывода, на старых машинах, аля Целер 500, работала.
    Потом неопытный асспирант спалил АЦП, и тут начались проблемы, год железяка валялась, потом заменил почни всё "железо", а она показывает "цену на ГВОЗДИ", но некая коррфункция с адекватным значением наблюдается если делать измерения по одному каналу. Как только начинаю переключать каналы, нет слов...

    Думаю, что проблема во временных интервалах, если играться с параметром вот этой функции, то есть некие улучшения в работе.

    И так. Вопрос к знатокам.
    Как подождать от 1 мкс до 100мкс в юзер моде?
    Может функцию как-то упростить? Или ...
    Прога была писана 6 лет назад, на заре моей программерской. Тогда такого городил... Караул.

    Код (Text):
    1. Wait_us     proc    us_Time:DWORD
    2. LOCAL   PerformanceCount:LARGE_INTEGER
    3. LOCAL   PerformanceCountx:LARGE_INTEGER
    4. LOCAL   Tick_Wait:DWORD
    5.  
    6.     invoke QueryPerformanceFrequency, ADDR PerformanceCount
    7.         mov eax,DWORD PTR [PerformanceCount]
    8.         mov PerformanceCount1,eax
    9.         mov eax,DWORD PTR [PerformanceCount+4]
    10.         mov PerformanceCount2,eax
    11.  
    12.     mov     eax,            [PerformanceCount1]
    13.     invoke  IntMul,eax,[us_Time]
    14.     invoke  IntDiv,eax,1000000
    15.     mov     [Tick_Wait],eax
    16.     invoke QueryPerformanceCounter, ADDR PerformanceCountx
    17.  
    18.     mov     eax,            dword ptr [PerformanceCountx]
    19.     add     [Tick_Wait],    eax
    20. @@:
    21.     invoke QueryPerformanceCounter, ADDR PerformanceCount
    22.     .if eax
    23.         mov     eax,        dword ptr [PerformanceCount]
    24.         cmp     eax,        [Tick_Wait]
    25.         jc      @B
    26.     .else
    27. KosjaK:
    28.         ;invoke SendMessage,hDlg,WM_CLOSE,0,0
    29.         ret
    30.     .endif
    31.     ret
    32. Wait_us     endp
     
  2. BaGiE

    BaGiE New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2005
    Сообщения:
    84
    Адрес:
    Mordor
    сам недавно искал точные таймеры:
    более менее интересное по теме и может что пригодится:
    http://www.wasm.ru/forum/viewtopic.php?id=9034
    http://www.codeproject.com/KB/system/timers_intro.aspx
    http://www.rsdn.ru/forum/winapi/1387967.1.aspx
    http://users.livejournal.com/_winnie/151099.html
    http://www.virtualdub.org/blog/pivot/entry.php?id=272
    http://www.wasm.ru/forum/viewtopic.php?id=31308
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    S_Alex
    Переделать железку код переписать. Выкинуть задержки.

    Код (Text):
    1. invoke  IntMul,eax,[us_Time]
    2.     invoke  IntDiv,eax,1000000
    Если у тебя частота более 2 ГГц то в eax число отрицательное будет и ошибка в вычислениях скорее всего.
     
  4. BaGiE

    BaGiE New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2005
    Сообщения:
    84
    Адрес:
    Mordor
    а еще я понял, что QueryPerformanceCounter вроде как обычно использует таймер на мат. плате, но его показания могут меняться в реалтайме и лучше этот метод использовать только для вычисления времени выполнения на коротких промежутках, а не для таймеров.
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    При загрузке система выбирает таймер. Или при установке драйверов.
    Должен выбирать наибыстрейший таймер, но это не всегда так.
    В большинстве случаях частота фиксирована и не меняется при исполнение в реалтайме.

    Но не исключено что на 1%(точно не знаю) компьютеров метод начнет выдавать не фиксированные значения.
     
  6. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    А что делать с Intel SpeedStep и аналогичной плюшкой от AMD, из-за которых эти значения и без того начинают прыгать если нет сильной загрузки CPU. Вот у меня в холостом режиме эта фишка сбавляет частоту аж в 2 раза.
     
  7. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Когда-то писал что-то подобное для программно-аппаратного протокола HSP5 (KEB). Ввиду того что винда (особенно NT-линейки)очень далека от ОСРВ, пришлось делать все под DOS, но под вин98 тоже пахало.
    никак
     
  8. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    ADD: кстати не мешало бы прочитать про квант времени ядра винды
     
  9. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    можно попробовать старым добрым способом, но и он под виндой не идеален
    Код (Text):
    1. mov ecx, 1usec_ticks
    2. mov eax, 100
    3. mul ecx
    4. @@:
    5. dec eax
    6. jnz @b
    при этом 1usec_ticks можно попробовать посчитать с помощью (rdtsc/rdpmc)/(QueryPerformanceCouter/QueryPerformanceFrequency) и разделить на среднее значение разницы (rdtsc/rdpmc)/(QueryPerformanceCouter/QueryPerformanceFrequency) для 10000-1000000 иттераций цикла dec eax\jnz @b
     
  10. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    ..Если б дело было в десятках ms, еще куда не шло.
     
  11. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    имхо, идеальный выход - поставить мегу с её стандартным АЦП + коннект к компьютеру можно сделать даже через USB. мне кажется что для решения задачи оцифровки сигнала юзать комп слишком накладно.
     
  12. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    за 1us не скажу, а вот 100us для программатора - поставил таймер на 1006ВИ1 - и все дела. для пня 3ГГц под вынь ХР - на 0.1 мс 14 циклов чтения из ЛПт через inpout32.dll (или 47 циклов из под дос на целероне 300 МГц из форта). с другой стороны, исходя из этих данных, думаю, даже через драйвер и систему RTC 1-10us из-под винды реализовать крайне сложно, если вообще возможно
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    1 mks это считывание значения с порта 0x80.
    Ещё можно поднять приоритет и сделать замер количества итераций в цикле за определённое время. Я так делал анимацию спрайтов и работало достаточно хорошо.