C++ 闪烁的led使微处理器速度减慢

C++ 闪烁的led使微处理器速度减慢,c++,c,embedded,microprocessors,C++,C,Embedded,Microprocessors,我设计了一个系统,当电位计的电阻低于设定值时,LED闪烁led1=1;等待(0.2);led1=0等待(0.2),这就是发生的情况。我需要两个等待序列,否则用户看不到任何更改。我还连接了一个LCD,当用户按下按钮时,LCD会显示不同的内容。问题在于,LCD中的这种变化明显减慢到wait(0.2)语句(0.2秒延迟)。这种方式给系统一种滞后的感觉。你知道我能做什么吗 ISR 我最初考虑将闪烁的LED放入中断例程,但很快意识到,如果用户不更改电位计的值,并且它始终设置为0,系统将只停留在ISR中 轮

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

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

轮询
我的第二个想法是尝试轮询,使LED每100次进入此功能时闪烁一次。结果不是很好,现在经常会让系统变慢。如果它不放慢系统的速度,它就会走得太快

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


这里的关键是你需要考虑你在ISR中的逻辑,这样它就不会停留在那里。。。使用有条件的
if
子句或类似子句来对电位计读数作出反应。

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

您需要完成系统工程

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

其中一些可能是工具链+处理器的问题。如果如您所说的轮询导致延迟(相对于强制等待循环),那么这很可能是您正在做的任何事情的处理器时间,并且将出现在ISR中。也许我误解了。如果你的处理器+时钟+编译器+编程语言+编码风格等产生的东西不能在完成任务所需的时间内完成所有任务,那么添加更多的东西(ISR或轮询等)并不能让它更快。找出实际的问题并加以解决,不要再提出更多的问题

使用硬件定时器,您可能有一个。当您在主回路中行走时,检查pot是否过低,计时器是否超时,或者从上一次到当前时间的增量是否大于X,然后更改led状态并继续通过回路,不要停在那里等待。使用状态机,如果它使编程更容易(对于一些人来说,状态机更难)

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


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

几乎所有的SoC都至少有一个定时器可以给你中断。对于闪烁的LED使用一个这样的计时器,而在ISR中使用计时器只是切换LED的状态。“系统将只停留在ISR中。”为什么会发生这种情况?假设您有来自硬件定时器的重复ISR,ISR可能只是
if(电位计
感谢dwelch的参与,我刚刚完成这个模块两个月,这是我的第三个任务。我将在九月份完成,所以我还有很长的路要走。我接受了你所说的,并将实施ISR例程和硬件计时器。我以前为不同的PIC实现过这些。当我删除LED函数中的内置等待例程时,我没有任何延迟。我会在周一告诉你结果,谢谢你的意见。我理解你还需要定义优先级,是更重要的是led闪烁率足够准确,让人看不到任何变化,还是有更重要的事情,如果led闪烁率受到影响,这没关系…列出此代码中的任务,对其进行优先级排序,并尽你所能实现这一点。感谢Ed的输入,我读了你的答案,现在正在将这些知识应用到我的系统中