реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> MSVC задать задержку МЕНЕЕ мс, Кроме Sleep( x ) Win32API
k155la3
сообщение Nov 14 2017, 17:40
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



PC, Windows-XP, MSVS-2008
----
Есть простая задача реализовать на базе LPT интерфейс SPI методом ногодрыга.
Все в общем-то работает, но вопрос в организации временных задержек.
Код
while   // небольшая частота - сотни - тысячи Гц
{    _outp(0x378, 0x00);
    Sleep(1);
    _outp(0x378, 0xFF);    
    Sleep(1);
}


Код
while   // большая частота (период порядка единиц-десятков мкс)
{
    _outp(0x378, 0x00);
    _asm { nop };
    _asm { nop };
    _asm { nop };
    _outp(0x378, 0xFF);    
    _asm { nop };
    _asm { nop };
    _asm { nop };
}
(понятно, что в этот цикл периодически вмешивается планировщик OS)


(?) реализация задержек на _asm { nop } не по феншую.
Меня бы устроила скорость ногодрыга 2-20 кГц

Каким образом правильнЕЕ организовывать задержки ?
(Win32API)
Go to the top of the page
 
+Quote Post
_pv
сообщение Nov 14 2017, 18:04
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Код
double get_timer(){
  static LARGE_INTEGER f;
  if (f.QuadPart == 0)QueryPerformanceFrequency(&f);
  LARGE_INTEGER t;
  QueryPerformanceCounter(&t);
  return (double)t.QuadPart / (double)f.QuadPart;
}

void delay(double sec){
  sec += get_timer();
  while (get_timer() < sec);
}

только планировщик вмешиваться всё равно будет.
можно чуть улучшить, если задрать приоритет SetPriorityClass и отсадить в другое ядро SetProcessAffinityMask.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 14 2017, 18:32
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(_pv @ Nov 14 2017, 21:04) *
. . . .
только планировщик вмешиваться всё равно будет.
можно чуть улучшить, если задрать приоритет SetPriorityClass и отсадить в другое ядро SetProcessAffinityMask.


Все Ok, накрутил на 10 кГц. Мне вполне достаточно.
То что планировщик отрабатывает нестрашно.
Спасибо.

Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th August 2025 - 23:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01392 секунд с 7
ELECTRONIX ©2004-2016