Comment créer une bibliothèque statique pour l'AVR Atmega328p?

8

J'essaie de créer une bibliothèque un peu comme l'Arduino en C.

J'ai essayé dans le passé et bien que j'aie perdu le code, je me souviens avoir simplement reçu des charges de références non définies aux fonctions spécifiées dans les fichiers d'en-tête et dans la bibliothèque qui contenait tous les fichiers objets (vérifiée par avr-objdump).

Je veux savoir comment je dois compiler la bibliothèque (exemple makefile) et comment le programme doit être compilé pour elle. De plus, dois-je recompiler la bibliothèque pour chaque AVR et vitesse d'horloge, ou existe-t-il un moyen de contourner cela?

Si vous avez besoin de plus d'informations, il vous suffit de demander.

Merci


EDIT: Exemple (ne fonctionne pas)

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
Will03uk
la source

Réponses:

5

Le manuel d'utilisation de l'AVR-Libc contient un chapitre entier sur la façon de créer une bibliothèque . Je suggère de commencer par là. Si vous utilisez un IDE comme eclipse, des paramètres de projet seront applicables si vous souhaitez créer une bibliothèque au lieu d'un exécutable.

Éditer

Voici ce que fait éclipse lorsque je le configure pour votre exemple:

Pour qu'il ne puisse pas être compilé de manière triviale, j'ai changé votre test_function en:

#include "test.h"

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

Construire la bibliothèque:

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

Construire le programme principal

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

... et il se construit sans erreur. Je suppose que vous devez inclure les chemins spécifiés dans les lignes de commande. Il est également très important de suivre les conventions de dénomination appropriées, essayez de suivre le modèle ci-dessus. Évidemment, les commandes avr-objdump et avr-size sont juste pour plus d'informations et ne sont pas nécessaires si vous êtes en train de construire.

Je suis à peu près certain que si vous devez également recompiler votre bibliothèque pour des architectures cibles et des vitesses d'horloge spécifiques.

vicatcu
la source
J'ai créé un en-tête contenant le prototype 'void test_function (void);' compilé en utilisant 'avr-gcc test.c -c -o test.o' et archivé en utilisant 'avr-ar rcs libtest.a test.o'. J'ai ensuite essayé de l'utiliser pour 'avr-gcc temp.c -I. -L. -ltest -o temp '. J'ai toujours une erreur non définie! Est-ce que je fais quelque chose de mal?
Will03uk
@ Will03uk Essayez avr-gcc -o temp temp.c -I. libtest.a
Toby Jaffey
Même erreur à nouveau (j'ai également eu une erreur de nom d'en-tête incorrect maintenant et donc l'erreur non définie se produit avant de prétraiter le fichier programme, si cela aide)
Will03uk
Vous avez réellement implémenté test_functionen test.c, non? Pas seulement déclaré?
Mike DeSimone
Ouais, c'est tellement bizarre; Je vais modifier le code dans la question.
Will03uk