AVR Atmega328pの静的ライブラリを作成するにはどうすればよいですか?


8

CのArduinoによく似たライブラリを作成しようとしています。

私は過去に試しましたが、コードを失いましたが、すべてのオブジェクトファイルを含む(avr-objdumpによってチェックされた)ヘッダーファイルとライブラリで指定された関数への未定義の参照を大量に取得したことを覚えています。

ライブラリ(サンプルmakefile)をコンパイルする方法と、プログラムをライブラリにコンパイルする方法を知りたい。また、すべてのAVRおよびクロック速度用にライブラリを再コンパイルする必要がありますか、それとも回避策がありますか?

さらに情報が必要な場合は、質問してください。

ありがとう


編集:例(機能しない)

program.c

#include "test.h"

int main(void)
{
    test_function();
}

test.c

#include "test.h"

void test_function()
{
    int i;
    i++;
}

test.h

#ifndef __TEST_H_
#define __TEST_H_

void test_function(void);

#endif

回答:


5

AVR-Libcユーザーマニュアルは、ライブラリを構築する方法についての章全体を持っています。そこから始めることをお勧めします。EclipseなどのIDEを使用する場合、実行可能ファイルではなくライブラリとしてビルドする場合に適用できるプロジェクト設定があります。

編集する

あなたの例のために私がそれを設定したとき、Eclipseは何をします:

簡単にコンパイルできないように、test_functionを次のように変更しました。

#include "test.h"

void test_function()
{
    volatile int i = 0;
    i++;
}

ライブラリの構築:

avr-gcc -Wall -g2 -gstabs -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega328p -DF_CPU=16000000UL -MMD -MP -MF"test.d" -MT"test.d" -c -o"test.o" "../test.c"

avr-ar -r "libtest.a"  ./test.o 

avr-objdump -h -S libtest.a  >"libtest.lss"

avr-size --format=avr --mcu=atmega328p libtest.a

メインプログラムの作成

avr-gcc -I"C:\path\to\my\workspace\test" -Wall -g2 -gstabs -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega328p -DF_CPU=16000000UL -MMD -MP -MF"program.d" -MT"program.d" -c -o"program.o" "../program.c"

avr-gcc -Wl,-Map,MainProgram.map -L"C:\path\to\my\workspace\test\Release" -mmcu=atmega328p -o"MainProgram.elf"  ./program.o   -ltest

avr-objdump -h -S MainProgram.elf  >"MainProgram.lss"

avr-size --format=avr --mcu=atmega328p MainProgram.elf

...そしてエラーなしでビルドされます。私の推測では、コマンドラインで指定されたインクルードパスが必要です。適切な命名規則に従うことも非常に重要です。上記のパターンを試してください。明らかに、avr-objdumpコマンドとavr-sizeコマンドは詳細情報を提供するだけであり、ビルドするだけの場合は必要ありません。

特定のターゲットアーキテクチャとクロック速度に合わせてライブラリを再コンパイルする必要がある場合は、かなり確実です。


プロトタイプ「void test_function(void);」を含むヘッダーを作成しました 「avr-gcc test.c -c -o test.o」を使用してコンパイルし、「avr-ar rcs libtest.a test.o」を使用してアーカイブしました。それからそれを使おうとした 'avr-gcc temp.c -I。-L -ltest -o temp '。それでも未定義のエラーが発生します!私は何か間違ったことをしていますか?
Will03uk

@ Will03uk avr-gcc -o temp temp.c -Iを試してください。libtest.a
Toby Jaffey

同じエラーが再度発生します(ヘッダー名エラーが発生したため、プログラムファイルを前処理する前に未定義のエラーが発生します(問題が解決した場合))
Will03uk

あなたは実際にで実装しtest_functionましたtest.cよね?宣言しただけではありませんか?
Mike DeSimone

ええ、それはとても奇妙です。コードを質問に編集します。
Will03uk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.