Atmel StudioでのArduinoの利回り

私はAtmel Studio 7でArduino用のコードを作成しようとしています。それをArduino IDEと同様に保つために、私はそのlibsを修正しようとしています。

しかし、 yield()を使用する delay()によって既にブロックされています。収量はどこにも実装されていないようです。だから私のコンパイラは "yieldへの未定義の参照" を言っています。

Arduino IDEがそれをどのように処理するのか理解できませんか? Atmel Studioで yield()を使用するために何ができますか?

これが私の試みです:

#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include 
#include 

#include 
#include 

int main(void) {
  DDRB = (1 << DDB5);
  while(1) {
    PORTB = (1 << DDB5);
    delay(1000);
    PORTB = (0 << DDB5);
    delay(1000);
  }
}
0
遅延は必ず避けてください。
追加された 著者 PeterJ_01,
遅延は必ず避けてください。
追加された 著者 PeterJ_01,
そして裸のレジスタを使い始めたならば愚かなArduinoのものを使うことのポイントは何ですか。この方法を守り、arduinoを忘れてください
追加された 著者 PeterJ_01,
そして裸のレジスタを使い始めたならば愚かなArduinoのものを使うことのポイントは何ですか。この方法を守り、arduinoを忘れてください
追加された 著者 PeterJ_01,
別の発言 - あなたのコードではF_CPUを定義しないでください。プロジェクトのプロパティでこれを行います。異なるファイルの異なる値のようなばかげた間違いを避けるのに役立ちます。
追加された 著者 PeterJ_01,
別の発言 - あなたのコードではF_CPUを定義しないでください。プロジェクトのプロパティでこれを行います。異なるファイルの異なる値のようなばかげた間違いを避けるのに役立ちます。
追加された 著者 PeterJ_01,
yield() scheduler の一部だと思います... Arduinoのライブラリから scheduler.h をプロジェクトに追加します。
追加された 著者 DigitalNinja,
特にF_CPUのヒントをありがとうございます。
追加された 著者 Andreas,
特にF_CPUのヒントをありがとうございます。
追加された 著者 Andreas,

6 答え

コメント投稿者が示唆しているように、遅延は通常避けられるべきですが、ベアメタルAtmelチップをプログラムする私たちのほとんどは点滅するLEDプログラムから始めます。これはベアメタル組み込みプログラミングの「Hello World」です。これには遅れは問題ありません。

ただし、 util/delay.h を見ると、特にあなたのチップ用に書かれた関数が見えるでしょう。代わりにそれらを使用し、Arduinoのバージョンではリンクしないでください。このファーストステップタイプのプログラムに最適な _delay_ms() _delay_us()関数があります。

1
追加された
ああ、ありがとう。私はdelay_ms()を試します。結局、私はLEDパネルの魔女を制御したいのですが、それほど速くてはいけません。そのため、一種のタイミングを実装する必要があります。たぶん私はどういうわけかループの間の期間を測定してそして次に光変化イベントを引き起こすことができます。 PCアプリケーションでは、ループを実行せずにイベントを処理することが絶対に必要です。それで、マイクロプロセッサのアプリケーションで、手間をかけずにループを実行できると仮定することができますか、それとも、センサーなどをブロックすることができますか?
追加された 著者 Andreas,

コメント投稿者が示唆しているように、遅延は通常避けられるべきですが、ベアメタルAtmelチップをプログラムする私たちのほとんどは点滅するLEDプログラムから始めます。これはベアメタル組み込みプログラミングの「Hello World」です。これには遅れは問題ありません。

ただし、 util/delay.h を見ると、特にあなたのチップ用に書かれた関数が見えるでしょう。代わりにそれらを使用し、Arduinoのバージョンではリンクしないでください。このファーストステップタイプのプログラムに最適な _delay_ms() _delay_us()関数があります。

1
追加された
ああ、ありがとう。私はdelay_ms()を試します。結局、私はLEDパネルの魔女を制御したいのですが、それほど速くてはいけません。そのため、一種のタイミングを実装する必要があります。たぶん私はどういうわけかループの間の期間を測定してそして次に光変化イベントを引き起こすことができます。 PCアプリケーションでは、ループを実行せずにイベントを処理することが絶対に必要です。それで、マイクロプロセッサのアプリケーションで、手間をかけずにループを実行できると仮定することができますか、それとも、センサーなどをブロックすることができますか?
追加された 著者 Andreas,

Here's how it's implemented in the Arduino AVR Boards core: 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がそれをどのように処理するかを尋ねたので、それを持っています。

0
追加された
delay() github.com/arduino/Arduino/blob/1.8.3/hardware /arduino/avr /&shellip; yield()が繰り返し呼び出されます。 while()ループこれは、あなたのコードに yield()の定義を追加することができ、その内容が delay()関数の使用によってブロックされないことを意味します。しかし、ほとんどのユーザーはこの関数を使用することができないため、コードに yield()を定義しません。 yield()が常に定義されるようにするには、コア内の弱い空の yield()定義が必要です。ユーザーが自分自身で yield()を定義すると、弱い定義をオーバーライドします。
追加された 著者 per1234,
私もそれを見つけました、しかし正直に言うと、私はまだ理解しませんか?どういうわけか、それは何もしないことを意味します、さもなければarduinoは時間を待ちます。どうやって生きていくの?
追加された 著者 Andreas,

Here's how it's implemented in the Arduino AVR Boards core: 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がそれをどのように処理するかを尋ねたので、それを持っています。

0
追加された
delay() github.com/arduino/Arduino/blob/1.8.3/hardware /arduino/avr /&shellip; yield()が繰り返し呼び出されます。 while()ループこれは、あなたのコードに yield()の定義を追加することができ、その内容が delay()関数の使用によってブロックされないことを意味します。しかし、ほとんどのユーザーはこの関数を使用することができないため、コードに yield()を定義しません。 yield()が常に定義されるようにするには、コア内の弱い空の yield()定義が必要です。ユーザーが自分自身で yield()を定義すると、弱い定義をオーバーライドします。
追加された 著者 per1234,
私もそれを見つけました、しかし正直に言うと、私はまだ理解しませんか?どういうわけか、それは何もしないことを意味します、さもなければarduinoは時間を待ちます。どうやって生きていくの?
追加された 著者 Andreas,

お手伝いありがとうございます。そこで私はクラススタイルのソリューションを作りました:

#include "Blink.h"

#include 
#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 
#include 
#include 

int main(void)
{


    Blink blink;

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

ヘッダファイル:

#ifndef BLINK_H
#define BLINK_H

class Blink{

  public: 

    Blink();
    void run();

};

#endif
0
追加された

お手伝いありがとうございます。そこで私はクラススタイルのソリューションを作りました:

#include "Blink.h"

#include 
#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 
#include 
#include 

int main(void)
{


    Blink blink;

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

ヘッダファイル:

#ifndef BLINK_H
#define BLINK_H

class Blink{

  public: 

    Blink();
    void run();

};

#endif
0
追加された