Atmel Studio的Arduino产量

时间:2017-08-08 21:28:06

标签: c++ arduino arduino-esp8266 atmelstudio

我正在尝试在Atmel Studio 7中为Arduino编写代码。为了使它与Arduino IDE类似,我正在尝试调整它的库。

但我已被delay()屏蔽,后者使用yield()。产量似乎没有在任何地方实施。所以我的编译器说“undefined reference to yield”

我不明白Arduino IDE是如何处理的?如何在Atmel Studio中使用yield()

这是我的尝试:

#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <util/delay.h>
#include <avr/io.h>

#include <Arduino.h>
#include <wiring.c>

int main(void) {
  DDRB = (1 << DDB5);
  while(1) {
    PORTB = (1 << DDB5);
    delay(1000);
    PORTB = (0 << DDB5);
    delay(1000);
  }
}

3 个答案:

答案 0 :(得分:1)

虽然评论者提出的延迟通常是要避免的,但我们大多数编程裸机Atmel芯片的人都是从闪烁的LED程序开始的。这是裸机嵌入式编程的“Hello World”。延迟就好了。

但是如果你看一下util/delay.h,你会看到特别为你的芯片写的功能。使用它们而不是Arduino版本中的链接。您将找到_delay_ms()_delay_us()函数,这些函数非常适合此第一步类型的程序。

答案 1 :(得分:0)

感谢您的帮助。所以我创建了一个类风格的解决方案:

#include "Blink.h"

#include <util/delay.h>
#include "Arduino.h"

#define boardLedOn PORTB  |= (1 << DDB5);
#define boardLedOff PORTB &= ~(1 << DDB5); // inverse bits

#define delay(ms) _delay_ms(ms);

Blink::Blink(){
};

void Blink::run(){

    boardLedOn;

    delay(1000);

    boardLedOff;

    delay(1000);

}

呼叫者:

#include <avr/io.h>
#include <Arduino.h>
#include <Blink.h>

int main(void)
{


    Blink blink;

    while(1)
    {       
        blink.run();        
    }
}

头文件:

#ifndef BLINK_H
#define BLINK_H

class Blink{

  public: 

    Blink();
    void run();

};

#endif

答案 2 :(得分:0)

以下是它在Arduino AVR Boards核心中的实现方式: https://github.com/arduino/Arduino/blob/1.8.3/hardware/arduino/avr/cores/arduino/hooks.c#L19-L31

void yield(void) __attribute__ ((weak, alias("__empty")));

正如该文件中的评论所述:

  

空yield()钩子。   此函数旨在供库编写者用于构建支持协作线程的库或草图。它被定义为弱符号,可以重新定义以实现真正的协作调度程序。

因此,如果您愿意,可以在自己的代码中定义yield()。否则,空定义将阻止您遇到的未定义引用错误。

当然最好编写正确的非阻塞代码,而不是使用这个yield()解决方法,但是你问Arduino IDE如何处理它,所以你有它。