gpt4 book ai didi

c++ - RPI1 上的 clock_nanosleep 有时需要比应有的时间更长的时间

转载 作者:搜寻专家 更新时间:2023-10-31 00:50:20 26 4
gpt4 key购买 nike

我想用第一代 RPI 的 gpio 输出生成方波信号。

为此,我首先想使用 wiringPi .

代码语言是固定的,应该是C或C++。

根据 wiringPi 的闪烁示例文档,解决方案应该很简单:

#include <wiringPi.h>
int main (void)
{
wiringPiSetup () ;
pinMode (0, OUTPUT) ;
for (;;)
{
digitalWrite (0, LOW) ; delay (500) ;
digitalWrite (0, HIGH) ; delay (500) ;
}
return 0 ;
}

但我希望它们之间有大约 600 微秒的停顿。

因此我创建了另一个延迟方法:

void myDelay(long int usec) {
struct timespec ts, rem;

ts.tv_sec = 0;
ts.tv_nsec = usec * 1000;

while (clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, &rem)) {
ts = rem;
}
}

然后我将 2 delay(500) 切换为 myDelay(600)

这主要是可行的,但有时 myDelay 等待超过 600 微秒。

请看这张示波器图片: enter image description here

我怎样才能得到与 C/C++ 完全相同的正方形?

我还尝试了一个带有 pigpio 的 Python 脚本:

pi = pigpio.pi()
pi.wave_add_new()
pi.set_mode(1, pigpio.OUTPUT)
wf=[]
for i in range (0, 100):
wf.append(pigpio.pulse(0, 1<<1, 600))
wf.append(pigpio.pulse(1<<1, 0, 600))
wf.append(pigpio.pulse(0, 1<<1, 1000))
pi.wave_add_generic(wf)
wid = pi.wave_create()
pi.wave_send_once(wid)
while pi.wave_tx_busy():
pass
pi.wave_delete(wid)
pi.stop()

这条 python 给出了预期的结果(即:所有方 block 在范围上都相等)。

现在的问题是,我怎样才能使用纯 C/C++ 实现实现相同的结果(而不必弄乱 gpioWave* 函数)?

最佳答案

查看 clock_nanosleep 的描述(来自 http://man7.org/linux/man-pages/man2/clock_nanosleep.2.html,强调我的)

clock_nanosleep() suspends the execution of the calling thread until either at least the time specified by request has elapsed, or a signal is delivered that causes a signal handler to be called or that terminates the process.

也就是说,唯一的保证是您至少会睡 600 微秒 - 但对于您实际最终会睡多长时间没有任何上限。

我假设您正在 RaspberryPi 上运行默认的 Linux 发行版之一。除了您的应用程序之外,Linux 在后台运行很多东西,并且默认情况下不是所谓的实时操作系统。从这个意义上说,实时并不意味着性能(就其运行或处理数据的速度而言),而是关于保证等待的最大上限,例如上面的那个。

如果您想更接近您的需求,您可以尝试以下一种或两种方法:

  1. 使用实时调度程序。这会提高线程的优先级,基本上高于用户空间中运行的所有其他线程的优先级。这是一个相当快的尝试 - 看看 sched_setscheduler() ( http://man7.org/linux/man-pages/man2/sched_setscheduler.2.html )
  2. 由于您仍然有一些东西在内核空间中运行,您可能会通过切换调度程序获得更好的性能,但您仍然会遇到内核“问题”。这就是 PREEMPT-RT 补丁发挥作用的地方 - 并使内核更适合诸如此类的事情。这将需要您编译自己的内核,这肯定比仅更改调度程序要复杂一些,但并非完全不可能。一个快速的谷歌搜索为其他一直在做同样事情的人提供了大量的点击。

关于c++ - RPI1 上的 clock_nanosleep 有时需要比应有的时间更长的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57912294/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com