Wie erstelle ich eine statische Bibliothek für den AVR Atmega328p?

Ich versuche, eine Bibliothek ähnlich dem Arduino in C zu erstellen.

Ich habe es in der Vergangenheit versucht und obwohl ich den Code verloren habe, erinnere ich mich, dass ich einfach jede Menge undefinierter Verweise auf Funktionen erhalten habe, die in den Header-Dateien und in der Bibliothek angegeben sind, die alle Objektdateien enthielt (überprüft von avr-objdump).

Ich möchte wissen, wie ich die Bibliothek kompilieren soll (Beispiel Makefile) und wie das Programm dazu kompiliert werden soll. Muss ich die Bibliothek auch für jeden AVR und jede Taktfrequenz neu kompilieren, oder gibt es eine Möglichkeit, dies zu umgehen?

Wenn Sie weitere Informationen benötigen, fragen Sie einfach.

Vielen Dank


EDIT: Beispiel (funktioniert nicht)

Programm.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

Antworten (1)

Das AVR-Libc-Benutzerhandbuch enthält ein ganzes Kapitel zum Erstellen einer Bibliothek . Ich würde vorschlagen, dort anzufangen. Wenn Sie eine IDE wie Eclipse verwenden, gibt es Projekteinstellungen, die anwendbar sind, wenn Sie als Bibliothek statt als ausführbare Datei erstellen möchten.

Bearbeiten

Folgendes tut Eclipse, wenn ich es für Ihr Beispiel einrichte:

Damit es nicht trivial wegkompiliert werden konnte, habe ich Ihre test_function geändert in:

#include "test.h"

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

Aufbau der Bibliothek:

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

Erstellen des Hauptprogramms

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

... und es baut ohne Fehler. Ich vermute, Sie müssen Pfade einschließen, die in den Befehlszeilen angegeben sind. Das Befolgen der richtigen Namenskonventionen ist auch ziemlich wichtig, versuchen Sie, dem obigen Muster zu folgen. Offensichtlich sind die Befehle avr-objdump und avr-size nur für weitere Informationen und nicht erforderlich, wenn Sie nur bauen.

Ich bin mir ziemlich sicher, dass Sie Ihre Bibliothek auch für bestimmte Zielarchitekturen und Taktraten neu kompilieren müssen.

Ich habe einen Header erstellt, der den Prototyp „void test_function(void);“ enthält. kompiliert es mit 'avr-gcc test.c -c -o test.o' und archiviert es mit 'avr-ar rcs libtest.a test.o'. Ich habe dann versucht, es will 'avr-gcc temp.c -I. -L. -ltest -o temp'. Ich bekomme immer noch einen undefinierten Fehler! Mache ich etwas falsch?
@ Will03uk Versuchen Sie avr-gcc -o temp temp.c -I. libtest.a
Wieder der gleiche Fehler (ich hatte jetzt auch einen falschen Header-Namensfehler und so tritt der undefinierte Fehler auf, bevor die Programmdatei vorverarbeitet wird, falls das hilft)
Du hast tatsächlich test_functionin implementiert test.c, oder? Nicht nur deklariert?
Ja, es ist so seltsam; Ich werde den Code in die Frage bearbeiten.
Wenn man den unterschiedlichen AVR-Chip ignoriert, funktioniert Folgendes! avr-gcc -Wall -g2 -gstabs -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega128 -DF_CPU=2000000UL -c -o test.o test.c - Os avr-ar -r "libtest.a" test.o avr-gcc -Wall -g2 -gstabs -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega128 - DF_CPU=2000000UL -c -o temp.o temp.c avr-gcc -Wl,-Map,program.map -L. -mmcu=atmega128 -o program.elf temp.o -ltest