Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1

Точный delay() , желательно только POSIX

17.12.2014, 23:40. Показов 1766. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сразу говорю: "Я знаю о вытесняющей многозадачности и то, что freebsd/linux не realtime OS!"

Нужны мелкие задержки, начиная от 10 микросекунд. Пока многопоточность не учитываем (в смысле реентерабельности функций).

Накорябал следующее:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include    <delaymks.h>
#include    <time.h>
 
 
static struct timespec tv,tv1;
static long long    kalibr;
static long long    t,t1;
 
/*value is 20microsecs (average inaccuracy %5)
  value is 10microsecs (average inaccuracy %10)*/
void    delaymks(long timeout)/*in microseconds*/
{
 
  
 clock_gettime(CLOCK_MONOTONIC,&tv);
 t=tv.tv_sec*1000000000l + timeout*1000l + tv.tv_nsec - kalibr;
 do{
    clock_gettime(CLOCK_MONOTONIC,&tv1);
    t1=tv1.tv_sec*1000000000l + tv1.tv_nsec;
   }while(t > t1);
}
 
void    kalibr_mks(void)
{
 clock_gettime(CLOCK_MONOTONIC,&tv);
 t=tv.tv_sec*1000000000l + tv.tv_nsec;
 clock_gettime(CLOCK_MONOTONIC,&tv1);
 kalibr = (tv1.tv_sec*1000000000l + tv1.tv_nsec - t);
 }

И тест к нему:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include    <time.h>
#include    <unistd.h>
#include    <stdio.h>
 
#include    <delaymks.h>
 
int main()
{struct timespec tv,tv1,tv3;
 int i;
 kalibr_mks(); 
 
 tv3.tv_sec=0;
 tv3.tv_nsec=10000;
 
 for(i=0;i<300;i++)
 {
 clock_gettime(CLOCK_BOOTTIME,&tv);
 delaymks(10);
  /*nanosleep(&tv3,NULL);*/
 clock_gettime(CLOCK_BOOTTIME,&tv1);
 printf("%lld.%09ld\n",(long long)tv1.tv_sec-tv.tv_sec,tv1.tv_nsec-tv.tv_nsec);
 
}
  
 return 0;
}

На стационарнике выдаёт примерно следующее (давно шаманил с опциями ядра в плане выбора clocksource - были траблы)
Кликните здесь для просмотра всего текста

0.000010215
0.000010233
0.000010270
0.000010180
0.000010273
0.000010264
0.000010198
0.000010158
0.000010264
0.000010147
0.000010264
0.000010264
[faust@localhost C]$ ./tst1
0.000010731
0.000010588
0.000010373
0.000010376
0.000010314
0.000010311
0.000010289
0.000010292
0.000010298
0.000010303
0.000010298
0.000010296
0.000010305
0.000010317
0.000010310
0.000010307

На ноуте погрешность при 10 микросекундах (штатное ядро archlinux) уже составляет 10-15%

Штатные средства вроде nanosleep() - зашкаливают, т.к. вообще не умеют точнее 200-300 микросекунд.

Если к-либо "штатные" средства задержаться/заснуть на время порядка 10мкс и точнее чем у меня?
Подскажите как ещё увеличить точность. Интересует именно порядок около 10-50 микросекунд.

З.Ы. Использоваться будет в юзерспейсе, nice() - в пределах разрешённого юзеру ситуации не меняет.

З.З.Ы. Рассматривал использование rdstc - не катит, т.к. не знаю как победить энергосберегающие режимы (проц на стационарнике с максималкой в 3480МГц в начале это проги работает на 800МГц, потому кол-во тактов не поможет)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.12.2014, 23:40
Ответы с готовыми решениями:

Как вывести значения только оценки 4 и 5 желательно через конструктор
Как вывести значения только оценки 4 и 5 желательно через конструктор.

Как узнать HWND созданного только что SendMessage окна? и желательно без FindWindow
заранее спасибо если чо, то FindWindow почему то не работает. Добавлено через 54 минуты Я задумался и решил что это как будто...

А подскажите где есть спрайты, но только мне желательно очень красивые и побольше, а то ничего не могу найти(
Даже выбор тематики не особо важен, важно лишь то что у них была красота 98уровня, и полнота. Вот мне понравились вот эти...

3
43 / 21 / 5
Регистрация: 27.08.2012
Сообщений: 51
18.12.2014, 11:09
попробуйте условие поменять на 20й строке
C
1
while(abs(t - t1) < d)
с параметром d поиграйтесь, половину микросекунды поставьте для начала
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
18.12.2014, 16:57  [ТС]
Цитата Сообщение от IgorGramotey Посмотреть сообщение
раметром d поиграйтесь, половину микросекунды поставьте для нач
Фишка в том, что основная ошибка образуется при вызове clock_gettime(); (просто в main`е закомментировать вызов delaymks()). И эта ошибка "пляшет" от машины к машине - вот в чём засада. Потому и появилась функция kalibr_mks(), с соответствующей переменной.
abs(t-t1)<_какое_то_число - я и пытался реализовать с помощью переменной kalibr. При этом сразу вычел из t1 - т.е. нет "лишних" вычеслений в цикле. А подбирать d методом тыка - не дело.

З.Ы. Если бы это делалось только для моей машины - отрубил бы нафиг энергосбережение проца (троттлинг частот) и использовал rdtsc
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
07.01.2015, 00:04  [ТС]
Немного отредактировал kalibr_mks():
C
1
kalibr = (tv1.tv_sec*1000000000l + tv1.tv_nsec - t)*2;
Иногда будет "ждать" меньше чем надо, зато общая погрешность снижается...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.01.2015, 00:04
Помогаю со студенческими работами здесь

Вывести кусочек строки до символов "||", желательно только методами строк
Здравствуйте. Имеется list, который заполнен string: list &lt;string&gt; books = { &quot;Зеленая миля||Стивен Кинг||Мягкий переплёт&quot;, ...

Posix
Подскажите,пожалуйста,как подключить posix к c++?или его нужно скачать и установить?

winapi и posix
Добрый день. Подскажите пожалуйста, существуют ли библиотеки для кроссплатворменной разработки на winapi и posix. Я имею ввиду такие,...

Posix поток
Вообщем сделал такую программу, используя поток, которая просто выводит сообщения, скомпилировал как надо: gcc Programm.c -lpthread . ...

Потоки Posix
Всем доброго времени суток . Хочу начать изучать потоки posix нашел книгу , там пример , написал его и не могу откомпилить его . ругается...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru