如何同时运行两个循环?

时间:2016-11-18 00:56:23

标签: c arduino

我编写的代码使LED闪烁并将伺服器移动到几个不同的方向。这是基本结构:

  while(true){
    //led on
    //wait
    //led off
    //wait
  }
  while(true){
    //servo to 45
    //servo to 90
    //servo to 270
  }

我希望两者同时运行。上面的代码只打开LED,并且无限循环,因为它在循环中。伺服永远不会起作用。我在这里查看了其他问题,但我找不到任何相关内容。

如何让LED和伺服同时工作?

5 个答案:

答案 0 :(得分:0)

一般来说,你不能使用两个无限循环。这是因为它是一个序列程序,因此在第一个程序完成之前它不能运行第二个程序。因此,如果第一个循环是无限的,那么第二个循环将永远不会运行。

要做某种多线程',最简单的方法是使用定时器和中断。

在您的情况下,您想要运行两个不同的任务。闪烁LED和转向伺服系统。当你使用wait()/ sleep()/ delay()时,uC只是停止(除了处理interupts之类的其他东西等)。所以你可以设置定时器并在中断闪烁导致。或者更好的中断只是设置一些标志,并在你的主要只检查标志是否已更改。不只是处理眨眼。所以一般来说,你会有这样的主题:

volatile uint8_t nowBlink = 0

ISR(TIMER1_OVF_vect)
{
  // some timer handling and then:
  nowBlink = 1
}

loop(){
 if(nowBlink){
    toggleLed();
    nowBlink = 0;
 }
 setServo(123123);

}

将intterupt设置为1秒,将使用1 Hz的频率闪烁你的led,然后程序的其他部分将完成。

Here你有定时器解释,Here你有一些库。请阅读,你应该掌握arduino。

最好的问候,voodoo16。

答案 1 :(得分:0)

不要使用delay_ms(),wait()等函数。尝试中断。

使用这样的结构:

int flag = 0;
void func_delay_50ms () interrupt
{
    // set initial condition
    flag ++;
}

void main
{
    while (1)
    {
        if (flag == 4) // per 200ms
        {
            led = -led;
            flag = 0;
        }

        if (!(flag % 2)) // per 100ms
        {    
             servo ();
        }  
    }
}

注意:servo()不应该长时间阻塞。

没有真正的并行线程,你应该创造一种幻觉来实现它。

(:з」<)我的英语不好。请原谅我。

答案 2 :(得分:0)

闪烁LED并不需要MCU上的代码。您可以使用定时器和PWM信号。 https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM

答案 3 :(得分:0)

我为Arduino编写了一个操作系统,它支持多线程以便一次运行多个循环。请注意,伺服的范围为0-180。你不能转入270度。您可以在https://github.com/DrBubble/ArduinoOS找到源代码和进一步的文档。

在ArduinoOS下运行时,此示例代码应该完全符合您的要求。

#include "KernelInitializer.h"
#include "Servo.h"
#include "Led.h"

void setup()
{
    KernelInitializer::InitializeKernel(mainThread);
}

void mainThread()
{
    InitTask(secondThread);
    while (true)
    {
        Led led(2); // replace 2 with the pin of your led
        while (true)
        {
            led.TurnOn();
            sleep(1000);
            led.TurnOff();
            sleep(1000);
        }
    }
}

void secondThread()
{
    Servo servo(9); // replace 9 with the pin of your servo
    while (true)
    {
        servo.SetValue(45);
        sleep(1000);
        servo.SetValue(90);
        sleep(1000);
        servo.SetValue(180);
        sleep(1000);
    }
}

答案 4 :(得分:0)

您可以简单地使用goto语句

在两个循环中.....如果使用goto,甚至不需要循环,就像在汇编语言中一样。

c代码是:

#include<stdio.h>
int main()
{
    int count;
    loop1:for(;;)
    {
        printf("Loop 1\n");
        goto loop2;
    }
    loop2:for(;;)
    {
       printf("Loop 2\n");
       goto loop1;
    }
   return 0;
}