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 会等待一段时间。它是如何活过来的? In delay(): 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

ATMEL AVR STUDIO 程序

Linux / Windows Arduino IDE 上的 avr-gcc Atmel AVR 微控制器

Atmel Studio Dummy_Handler