C语言 使用for循环作为延迟的替代方案?

edqdpe6u  于 2023-06-21  发布在  其他
关注(0)|答案(2)|浏览(167)

如果只问for循环函数是否用作定时器而不是延迟,也会在主循环中对其他代码行造成不必要的干扰。

void okLED() {
  for (long i = 0; i < 150000; i++) {
    digitalWrite(LED_BUILTIN, HIGH);
  }
  for (long j = 0; j < 150000; j++) {
    digitalWrite(LED_BUILTIN, LOW);
  }
}

void slowLED() {
  for (long i = 0; i < 25000; i++) {
    digitalWrite(LED_BUILTIN, HIGH);
  }
  for (long j = 0; j < 20000; j++) {
    digitalWrite(LED_BUILTIN, LOW);
  }
  for (long k = 0; k < 25000; k++) {
    digitalWrite(LED_BUILTIN, HIGH);
  }
  for (long l = 0; l < 110000; l++) {
    digitalWrite(LED_BUILTIN, LOW);
  }
}

就像这样
我想建立一个基于Arduino的尾灯系统,与来自RC控制的油门信号互连。

e1xvtsh3

e1xvtsh31#

在Arduino的人工世界之外,真正的嵌入式系统几乎从不使用busy-delays/busy-wait循环作为控制时序的手段。这样的忙等待是非常有问题的,因为它们使程序执行停滞,并且导致100%的CPU利用率和100%的电流消耗,没有好的理由。
在专业上下文中使用的替代方案涉及硬件定时器。专用定时器硬件外设或专用实时时钟硬件外设。这些可以通过轮询标志或中断来使用。
为了具体地控制LED,定时器外围设备的“输出比较”特征可以用于在定时器耗尽时自动地激活/去激活GPI0引脚。PWM特性也非常常见,特别是用于降低电流消耗或在RGB的情况下启用多种颜色。
在任一情况下,这些各种硬件特征中的任一个允许在主程序侧以并发方式控制LED。

c2e8gylq

c2e8gylq2#

无论你使用的是busy for循环还是busy-wait delay()函数,这两个函数都不好。
研究 Flink 无延迟:https://docs.arduino.cc/built-in-examples/digital/BlinkWithoutDelay
关于更高级的协同多任务处理技术,请看我的答案:How to do high-resolution, timestamp-based, non-blocking, single-threaded cooperative multi-tasking
对于读取RC PWM控制信号,这很复杂,但我在这里有一个旧的例子:https://github.com/ElectricRCAircraftGuy/PWM_Reader2_WORKS_PERFECTLY_Hayden_car_lights
Here's the core code。它以与油门设置成比例的速率 Flink LED。
YouTube video:

相关问题