Как создать статическую библиотеку для AVR Atmega328p?


8

Я пытаюсь создать библиотеку, очень похожую на Arduino в C.

Я пытался в прошлом, и хотя я потерял код, я помню, как просто получал множество неопределенных ссылок на функции, указанные в заголовочных файлах и в библиотеке, которая содержала все объектные файлы (проверено avr-objdump).

Я хочу знать, как мне скомпилировать библиотеку (пример makefile) и как программа должна быть скомпилирована в нее. Кроме того, мне нужно перекомпилировать библиотеку для каждого AVR и тактовой частоты, или есть ли способ обойти это?

Если вам нужна дополнительная информация, просто спросите.

Спасибо


РЕДАКТИРОВАТЬ: Пример (не работает)

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

Ответы:


5

В руководстве пользователя AVR-Libc есть целая глава о том, как создать библиотеку . Я бы предложил начать там. Если вы используете IDE, такую ​​как eclipse, будут настройки проекта, которые будут применимы, если вы хотите создать библиотеку вместо исполняемого файла.

редактировать

Вот что делает eclipse, когда я настраиваю его для вашего примера:

Чтобы его нельзя было легко скомпилировать, я изменил вашу функцию test_function на:

#include "test.h"

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

Сборка библиотеки:

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

Построение основной программы

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

... и он строит без ошибок. Я думаю, вам нужно включить пути, указанные в командной строке. Соблюдение правил именования также очень важно, попробуйте следовать приведенному выше шаблону. Очевидно, что команды avr-objdump и avr-size просто для дополнительной информации и не требуются, если вы только строите.

Я почти уверен, что если вам нужно будет перекомпилировать вашу библиотеку для конкретных целевых архитектур и тактовых частот.


Я создал заголовок, содержащий прототип 'void test_function (void);' скомпилировал его с помощью «avr-gcc test.c -c -o test.o» и заархивировал с помощью «avr-ar rcs libtest.a test.o». Затем я попытался использовать его 'avr-gcc temp.c -I. -L. -ltest -o temp '. Я все еще получаю неопределенную ошибку! Я делаю что-то неправильно?
Will03uk

@ Will03uk Попробуйте avr-gcc -o temp temp.c -I. libtest.a
Тоби Джаффи

Снова та же ошибка (у меня также была ошибка с неправильным именем заголовка, и поэтому неопределенная ошибка возникает перед предварительной обработкой файла программы, если это помогает)
Will03uk

Вы на самом деле реализуется test_functionв test.c, не так ли? Не просто объявил это?
Майк Де Симоне

Да, это так странно; Я отредактирую код в вопросе.
Will03uk
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.