Вот решение полученное мной после нескольких часов мучительных блужданий и поисков

Code: Select all
#include <time.h>
long int max_timer_error = 0;
long int firstsec = 0;
unsigned long int myclock(void)
{
int r;
struct timespec ts;
ts.tv_sec = 0;
ts.tv_nsec = 0;
r = clock_gettime(CLOCK_REALTIME,&ts);
if(firstsec==0) firstsec = ts.tv_sec;
ts.tv_sec -= firstsec;
// printf("clock_gettime -> %i %is %ins\n",r,ts.tv_sec,ts.tv_nsec);
return ts.tv_sec*1000000 + ts.tv_nsec/1000;
}
void us_delay(int us)
{
struct timespec ts,tts;
unsigned long int time_us,stop_us;
if(us<=0) return;
time_us = myclock();
stop_us = time_us + us;
while(time_us < stop_us)
time_us = myclock();
time_us -= stop_us;
if(time_us > max_timer_error)
max_timer_error = time_us;
}
void ms_delay(int ms)
{
us_delay(ms*1000);
}
ms_delay(ms) - задержка в миллисекундах
при сборке надо указать ключик -lrt
в коце работы программы можно напечатать ошибку в микросекундах - max_timer_error - она может быть достаточно большой (до нескольких миллисекунд) если системе во время работы задерживательных функций зачем-то понадобилось что-то поделать - при этом управление у нашей программы отбирается на некоторое непредсказуемое количество времени разумной длины (не в реал-тайм системе работаем однако) - но для работы программатора пиков и этого оказалось достаточно
