首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌入式系统轮询

嵌入式系统轮询
EN

Stack Overflow用户
提问于 2017-06-05 14:52:54
回答 2查看 1.5K关注 1票数 1

我有大约6个传感器(GPS,IMU等)我需要不断地收集数据。为了我的目的,我需要从每一个(在一个小范围内)读取一个完整的数据包。现在我正在使用中断,但这会导致来自某些传感器的数据比其他传感器多,正如前面提到的,我需要将数据匹配起来。

是否更好的做法是采用基于轮询的系统,在这个系统中,我可以按设定的顺序轮询每个传感器?这样,我就可以在每一个“周期”从每个传感器获得数据。

然而,我担心投票的速度,因为这个系统需要接近实时运行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-05 15:05:59

轮询与“主计时器中断”相结合可以成为您的朋友。假设您的“最慢”传感器可以每隔20‘s提供数据,而其他传感器的读取速度更快。这是每秒50次更新,。如果这足够接近实时(可能对IMU来说很接近),那么您可能会这样做:

  1. 设置一个20毫秒的计时器。
  2. 当计时器关闭时,在中断服务例程中设置一个标志: uint8_t timerFlag = 0;ISR(TIMER_ISR_whatever) { timerFlag = 1;// nothing,仅为以后的信号量.}
  3. 然后,在主循环中,当timerFlag说是时候时,执行以下操作: 而( 1) { if(timerFlag == 1){<您有此想法;) > timerflag = 0;}

通过这种方式,您可以读取每个设备,并保持他们的读数同步。这是在嵌入式空间中解决这个问题的一个典型方法。现在,如果你需要比20毫秒更快的数据,那么你可以缩短计时器等等。像这样的情况下,最大的问题是“你投票的速度有多快”和“你需要投票的速度有多快”。只有试验和了解您的各种设备的特点和时间可以告诉您这一点。但我提出的是一个通用的解决方案,当所有的时间表“合适”时。

编辑,一种不同的方法

一个更基于中断的例子:

代码语言:javascript
复制
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...
    }
}

在本例中,您的所有设备都可以由中断驱动,但是主循环处理仍然由最慢的中断的频率来控制和调整。每个设备的最新完整读取,无论速度或延迟,都可以使用。这个模式更接近你的想法吗?

票数 1
EN

Stack Overflow用户

发布于 2017-06-05 18:02:46

轮询是一个非常好的和容易实现的想法,万一你的传感器能够立即提供数据(与你想要的输出频率相比)。当数据源需要大量(甚至是变量)时间来提供读取或需要异步“初始化/收集”周期时,就会陷入梦魇。您必须对轮询周期进行排序,以适应“最慢”的数据源。

如果您知道每个源的平均“数据转换率”,可能会有什么解决方案,就是设置多个定时器(每个数据源),这些计时器在poll time - data conversion rate上触发并启动那些计时器ISRs的测量。然后有一个在poll timer + some safety margin上触发的最后一个计时器来收集所有的转换结果。

另一方面,只要您对浪费的CPU/传感器负载没有任何合理的处理,从“快速”数据源“获取太多测量”的明显问题就不会对我造成太大的困扰。

最后一个也是更简单的方法,如果您有一些周期浪费,是:简单地排序数据源从“最慢”到“最快”,并启动一个测量的顺序,然后等待相同的顺序和轮询结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44371706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档