gpt4 book ai didi

c++ - 如何在具有 <500 MHz 时钟、<256 MiB RAM 并使用基于 Yoctominimal 的自定义 Linux 的单核机器上优化事件轮询线程

转载 作者:太空宇宙 更新时间:2023-11-04 04:33:49 25 4
gpt4 key购买 nike

目前,我已经为我的一个嵌入式板(Galileo Gen 2)制作了一个嵌入式 GUI 应用程序。该应用程序可以执行 I²C、SPI、GPIO、ADC、UART 和 PWM 的测试事件,包括它们的 PinMuxing。

对于 GPIO,我使用了基于 sysfs 的上升/下降沿中断检测技术。为此,在低级代码内部,我调用了 GPIO PIN 监视器线程,该线程具有基于 poll() 系统调用的逻辑(fd 状态监视器)。因此,基本上,如果 GPIO PIN 上发生任何中断,那么我就会用事件信息填充缓冲区,例如 RTC 标记、PIN 值等。

现在在另一个线程中,它将读取该缓冲区进行日志记录。

两个线程使用条件变量进行同步。

实现上述逻辑后,我的应用程序比前一个应用程序变得更慢。我认为由于我的硬件配置较低的平台,GUI 渲染速度很慢,因为上面的两个线程处于 while 循环中。在测试上述场景时,top 实用程序为我提供了 100% 的 CPU 利用率。

或者是否需要其他线程优化技术?

最佳答案

is there another thread optimization technique required?

如果不查看您的代码,我可能无法推荐太多。

有关 GUI 渲染的评论引起了我的注意。控制台图形 I/O 可能非常昂贵(我确信这就是为什么所有在线广告都充满图片和图形以及最少文本的原因)。

但是,我不确定文本 I/O 是否比图形/图片更好。更多需要学习。

<小时/>

如果“检查标志”不被阻止,这是轮询:

while (1)
if(flag) // Non-blocking
do_something();

此代码片段正在轮询可能会设置其他内容的标志(如果它获得 CPU 周期来执行此操作)。

当“if(flag)”阻塞线程时,您可能无法做得更好。

<小时/>

轮询,这不是:

while (1)
if(flag) // Non-blocking
do_something();
else
usleep(minValue); // When included, it can be remarkably effective

我不确定这是否适用于任何形式的 Linux,而且我不知道 Linux 的 minValue 想法是什么。请参阅下一步。

<小时/>

轮询,这不是(第 2 部分):嵌入式系统支持特殊的至少一个原因:

VxWorks提供delay():

while (1)
if(flag) // Non-blocking
do something();
else
delay(0);

通常,delay(10) 会交出处理器(就像好邻居那样)并请求在 10 毫秒后恢复到适当优先级线程队列的后面。

在这个“我不轮询”循环中,“delay(0)”强制调度程序将当前线程“移动”到当前线程优先级队列的后面。

请注意,如果同一个准备运行队列中没有其他线程,则该线程会立即再次位于前面,只需恢复即可,并且比正常的上下文切换费用要少得多。

<小时/>

带延迟(0) 的 while 循环对于嵌入式系统来说是多么轻量级(以 CPU 周期为单位),这真是太棒了……VxWorks 有几种这样的“技巧”。

值得注意的是,在我的 Linux 上,使用 usleep(minValue) 时 while 循环的负载非常轻(以 CPU 周期为单位)。尽管上下文切换相对昂贵,但它仍然是轴承的润滑脂。

在任何情况下,轮询循环的繁重几乎都是环境犯罪(就产生的热量而言)。

关于c++ - 如何在具有 <500 MHz 时钟、<256 MiB RAM 并使用基于 Yoctominimal 的自定义 Linux 的单核机器上优化事件轮询线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37521680/

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