Atmel Studio 中的 Arduino 产量
Posted
技术标签:
【中文标题】Atmel Studio 中的 Arduino 产量【英文标题】:Arduino yield in Atmel Studio 【发布时间】:2017-08-08 21:28:05 【问题描述】:我正在尝试在 Atmel Studio 7 中为 Arduino 编写代码。为了使其与 Arduino IDE 相似,我正在尝试调整其库。
但是我已经被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);
【问题讨论】:
我认为yield()
是scheduler
的一部分...将scheduler.h
从Arduino 库添加到您的项目中。
应不惜一切代价避免延误
如果您已经开始使用裸寄存器,那么使用愚蠢的 Arduino 东西有什么意义。继续这种方式,忘记arduino
另一句话——不要在你的代码中定义 F_CPU。在项目属性中执行此操作。它将帮助您避免愚蠢的错误,例如不同文件中的不同值。
谢谢,特别是 F_CPU 的提示,
【参考方案1】:
以下是它在 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")));
正如该文件中的 cmets 所解释的:
空的 yield() 钩子。 此函数旨在供库编写者用来构建支持协作线程的库或草图。它被定义为弱符号,可以重新定义以实现真正的协作调度器。
因此,如果您愿意,您可以在自己的代码中定义yield()
。否则空定义会阻止你遇到的未定义引用错误。
当然,最好编写正确的非阻塞代码,而不是使用这个yield()
解决方法,但是你问了 Arduino IDE 如何处理它,所以你有它。
【讨论】:
我也发现了,但说实话,我还是不明白?不知何故,这意味着它什么也不做,但 arduino 会等待一段时间。它是如何活过来的? Indelay()
: github.com/arduino/Arduino/blob/1.8.3/hardware/arduino/avr/… yield()
从 while()
循环中重复调用。这意味着您可以在代码中添加yield()
的定义,并且使用delay()
函数不会阻止内容。但大多数用户不会使用此功能,因此不会在他们的代码中定义yield()
。核心中的弱空yield()
定义是必要的,以便始终定义yield()
。如果用户定义了自己的yield()
,那么它将覆盖弱定义。【参考方案2】:
尽管正如评论者所建议的那样,通常可以避免延迟,但我们大多数对裸机 Atmel 芯片进行编程的人都是从闪烁的 LED 程序开始的。它是裸机嵌入式编程的“Hello World”。延迟是可以的。
如果您查看util/delay.h
,您会看到专门为您的芯片编写的功能。改用这些,不要在 Arduino 版本中链接。您会发现 _delay_ms()
和 _delay_us()
函数非常适合这种第一步类型的程序。
【讨论】:
啊,谢谢。我会尝试 delay_ms()。最后,我想控制一个 LED 面板,女巫不能这么快……然后必须及时改变颜色等。因此,必须实施一种计时。也许我可以以某种方式测量循环期间的时间段,然后触发更改灯光事件。在 pc 应用程序中,必须永远不要运行循环,而是使用事件。那么我可以假设在微处理器应用程序中我可以毫不费力地进行循环,还是我可以阻止传感器等?【参考方案3】:感谢您的帮助。所以我创建了一个类风格的解决方案:
#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
【讨论】:
以上是关于Atmel Studio 中的 Arduino 产量的主要内容,如果未能解决你的问题,请参考以下文章
将 Arduino 库添加到 Atmel Studio 7 AVR C++ 项目 - 缺少 Arduino.h
SparkFun 的 Arduino Pro Micro 和 Atmel Studio 缺少串行端口
Arduino Uno微控制器采用的是Atmel的ATmega328