linux怎么判断处于中断函数,如何在Linux中获得最准确的实时周期性中断?

我希望在10的幂的频率下被中断,因此启用/ dev / rtc的中断并不理想.我想在中断之间睡1毫秒或250微秒.

从/ dev / hpet启用定期中断非常有效,但它似乎在某些机器上不起作用.显然我不能在没有HPET的机器上使用它.但是我无法让它在一些可以作为时钟源使用的机器上工作.例如,在Core 2 Quad上,当设置为poll时,内核文档中包含的示例程序在HPET_IE_ON处失败.

使用Linux提供的itimer接口而不是直接与硬件设备驱动程序连接会更好.在某些系统上,itimer提供的定期中断随着时间的推移更加稳定.也就是说,由于hpet不能以我想要的频率中断,因此中断开始从挂起时间开始漂移.但我看到一些系统比使用itimer更长时间(10毫秒)睡眠.

这是一个使用itimer进行中断的测试程序.在某些系统上,它只打印出一个警告,它在目标时间内睡眠约100微秒左右.在其他情况下,它将打印出批次警告,它在目标时间内睡了10毫秒.用-lrt编译并运行sudo chrt -f 50 [name]

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define NS_PER_SECOND 1000000000LL

#define TIMESPEC_TO_NS( aTime ) ( ( NS_PER_SECOND * ( ( long long int ) aTime.tv_sec ) ) \

+ aTime.tv_nsec )

int main()

{

// Block alarm signal, will be waited on explicitly

sigset_t lAlarm;

sigemptyset( &lAlarm );

sigaddset( &lAlarm, SIGALRM );

sigprocmask( SIG_BLOCK, &lAlarm, NULL );

// Set up periodic interrupt timer

struct itimerval lTimer;

int lReceivedSignal = 0;

lTimer.it_value.tv_sec = 0;

lTimer.it_value.tv_usec = 250;

lTimer.it_interval = lTimer.it_value;

// Start timer

if ( setitimer( ITIMER_REAL, &lTimer, NULL ) != 0 )

{

error( EXIT_FAILURE, errno, "Could not start interval timer" );

}

struct timespec lLastTime;

struct timespec lCurrentTime;

clock_gettime( CLOCK_REALTIME, &lLastTime );

while ( 1 )

{

//Periodic wait

if ( sigwait( &lAlarm, &lReceivedSignal ) != 0 )

{

error( EXIT_FAILURE, errno, "Failed to wait for next clock tick" );

}

clock_gettime( CLOCK_REALTIME, &lCurrentTime );

long long int lDifference =

( TIMESPEC_TO_NS( lCurrentTime ) - TIMESPEC_TO_NS( lLastTime ) );

if ( lDifference > 300000 )

{

fprintf( stderr, "Waited too long: %lld\n", lDifference );

}

lLastTime = lCurrentTime;

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值