Como crio uma biblioteca estática para o AVR Atmega328p?

8

Estou tentando criar uma biblioteca muito parecida com o Arduino em C.

Eu tentei no passado e, apesar de ter perdido o código, lembro-me de simplesmente receber um monte de referências indefinidas para funções especificadas nos arquivos de cabeçalho e na biblioteca que continham todos os arquivos de objetos (verificados por avr-objdump).

Quero saber como devo compilar a biblioteca (exemplo makefile) e como o programa deve ser compilado nela. Além disso, preciso recompilar a biblioteca para cada velocidade do AVR e do Clock, ou existe uma maneira de contornar isso?

Se precisar de mais informações, basta perguntar.

obrigado


EDIT: Exemplo (não está funcionando)

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
fonte

Respostas:

5

O manual do usuário do AVR-Libc possui um capítulo inteiro sobre como construir uma biblioteca . Eu sugeriria começar por aí. Se você usar um IDE como o eclipse, haverá configurações de projeto aplicáveis ​​se você deseja construir como uma biblioteca em vez de um executável.

Editar

Aqui está o que o eclipse faz quando eu o configuro para o seu exemplo:

Para que não pudesse ser facilmente compilado, alterei sua função test_ para:

#include "test.h"

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

Construindo a 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

Construindo o 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

... e cria sem erro. Meu palpite é que você precisa incluir os caminhos especificados nas linhas de comando. Seguir convenções de nomenclatura adequadas também é muito importante, tente seguir o padrão acima. Obviamente, os comandos avr-objdump e avr-size são apenas para obter mais informações e não são necessários se você estiver construindo.

Tenho certeza de que, se você precisar recompilar sua biblioteca para arquiteturas de destino específicas e velocidades de clock também.

vicatcu
fonte
Eu criei um cabeçalho contendo o protótipo 'void test_function (void);' compilou-o usando 'avr-gcc test.c -c -o test.o' e arquivou usando 'avr-ar rcs libtest.a test.o'. Eu tentei usá-lo 'avr-gcc temp.c -I. -EU. -ltest -o temp '. Ainda recebo erro indefinido! Estou fazendo algo errado?
Will03uk 28/02
@ Will03uk Tente avr-gcc -o temp temp.c -I. libtest.a
Toby Jaffey
Mesmo erro novamente (Eu também tive um erro de nome cabeçalho incorreto agora e assim o erro indefinido ocorre antes que pré-processa o arquivo de programa, se isso ajuda)
Will03uk
Você realmente implementado test_functionem test.c, certo? Não apenas declarou isso?
Mike DeSimone
Sim, é tão estranho; Vou editar o código na pergunta.
Will03uk 28/02