我有一个包含来自adc的数据的数组,对于这个数据,我需要在sd卡中每秒保存10个周期,以检测我使用零交叉函数的时间段然后我在每次超过零时添加一个变量(改变唱歌并写一个文件,我有两个问题,首先是设置定时器每秒发送10个数据周期。我的第二个问题是我只想发送这10个数据周期,休息一下并继续发送接下来的10个周期。 这个代码有效,我的问题是如何实现时序,如何在1秒内发送10个周期?
void zeroCrossing(float* data, float* zerCross, int nx)
{
int i;
int a = 0;
bool sign1, sign2;
memset(zerCross, 0, nx * sizeof(float)); //copies the 0 to the first characters of the string
//pointed to, by argument
for (i = 0; i < nx - 1; i++) {
float b[16]; /* loop over data */
b[i] = data[i];
sign1 = getSign(data[i]);
sign2 = getSign(data[i + 1]);
if (sign1 != sign2) { /* set zero crossing location */
zerCross[i + 1] = 1;
a++;
// break ;
// continue;
if (a == 10) { // 10
break;
}
}
}
//cout << a<<endl;
}
/* get sign of number */
bool getSign(float data)
{
if (data > 0) /* positif data */
return (1);
else /* negatif data */
return (0);
}
答案 0 :(得分:2)
一种可能性正在使用sleep_until:
auto timestamp = std::chrono::high_resolution_clock::now();
for(;;)
{
doTheStuff();
timestamp += std::chrono::milliseconds(100);
std::this_thread::sleep_until(timestamp);
}
虽然这可以通过sleep_for以类似的努力来实现,但上述方法稍微精确一些,因为它会考虑您所做的任何事情的计算时间。
对于小型任务,这种精确度可能无关紧要,因为睡眠精度本身可能会更差......