nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 16 Apr 2024 05:08



Reply to topic  [ 6 posts ] 
Программирование микросекундных задержек в Linux 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22517
Location: Silicon Valley
Reply with quote
Представим что мы работаем в Linux на PC и нам нужны задержки с точностью до единиц микросекунд (напомню, что микросекунда - это которых один миллион в одной секунде) - скажем для того чтобы выдерживать нужные промежутки времени для управления программатором пиков. Как это сделать если точность клоков и шедулеров в Linux всего 4 миллисекунды (напомню, что миллисекунда - это которых одна тысяча в одной секунде) или говоря на языке частот 250 Гц?...

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

Code:
#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);
}


us_delay(us) - задержка в микросекундах
ms_delay(ms) - задержка в миллисекундах

при сборке надо указать ключик -lrt

в коце работы программы можно напечатать ошибку в микросекундах - max_timer_error - она может быть достаточно большой (до нескольких миллисекунд) если системе во время работы задерживательных функций зачем-то понадобилось что-то поделать - при этом управление у нашей программы отбирается на некоторое непредсказуемое количество времени разумной длины (не в реал-тайм системе работаем однако) - но для работы программатора пиков и этого оказалось достаточно :lol:

_________________
:dj: https://mastodon.social/@Shaos


07 Apr 2007 13:49
Profile WWW
Banned

Joined: 12 Oct 2006 16:44
Posts: 608
Reply with quote
Post 
а не судьба использовать 64-битный счётчик тактов ядра CPU? ;)


08 Apr 2007 18:14
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22517
Location: Silicon Valley
Reply with quote
Post 
Romanich wrote:
а не судьба использовать 64-битный счётчик тактов ядра CPU? ;)


Ну во-первых такой счётчик есть только начиная с Pentium (я именно его и использовал в России когда делал точные таймеры в программе противоаварийной автоматики в промконтроллерах на основе MicroPC), а во-вторых такой подход не выглядит стандартным - это ведь должно по возможности работать везде где запускается Линукс ;)

_________________
:dj: https://mastodon.social/@Shaos


09 Apr 2007 03:56
Profile WWW
Banned

Joined: 12 Oct 2006 16:44
Posts: 608
Reply with quote
Post 
Shaos wrote:
Ну во-первых такой счётчик есть только начиная с Pentium

ИМХО старые машины нет смысла поддерживать! Давайте теперь для ATmega128 писать софт, работающий на AT90S2313 :) Где приемущества современных CPU тогда?

Shaos wrote:
во-вторых такой подход не выглядит стандартным - это ведь должно по возможности работать везде где запускается Линукс ;)

разве проблемно в линухе подобное сделать? или в 0-й уровень он не пустит? ;)


09 Apr 2007 23:02
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22517
Location: Silicon Valley
Reply with quote
Post 
Romanich wrote:
Shaos wrote:
во-вторых такой подход не выглядит стандартным - это ведь должно по возможности работать везде где запускается Линукс ;)

разве проблемно в линухе подобное сделать? или в 0-й уровень он не пустит? ;)


Линух не только на x86 работает ;)

_________________
:dj: https://mastodon.social/@Shaos


10 Apr 2007 05:13
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22517
Location: Silicon Valley
Reply with quote
Post 
Shaos wrote:
Romanich wrote:
а не судьба использовать 64-битный счётчик тактов ядра CPU? ;)


Ну во-первых такой счётчик есть только начиная с Pentium (я именно его и использовал в России когда делал точные таймеры в программе противоаварийной автоматики в промконтроллерах на основе MicroPC), а во-вторых такой подход не выглядит стандартным - это ведь должно по возможности работать везде где запускается Линукс ;)


Вспомнил ещё один аргумент против - чтобы правильно рассчитать время в таком методе надо точно знать частоту процессора - на той работе я использовал константу т.к. наши MicroPC использовали одну и ту же материнскую плату с впаянным намертво процом - в случае Линукс это уже не прокатит.

_________________
:dj: https://mastodon.social/@Shaos


10 Apr 2007 06:41
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 6 posts ] 

Who is online

Users browsing this forum: No registered users and 14 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.