Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2011, 13:58   #1
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
Хорошо Sleep() работает не точно, как точнее

Помогите пожалуйста. Необходимо получить фиксированный интервал времени.

Вот мой код:
Код:
#include <windows.h>
#include "conio.h"
#include "stdlib.h"
#include <iostream>
using namespace std;

//////////////////////////////////////////////////////
// Тестирование функции Sleep()
int main() {

   DWORD dwTick0 = GetTickCount();
   Sleep(20);
   _RPT1(_CRT_WARN, "'Sleep(20)' work time = %u\n", GetTickCount() - dwTick0);

   _getch();
   return 0;
}
Результат работы программы:
Sleep(20)' work time = 31

Как получить более точное значение?
Какой минимальный интервал времени можно получить?
8Observer8 вне форума Ответить с цитированием
Старый 20.04.2011, 16:43   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Мультимедийный таймер точнее, функции timeSetEvent, timeKillEvent из winmm.dll, точность как бы 1 миллисекунда. Примеров по форуму-кучка.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 20.04.2011, 18:56   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Цитата:
Как получить более точное значение?
Использовать ОС реального времени.
p51x вне форума Ответить с цитированием
Старый 20.04.2011, 19:50   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Ulex, спасибо! Я находил скудную информицию о QueryPerformanceFrequency и QueryPerformanceCounter, но так и не нашёл пример их использования. К примеру: запихать их в функцию и вызывать для задержки в виде Delay(500) // 500 микросекунд. Если есть у вас ссылки на какие-либо примеры - я был бы рад, а если нет - не напрягайтесь.

p51x, какие RTOS вы имели ввиду?
8Observer8 вне форума Ответить с цитированием
Старый 20.04.2011, 20:27   #5
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Ulex, подскажите, пожалуйста, какую минимальную задержку по времени можно организовать, используя ассемблер?

Последний раз редактировалось 8Observer8; 20.04.2011 в 20:32.
8Observer8 вне форума Ответить с цитированием
Старый 20.04.2011, 21:18   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

асм где? в ос (какой)? на голом проце (каком)?
p51x вне форума Ответить с цитированием
Старый 21.04.2011, 05:32   #7
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Дело в том, что я пишу программатор микроконтроллера AT89S52, который программируется через LPT порт. На моём рабочем компьютере стоит WinXP. Процессор там фирмы Intel. Так программируется микроконтроллер очень долго из-за таких больших задержек между импульсами. К примеру, чтобы записать 50 байт уходит примерно минута. Хотелось бы сделать минимальную задержку, насколько это возможно.

Последний раз редактировалось 8Observer8; 21.04.2011 в 05:48.
8Observer8 вне форума Ответить с цитированием
Старый 22.04.2011, 06:26   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Может не зря фирмы делают JTAG отдельным модулем с МП на борту?..
p51x вне форума Ответить с цитированием
Старый 22.04.2011, 08:59   #9
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Мне интересно самому. Тем более алгоритм программирования описан в datasheete и он не сложен.

А из этого затруднительного положения я вышел так:
Код:
void Delay(unsigned int);

// Задержка
void Delay(unsigned int num) {
   for(unsigned int count = 0; count < num; count++) {
      __asm {
         NOP
      }
  }
}
Числа num я подгонял использовав логический анализатор осциллографа. Понятно, что задержки будут разные на разных машинах. Но я программирую в последовательном режиме и мне главное обеспечить частоту CLOCKa (по которому микроконтроллер хватает или выдаёт бит) меньше чем ЧастотаМикроконтроллера/16, как написано в datasheete. У меня ЧастотаМикроконтроллера = 12 МГц.

Последний раз редактировалось 8Observer8; 22.04.2011 в 10:05. Причина: NOP забыл
8Observer8 вне форума Ответить с цитированием
Старый 22.04.2011, 15:01   #10
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

msdn://Using Multimedia Timers

На делфях выглядит примерно так:

delay - частота вызва TimerProc в мс
resolution - разрешение, оно же "точность", измеряется в попугаях. При значении 0 разброс промежутков между вызовами будет минимально возможным для не-RTOS, но в ущерб общей производительности системы

Код:
procedure TimerProc(uTimerID, uMessage, dwUser, dw1, dw2: DWORD); stdcall;
begin
  //потокобезопасный код (неблокирующие функции, критические секции и прочие радости жизни) 
end;

timeSetEvent(delay, resolution, @TimerProc, 0, TIME_PERIODIC);
пыщь
JTG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу найти ошибку,точнее как исправить!(Задание с файлами) Ксения Вадимовна)) Помощь студентам 0 06.12.2010 22:39
пищалка, точнее ее прога my_sappho_story Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 16 05.12.2010 02:36
Какой метод точнее? Vredina90 Помощь студентам 2 21.10.2010 17:40
Как заменить sleep в потоке? чтобы получить задержку 5 мили Dasverd2010 Общие вопросы Delphi 13 07.09.2010 14:29
lnk, а точнее как узнать путь к exe. Zeraim Общие вопросы Delphi 4 25.07.2009 13:59