我正在尝试在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);
}
}
答案 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如何处理它,所以你有它。