Come posso creare una libreria statica per AVR Atmega328p?


8

Sto tentando di creare una libreria molto simile all'Arduino in C.

Ho provato in passato e anche se ho perso il codice, ricordo semplicemente di aver ricevuto un sacco di riferimenti indefiniti alle funzioni specificate nei file di intestazione e nella libreria che conteneva tutti i file degli oggetti (controllato da avr-objdump).

Voglio sapere come dovrei compilare la libreria (esempio makefile) e come il programma dovrebbe essere compilato su di essa. Inoltre, devo ricompilare la libreria per ogni AVR e velocità di clock o c'è un modo per aggirarlo?

Se hai bisogno di ulteriori informazioni, basta chiedere.

Grazie


EDIT: Esempio (non funzionante)

programma.e

#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

Risposte:


5

Il manuale dell'utente di AVR-Libc contiene un intero capitolo su come costruire una libreria . Suggerirei di iniziare da lì. Se usi un IDE come eclipse, ci saranno impostazioni di progetto applicabili se vuoi costruire come libreria anziché come eseguibile.

modificare

Ecco cosa fa eclipse quando lo configuro per il tuo esempio:

In modo che non potesse essere banalmente compilato, ho modificato la funzione test in:

#include "test.h"

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

Costruire la biblioteca:

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

Costruire il programma principale

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

... e si costruisce senza errori. Suppongo sia necessario includere i percorsi specificati nelle righe di comando. Anche seguire le convenzioni di denominazione appropriate è abbastanza importante, prova a seguire il modello sopra. Ovviamente i comandi avr-objdump e avr-size sono solo per ulteriori informazioni e non sono richiesti se stai solo costruendo.

Sono abbastanza sicuro che se dovrai ricompilare la tua libreria per specifiche architetture di destinazione e velocità di clock.


Ho creato un'intestazione contenente il prototipo 'void test_function (void);' compilato usando 'avr-gcc test.c -c -o test.o' e archiviato usando 'avr-ar rcs libtest.a test.o'. Ho quindi tentato di usarlo avr-gcc temp.c -I. -L. -ltest -o temp '. Ottengo ancora un errore indefinito! Sto facendo qualcosa di sbagliato?
Will03uk,

@ Will03uk Prova avr-gcc -o temp temp.c -I. libtest.a
Toby Jaffey,

Lo stesso errore di nuovo (ho anche avuto un errore del nome dell'intestazione errato ora e quindi l'errore indefinito si verifica prima che pre-
elabori

In realtà implementato test_functionin test.c, giusto? Non lo hai appena dichiarato?
Mike DeSimone,

Sì, è così strano; Modificherò il codice nella domanda.
Will03uk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.