20

Arduino Uno と Linux 環境があります。Arduino IDE は素晴らしいものですが、何か問題が発生した場合、あまり情報が得られません。また、非常に遅くなり、チップとの通信が停止することもあります。

別の方法として、AVR-GCC/g++ と AVRDude ツールチェーンを使用して Arduino Uno をコーディングします。ただし、単純なテキスト エディターとコマンド ライン ツールを使用してプログラミングしながら、 Arduino と同じ機能 ( SerialdigitalWriteなど) にアクセスしたいと考えています。

そこで、すべての関数が定義されたヘッダーファイル、つまり「Arduino.h」を見つけようとしました/usr/share/arduino/hardware/arduino/cores/arduino

これをコンパイルに使用しました(makefileを使用してこれを行います)

avr-gcc -mmcu=atmega328p -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=testarduino.o -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard -std=gnu99 -MMD -MP -MF .dep/testarduino.elf.d testarduino.o --output testarduino.elf -Wl,-Map=testarduino.map,--cref     -lm

このコードをコンパイルするには:

#include "Arduino.h"

int main(void)
{
    init();
    pinMode(13,OUTPUT);
    while(1){
    digitalWrite(13,HIGH);
    delay(1000);
    digitalWrite(13,LOW);
    delay(1000);
    }
    return 0;
}

しかし、コンパイルしようとすると、どの関数も識別されないようです(「xxxxxxxxx」への未定義の参照と言っています)。では、同じ関数を確実に使用できるようにするためにインクルードする必要がある正確なヘッダー ファイルは何ですか? それとも、私が見逃した何かがありますか?

4

3 に答える 3

21

の定義を取得する方法undefined reference

このメッセージは、リンカーが問題の関数の実際の定義(宣言だけでなく) をundefined reference to 'xxxxxxxxx'見つけられないことを意味します。

リンカが関数の定義を見つけられない場合、その定義は通常、lib ファイル (例: *.so または *.dll) またはソース ファイル (例: *.cpp または *.c) にあります。Arduino の場合、avr-gcc に Arduino *.cpp ファイルをコンパイルしてリンクするように指示する必要があります。Arduino コアのすべてのソース ファイルが必要です。

ARDCOREDIR = <my arduino folder>/hardware/arduino/cores/arduino

Sudar は、Arduino 関数定義を含むように構成された AVR 用の Makefile の使用を提唱して、良いアドバイスをしました。(私は私のものにリンクし、以下で説明します。)

私のメイクファイルでは、この操作を次のように処理しました。

# CPP_SOURCE_FILES is a previously-defined variable, holding my project's source files
CPP_SOURCE_FILES += $(filter-out $(ARDCOREDIR)/main.cpp, $(wildcard $(ARDCOREDIR)/*.cpp))

Arduino の main.cpp ファイルで が定義されているため、ファイル main.cpp を省略したことに注意main()してください。自分のプロジェクト ファイルで自分で定義したいと考えています。

必要なヘッダファイル

もちろん、avr-gcc に arduino ヘッダーのインクルード フラグも渡す必要があります。

-I$(ARDCOREDIR)

そして、実際のプロジェクト コードに Ardhuino.h ファイルを含める必要があります。

#include <Arduino.h>

Arduino.h ヘッダー ファイルには、Arduino ピンの定義を保持するピン配置ファイルを含む、他のすべての Arduino ヘッダー ファイルが含まれます。異なる Arduino には異なるピン配置ファイルが必要なので、使用しているタイプを特定し、avr-gcc に適切なピン配置ファイルを含むディレクトリを含めるように指示します。標準の Arduino (UNO) を使用している場合は、次を使用します。

-I$(ARDCOREDIR)/../../variants/standard

私のメイクファイル

ビルド プロセスは、上記のいくつかの命令を実装する必要があるだけでなく、Arduino (または AVR) にプログラムされる .hex ファイルを作成する方法を知る必要があります。したがって、メイクファイルを使用することをお勧めします。

プロジェクトごとにメイクファイルを再構築するのは好きではないので、マシンには 1 つのベース メイクファイルしかなく、各プロジェクトincludeには、ベース メイクファイルをインクルードするように呼び出す独自の非常に短いメイクファイルがあります。私のベースメイクファイルはこちらにあります。

私のマシン上の単一のプロジェクトの短い (ベースではない) Makefile の例:

# This is the name of the file that shall be created. (It is also the name of my primary source file, without the file extension.)
TARGET = temp

# create a variable that only pertains to this project
MY_OWN_LIBRARY_DIR = /usr/home/MJ/Arduino/libraries/mj_midi

# "EXTRAINCDIRS" is a variable used by the base makefile. The base makefile creates a -I compiler flag for every item in the "EXTRAINCDIRS" list.
EXTRAINCDIRS = $(MY_OWN_LIBRARY_DIR)

# specify *.c source files pertaining to my project
SRC =

# specify *.cpp source files pertaining to my project
PSRC = temp.cpp $(MY_OWN_LIBRARY_DIR)/midi-listener.cpp $(MY_OWN_LIBRARY_DIR)/midi-song.cpp

# specify additional (non-core) Arduino libraries to include
ARDLIBS = SoftwareSerial

# include my base makefile
include /d/dev/avr/Makefile.base

注: 私のベース makefile を使用する場合は、変数ARDDIR(ファイルの上部近くに表示されます) がマシンの Arduino ディレクトリを指すように設定していることを確認してください。

于 2013-05-03T18:26:07.817 に答える
5

私はArduino の makefileを使用しています。これにより、ユーザー ライブラリとシステム ライブラリの両方を使用できます。Arduino IDE を使用する必要はありませんが、Arduino IDE が提供するライブラリを同時に使用できます。

于 2012-11-08T10:47:07.320 に答える