我试图在Atmel Studio 7中为Arduino编写代码,为了保持它与Arduino IDE的相似,我尝试修改它的lib。
但是我已经被delay()阻止了,它使用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);
}
}发布于 2017-08-09 00:41:13
虽然,正如评论者所建议的那样,延迟通常是可以避免的,但我们中的大多数人都是从闪烁的LED程序开始设计裸金属Atmel芯片的。这是裸金属嵌入式编程的"Hello“。延迟一下就可以了。
如果您查看您的util/delay.h,您将看到特别为您的芯片编写的函数。使用这些而不是在Arduino版本中链接。您将找到一个_delay_ms()和_delay_us()函数,它们非常适合这种第一步类型的程序。
发布于 2017-08-10 20:15:43
下面是在Arduino AVR板核心: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()解决方案更好,但是您询问了Arduino IDE是如何处理它的,所以就有了它。
发布于 2017-08-10 18:25:14
谢谢你的帮助。因此,我创建了一个类样式的解决方案:
#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();
};
#endifhttps://stackoverflow.com/questions/45578320
复制相似问题