【问题标题】:flashing led slows down microprocessor [closed]闪烁的LED减慢微处理器的速度[关闭]
【发布时间】:2016-05-06 09:00:29
【问题描述】:

我设计了一个系统,当电位器的电阻低于设定值时,LED 会闪烁led1 = 1; wait(0.2); led1 = 0 wait(0.2),这就是发生的情况。我需要两个等待序列,否则用户看不到任何变化。我还连接了 LCD,当用户按下按钮时,LCD 会改变以显示不同的内容。问题是 LCD 的这种变化明显减慢到wait(0.2) 语句(0.2 秒延迟)。这种给系统一种滞后的感觉。有什么想法我能做些什么吗?

ISR 我最初考虑将闪烁的 LED 放入中断程序,但很快意识到,如果用户不更改电位器的值并且它始终设置为 0,则系统将停留在 ISR 中。

轮询 我的第二个想法是尝试轮询,让 LED 每 100 次进入此功能时闪烁一次。结果并不好,现在它会时不时地拖慢系统。当它没有减慢系统速度时,它会变得太快。

【问题讨论】:

  • 几乎所有的 SoC 都至少有一个可以给你中断的定时器。为闪烁的 LED 使用一个这样的计时器,在 ISR 中为计时器只切换 LED 的状态。
  • “系统只会停留在 ISR 中。” 为什么会发生这种情况?假设您从硬件计时器重复 ISR,ISR 可能只是 if(potentioMeter < limit) changeLedState();

标签: c++ c embedded microprocessors


【解决方案1】:

我建议硬件计时器和 ISR 是可行的方法。通过以您的方式延迟程序执行,您体验到任何其他处理的“滞后”,而不仅仅是 LCD。

这里的关键是您需要考虑您在 ISR 中放置的逻辑,以便它不会停留在那里......使用条件 if 子句或类似的子句对您的电位计读数做出反应。

【讨论】:

  • 感谢 Ed 您的意见,我阅读了您的回答,现在正在将这些知识应用到我的系统中
【解决方案2】:

您需要完成系统工程。

听起来您现在没有使用 ISR,这可以正常工作。您需要走自己的执行路径并了解最坏的情况。

其中一些可能是工具链+处理器的问题。如果如您所说的轮询导致延迟(与强制等待循环相比),那么这可能是您正在做的任何事情的处理器时间,并且将在 ISR 中出现。也许我误解了。如果您的处理器+时钟+编译器+programming_language+coding_style等产生的东西无法在完成任务所需的时间内完成所有任务,那么添加更多东西(ISR更多轮询等)不会让它更快。找到实际问题并加以解决,不要只是抛出更多问题。

使用硬件计时器,你可能有一个。当你走过你的主循环时,你检查 pot 是否低,如果计时器已经超时,或者从最后一次到当前时间的增量是否大于 X,然后改变 led 状态并继续循环,不要停在那里等待。如果状态机更容易编程,请使用状态机(对于某些人来说,状态机更难)。

如果您有任何其他像这样烧毁 cpu 的等待循环,也请使用计时器,不要在那里等待,而是回来检查。

如果 ISR 处理程序不检查所有条件(但非 isr 解决方案会)添加条件,如果罐值 0 是特殊情况,则有代码来检查特殊情况。或者如果用户设置了这种情况,则不要启用中断(或禁用它)。基本编程问题,“编程小事”来解决。

【讨论】:

  • 感谢 dwelch 提供的意见,我刚刚做这个模块 2 个月,这是我的第三个任务。我将在九月完成,所以我还有很长的路要走。我接受了你所说的并将实施 ISR 例程和硬件计时器。我之前已经为不同的 PIC 实现了这些。当我删除 LED 功能中的内置等待例程时,我没有任何延迟。我会在星期一告诉你结果,谢谢你的意见。我很感激
  • 您还需要定义优先级,是否更重要的是让 LED 闪烁率足够准确以使人类看不到任何变化,或者是否有更重要的事情,如果 LED 闪烁率受到影响没关系...列出这段代码的任务,优先考虑它们,并尽你所能来兑现它。
【解决方案3】:

我不确定你的意思。由于wait(0.2) 语句的存在,LCD 刷新非常缓慢。 LED 语句不需要放在 ISR 中。 LCD 刷新后,继续在主 while 循环中处理 LED (while(1))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 2015-12-04
    • 2011-04-12
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    相关资源
    最近更新 更多