Embedded 据说,使用sleep()是一种糟糕的设计,但等待硬件解决又如何呢?

Embedded 据说,使用sleep()是一种糟糕的设计,但等待硬件解决又如何呢?,embedded,sleep,Embedded,Sleep,在我当前的嵌入式(实时)软件设计中,我以两种方式使用sleep(): 限制一个处理循环,但这是讨论过的,正如前面指出的,线程优先级很可能会很好地解决这个问题 等待硬件“解决”。假设我正在编写某个硬件的接口。与硬件的通信都很好,但我想改变它的模式,我知道这只需要少量的指令周期。我正在使用睡眠(1)短暂暂停以允许此操作。我可以设置一个循环,在收到有效响应之前一直ping它,但这可能更难读取(更多的代码),而且事实上,由于数据传输时间的原因,速度较慢。事实上,在我的情况下,我可能会做一个usleep(

在我当前的嵌入式(实时)软件设计中,我以两种方式使用
sleep()

  • 限制一个处理循环,但这是讨论过的,正如前面指出的,线程优先级很可能会很好地解决这个问题

  • 等待硬件“解决”。假设我正在编写某个硬件的接口。与硬件的通信都很好,但我想改变它的模式,我知道这只需要少量的指令周期。我正在使用
    睡眠(1)
    短暂暂停以允许此操作。我可以设置一个循环,在收到有效响应之前一直ping它,但这可能更难读取(更多的代码),而且事实上,由于数据传输时间的原因,速度较慢。事实上,在我的情况下,我可能会做一个
    usleep(100)
    或更少

  • 所以我的问题是,这是一个好的做法吗?如果没有,还有更好/更高效的替代方案吗?

    在Linux中,我使用它会暂停软件,直到收到信号为止

    例子 我的主线程需要一个数据,但是这个数据还没有准备好,所以主线程被挂起

    另一个线程读取数据,当它完成时,它触发一个信号

    现在,主线程继续运行,并准备好了数据


    如果使用sleep,数据可以准备好也可以不准备。回调

    最理想的解决方案是让硬件在特定操作完成时通过某种形式的回调/信号通知您

    在编写生产代码时,我几乎总是倾向于使用此解决方案。当然,前提是您使用的api公开了这些方法

    投票

    如果您无法接收此类事件,那么唯一的其他选项将是检查操作是否已完成。最简单的解决方案是不断检查(旋转锁)

    然而,如果您知道一次手术大概需要多长时间,您可以在这段时间内一直睡眠,醒来,检查手术状态,然后再次睡眠或继续

    如果你对时间安排有100%的把握,并且可以保证你的线程不会早起,那么你可以完全依靠睡眠

    糟糕的设计?


    我不一定认为使用睡眠来完成这项任务是糟糕的设计。有时候你别无选择。我想说的是,当你不能保证计时时,仅仅依靠睡眠是一种糟糕的设计,因为你不能100%确定你正在等待的操作实际上已经完成。

    你可以有一个混合解决方案,在该解决方案中,你可以在操作所需的预期时间内睡眠(如你所说,避免旋转锁定和数据传输),醒来,检查操作是否完成(以防这次操作需要更长时间)。如果操作仍然挂起并重复,请再次睡眠(可能时间更短)。我认为使用Sleep()总是错误的。但是,如果您知道这一点,并且您正在使用sleep(),那么这意味着它是正确的,您指的是什么操作系统或RTO?认为是"说",;需要引用。谁说的,在哪里,他们的理由是什么,它是否适用于你描述的例子?问题是语言不可知论。它也太宽了。唯一正确的答案是没有帮助的:“视情况而定”。如果没有一个具体的系统,这个问题就太宽泛了。Linux?RTOS?裸机MCU?事实上我喜欢这个主意。。。但是我没有得到这个特殊的模式改变命令的回复,所以我没有太多的等待。我唯一能做的就是发送一个不同的查询命令来检查它是否工作。+1,你所说的是迄今为止最有意义的(我所读到的)。我处于一个不幸的位置,这个“模式更改”命令没有响应,但正如您所说,所花费的时间相对来说是众所周知的(不到一毫秒)。另外,因为这是“设置/配置时间”,所以现在可以使用毫秒。