使用树莓派获取每秒千个样本的传感器数据

问题描述 投票:0回答:1

我有一个树莓派和一个 spi 传感器,其采集数据的速率可能在 2kS/s 到 20kS/s 之间变化。

我的目标是获取该数据并将其推送到将实时显示的 MQTT 服务器上,不接受任何数据丢失。

要知道数据已准备好,芯片有一个中断引脚。与我一起工作的一位朋友使用该引脚作为 Pi 的中断。

我预见到这里会出现一些问题:

中断执行的例程会将数据存储在循环缓冲区中,该缓冲区将由另一个线程使用,因此它们必须同步对其的访问。

如果有问题的线程在很短的时间内被操作系统抢占,它会锁定缓冲区,我可以:

  • 如果中断发生在该时间内并且无法被抢占,则死锁
  • 如果我禁用中断并且线程在那一刻被抢占,我可能会丢失数据。

问题是:

  • 我担心任务的 500us 周期要求会导致问题,对吗?

  • 在Python中可行吗?我可以告诉调度程序在关键部分没有任何东西可以被抢占吗?

  • 我应该迁移到实时操作系统并使用 C++ 吗?

预先感谢您花时间回答问题

multithreading raspberry-pi real-time
1个回答
0
投票

您可以将实时线程固定到隔离的 CPU,并禁用中断来访问引脚。警告 - 您需要用户空间 GPIO 和 SPI 驱动程序才能执行此操作,以避免实时线程中的任何系统调用。

有了足够大的循环缓冲区,您不需要在编写器和消费者之间进行任何同步。写入器仅更新写入指针,读取器更新读取指针,并且如果读取器获得过时的写入指针值也没有问题 - 它会赶上下一个周期。循环缓冲区的美妙之处就在于这种无锁操作。

© www.soinside.com 2019 - 2024. All rights reserved.