¿Cómo creo una biblioteca estática para el AVR Atmega328p?

8

Estoy intentando crear una biblioteca como Arduino en C.

Lo he intentado en el pasado y, aunque perdí el código, recuerdo que simplemente recibí un montón de referencias indefinidas a funciones especificadas en los archivos de encabezado y en la biblioteca que contenían todos los archivos de objetos (verificados por avr-objdump) .

Quiero saber cómo debo compilar la biblioteca (por ejemplo, makefile) y cómo se debe compilar el programa. Además, ¿necesito volver a compilar la biblioteca para cada AVR y velocidad de reloj, o hay alguna forma de evitarlo?

Si necesita más información, solo pregunte.

Gracias

EDITAR: Ejemplo (no funciona)

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
    
pregunta Will03uk

1 respuesta

5

El manual del usuario de AVR-Libc tiene un capítulo completo sobre cómo construir una biblioteca . Yo sugeriría comenzar allí. Si usa un IDE como eclipse, habrá configuraciones de proyecto aplicables si desea compilar como una biblioteca en lugar de un ejecutable.

Editar

Esto es lo que hace eclipse cuando lo configuro para su ejemplo:

Para que no pueda compilarse de forma trivial, cambié su función de prueba a:

#include "test.h"

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

Construyendo 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

Construyendo el programa 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

... y se construye sin error. Mi conjetura es que necesita incluir rutas especificadas en las líneas de comando. Seguir las convenciones de nomenclatura adecuadas también es muy importante, intente y siga el patrón anterior. Obviamente, los comandos avr-objdump y avr-size son solo para obtener más información y no son necesarios si solo estás compilando.

Estoy bastante seguro de que si necesita recompilar su biblioteca para arquitecturas de destino específicas y velocidades de reloj también.

    
respondido por el vicatcu

Lea otras preguntas en las etiquetas