我有大约 6 个传感器(GPS、IMU 等),我需要不断从中收集数据。出于我的目的,我需要从每个(在一个小的时间范围内)读取一个完整的数据包。现在我正在使用中断,但这会导致来自某些传感器的数据比其他传感器多,并且如上所述,我需要匹配数据。
转移到基于轮询的系统是否会更好,在该系统中我可以按设定的顺序轮询每个传感器?这样我就可以在每个“周期”获得来自每个传感器的数据。
但是,我担心轮询的速度,因为该系统需要接近实时地运行。
轮询结合“主定时器中断”可能是您的朋友。假设您的“最慢”传感器可以以 20 毫秒的间隔提供数据,而其他传感器的读取速度更快。即每秒 50 次更新。如果这足够接近实时(对于 IMU 可能接近),也许您可以这样进行:
当定时器关闭时,在中断服务程序中设置一个标志:
volatile uint8_t timerFlag = 0;
ISR(TIMER_ISR_whatever)
{
timerFlag = 1; // nothing but a semaphore for later...
}
然后,在你的主循环中,当timerFlag
说是时候了:
while(1)
{
if(timerFlag == 1)
{
<read first device>
<read second device>
<you get the idea ;) >
timerflag = 0;
}
}
通过这种方式,您可以读取每个设备并保持它们的读数同步。这是在嵌入式空间解决这个问题的典型方式。现在,如果您需要比 20 毫秒更快的数据,那么您可以缩短计时器等。在这种情况下,最大的问题是“您可以多快轮询”与“您需要多快轮询”。 ” 只有通过实验并了解各种设备的特性和时间才能告诉您这一点。但我提出的是当所有时间“合适”时的通用解决方案。
编辑,不同的方法
一个更基于中断的示例:
volatile uint8_t device1Read = 0;
volatile uint8_t device2Read = 0;
etc...
ISR(device 1)
{
<read device>
device1Read = 1;
}
ISR(device 2)
{
<read device>
device2Read = 1;
}
etc...
// main loop
while(1)
{
if(device1Read == 1 && device2Read == 1 && etc...)
{
//< do something with your "packet" of data>
device1Read = 0;
device2Read = 0;
etc...
}
}
在这个例子中,你的所有设备都可以是中断驱动的,但主循环处理仍然由最慢的中断的节奏来控制和控制。无论速度或延迟如何,都可以使用来自每个设备的最新完整读数。这种模式是否更接近你的想法?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句