gpt4 book ai didi

c++ - 如何设置一个 "precise"周期定时器来监视 Linux(C/C++) 中的东西?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:21 26 4
gpt4 key购买 nike

我正在玩弄监控的东西。为此,我喜欢定期监控引脚等。监控应用程序应在用户空间中运行并使用 C/C++ 编写。我正在寻找一个很好的实践来解决这个领域的问题。

关于使用定时器已经有一个很好的答案here .我的问题更笼统。计时器是最好的解决方案还是等待信号量超时?等等

我把一些伪代码作为讨论的基础:

// sample with 1kHz
#define fs 1000
// sample time
#define Ts 1.0/fs

// sample data structure
typedef struct sampleStruct {
struct timespec ts;
int sampleData[10];
} sampleType;

void monitorCallback(sampleType * pS) {

}

void sampleThread() {
sampleType s;
struct timespec workingtime;
for (;;) {
// get a timestamp
timespec_get(&(s.ts), TIME_UTC);
// sample data
monitorCallback(s);
// try to measure the time we spent for obtaining the sample
timespec_get(&workingtime, TIME_UTC);
// try to minimize the jitter by correcting the sleeping time
sleep(Ts - (workingtime - s.ts));
}
}

我正在寻找解决方案,定期对信号等进行采样,喜欢检测/测量两个样本之间的抖动并使用函数获取样本信号数据。

欢迎任何想法!

最佳答案

使用函数:setitimer() 这里是一个简单的例子:

struct itimerval tv;
tv.it_interval.tv_sec = 0;
tv.it_interval.tv_usec = 100000; // when timer expires, reset to 100ms
tv.it_value.tv_sec = 0;
tv.it_value.tv_usec = 100000; // 100 ms == 100000 us
setitimer(ITIMER_REAL, &tv, NULL);

并使用 struct sigaction 定期捕获计时器。

下面是一个简单的使用示例:struct sigaction:

struct sigaction psa;
psa.sa_handler = pSigHandler; // << use the name of your signal hander
sigaction(SIGTSTP, &psa, NULL);

这里是函数的简单实现:pSigHandler()

static void pSigHandler(int signo)
{
switch (signo)
{
case SIGTSTP:
printf("TSTP");
fflush(stdout);
break;
}
}

当然,要使上述所有工作正常,需要以下两个语句:

#include <stdio.h>
#include <signal.h>

上面的代码有问题,有一长串“不应该”在信号处理程序中使用的函数。 printf() 是有问题的函数之一。我的建议是让信号处理函数设置一个标志,让主函数监视该标志,当发现“设置”时,重置它并执行必要的事件。

关于c++ - 如何设置一个 "precise"周期定时器来监视 Linux(C/C++) 中的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48937458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com