嵌入式系统 - 轮询

新手

我有大约 6 个传感器(GPS、IMU 等),我需要不断从中收集数据。出于我的目的,我需要从每个(在一个小的时间范围内)读取一个完整的数据包。现在我正在使用中断,但这会导致来自某些传感器的数据比其他传感器多,并且如上所述,我需要匹配数据。

转移到基于轮询的系统是否会更好,在该系统中我可以按设定的顺序轮询每个传感器?这样我就可以在每个“周期”获得来自每个传感器的数据。

但是,我担心轮询的速度,因为该系统需要接近实时地运行。

汤姆伺服

轮询结合“主定时器中断”可能是您的朋友。假设您的“最慢”传感器可以以 20 毫秒的间隔提供数据,而其他传感器的读取速度更快。每秒 50 次更新如果这足够接近实时(对于 IMU 可能接近),也许您可​​以这样进行:

  1. 设置一个 20ms 的计时器。
  2. 当定时器关闭时,在中断服务程序中设置一个标志:

    volatile uint8_t timerFlag = 0;
    
    ISR(TIMER_ISR_whatever)
    {
        timerFlag = 1;  // nothing but a semaphore for later...
    }
    
  3. 然后,在你的主循环中,当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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章