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


8

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 viele undefinierte Verweise auf Funktionen erhalten habe, die in den Header-Dateien und in der Bibliothek angegeben sind, die alle Objektdateien enthielten (ü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 für jede AVR- und Taktrate neu kompilieren, oder gibt es einen Weg, dies zu umgehen?

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

Vielen Dank


EDIT: Beispiel (funktioniert nicht)

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

Antworten:


5

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

Bearbeiten

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

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

#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

Aufbau 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 in den Befehlszeilen angegebene Pfade einschließen. Das Befolgen der richtigen Namenskonventionen ist ebenfalls sehr wichtig. Versuchen Sie, dem obigen Muster zu folgen. Offensichtlich dienen die Befehle avr-objdump und avr-size nur zur Information und sind nicht erforderlich, wenn Sie nur erstellen.

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. kompilierte es mit 'avr-gcc test.c -c -o test.o' und erreichte es mit 'avr-ar rcs libtest.a test.o'. Ich habe dann versucht, es zu verwenden, wird 'avr-gcc temp.c -I. -L. -ltest -o temp '. Ich bekomme immer noch einen undefinierten Fehler! Mache ich etwas falsch?
Will03uk

@ Will03uk Versuchen Sie avr-gcc -o temp temp.c -I. libtest.a
Toby Jaffey

Wieder der gleiche Fehler (ich hatte jetzt auch einen falschen Headernamenfehler und daher tritt der undefinierte Fehler auf, bevor die Programmdatei vorverarbeitet wird, wenn dies hilft)
Will03uk

Sie tatsächlich umgesetzt test_functionin test.c, nicht wahr? Nicht nur erklärt?
Mike DeSimone

Ja, es ist so seltsam; Ich werde den Code in die Frage bearbeiten.
Will03uk
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.