Bagaimana cara membuat perpustakaan statis untuk AVR Atmega328p?

8

Saya mencoba membuat perpustakaan seperti Arduino di C.

Saya telah mencoba di masa lalu dan meskipun saya telah kehilangan kode, saya ingat hanya mendapatkan banyak referensi yang tidak terdefinisi ke fungsi yang ditentukan dalam file header dan di perpustakaan yang memang berisi semua file objek (diperiksa oleh avr-objdump).

Saya ingin tahu bagaimana saya harus mengkompilasi perpustakaan (contoh makefile) dan bagaimana program harus dikompilasi untuk itu. Juga, apakah saya perlu mengkompilasi ulang pustaka untuk setiap AVR dan kecepatan Clock, atau apakah ada jalan lain?

Jika Anda memerlukan informasi lebih lanjut, tanyakan saja.

Terima kasih


EDIT: Contoh (tidak berfungsi)

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
sumber

Jawaban:

5

Manual pengguna AVR-Libc memiliki seluruh bab tentang cara membangun perpustakaan . Saya akan menyarankan mulai dari sana. Jika Anda menggunakan IDE seperti gerhana, akan ada pengaturan proyek yang berlaku jika Anda ingin membangun sebagai pustaka alih-alih yang dapat dieksekusi.

Edit

Inilah yang dilakukan gerhana ketika saya menyiapkannya untuk contoh Anda:

Agar tidak dapat dikompilasi secara sepele, saya mengubah fungsi test_ Anda menjadi:

#include "test.h"

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

Membangun perpustakaan:

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

Membangun program utama

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

... dan itu dibangun tanpa kesalahan. Dugaan saya adalah Anda perlu menyertakan jalur yang ditentukan dalam baris perintah. Mengikuti konvensi penamaan yang tepat juga cukup penting, coba dan ikuti pola di atas. Jelas perintah avr-objdump dan ukuran avr hanya untuk informasi lebih lanjut dan tidak diperlukan jika Anda hanya membangun.

Saya cukup yakin bahwa jika Anda perlu mengkompilasi ulang perpustakaan Anda untuk arsitektur target spesifik dan kecepatan jam juga.

vicatcu
sumber
Saya telah membuat header yang berisi prototipe 'void test_function (void);' mengkompilasinya menggunakan 'avr-gcc test.c -c -o test.o' dan mengarsipkannya menggunakan 'avr-ar rcs libtest.a test.o'. Saya kemudian mencoba untuk menggunakannya akan 'avr-gcc temp.c -I. -L. -test -o temp '. Saya masih mendapatkan kesalahan yang tidak terdefinisi! Apakah saya melakukan sesuatu yang salah?
Will03uk
@ Will03uk Coba avr-gcc -o temp temp.c -Saya. libtest.a
Toby Jaffey
Kesalahan yang sama lagi (Saya juga memiliki kesalahan nama header yang salah sekarang dan kesalahan yang tidak terdefinisi terjadi sebelum pra-proses file program, jika itu membantu)
Will03uk
Anda benar-benar dilaksanakan test_functiondi test.c, kan? Bukan hanya menyatakannya?
Mike DeSimone
Ya, sangat aneh; Saya akan mengedit kode menjadi pertanyaan.
Will03uk