Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MSVC задать задержку МЕНЕЕ мс
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
k155la3
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)
_pv
Код
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.
k155la3
Цитата(_pv @ Nov 14 2017, 21:04) *
. . . .
только планировщик вмешиваться всё равно будет.
можно чуть улучшить, если задрать приоритет SetPriorityClass и отсадить в другое ядро SetProcessAffinityMask.


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

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.