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
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.
Will03uk
Toby Jaffey
Will03uk
Mike Desimone
test_function
in implementierttest.c
, oder? Nicht nur deklariert?Will03uk
Will03uk