Làm cách nào để tạo thư viện tĩnh cho AVR Atmega328p?


8

Tôi đang cố gắng tạo một thư viện giống như Arduino trong C.

Tôi đã thử trong quá khứ và mặc dù tôi đã mất mã, tôi nhớ đơn giản là nhận được vô số tham chiếu không xác định đến các hàm được chỉ định trong tệp tiêu đề và trong thư viện chứa tất cả các tệp đối tượng (được kiểm tra bởi avr-objdump).

Tôi muốn biết làm thế nào tôi nên biên dịch thư viện (ví dụ makefile) và cách chương trình nên được biên dịch cho nó. Ngoài ra, tôi có cần phải biên dịch lại thư viện cho mỗi tốc độ AVR và Đồng hồ không, hay có cách nào khác không?

Nếu bạn cần thêm thông tin, chỉ cần hỏi.

Cảm ơn


EDIT: Ví dụ (không hoạt động)

chương trình.c

#include "test.h"

int main(void)
{
    test_function();
}

kiểm tra

#include "test.h"

void test_function()
{
    int i;
    i++;
}

kiểm tra

#ifndef __TEST_H_
#define __TEST_H_

void test_function(void);

#endif

Câu trả lời:


5

Hướng dẫn sử dụng AVR-Libc có cả một chương về cách xây dựng thư viện . Tôi sẽ đề nghị bắt đầu từ đó. Nếu bạn sử dụng IDE như nhật thực, sẽ có các cài đặt dự án có thể áp dụng nếu bạn muốn xây dựng như một thư viện thay vì thực thi.

Biên tập

Đây là những gì nhật thực làm khi tôi thiết lập nó cho ví dụ của bạn:

Để nó không thể được biên dịch một cách tầm thường, tôi đã thay đổi test_feft của bạn thành:

#include "test.h"

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

Xây dựng thư viện:

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

Xây dựng chương trình chính

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

... Và nó được xây dựng không có lỗi. Tôi đoán là bạn cần bao gồm các đường dẫn được chỉ định trong các dòng lệnh. Thực hiện theo các quy ước đặt tên thích hợp cũng khá quan trọng, hãy thử và làm theo mẫu ở trên. Rõ ràng các lệnh avr-objdump và avr-size chỉ để biết thêm thông tin và không bắt buộc nếu bạn chỉ đang xây dựng.

Tôi khá chắc chắn rằng nếu bạn sẽ cần biên dịch lại thư viện của mình cho các kiến ​​trúc đích cụ thể và tốc độ đồng hồ.


Tôi đã tạo một tiêu đề chứa nguyên mẫu 'void test_function (void);' đã biên dịch nó bằng cách sử dụng 'avr-gcc test.c -c -o test.o' và lưu trữ nó bằng cách sử dụng 'avr-ar rcs libtest.a test.o'. Sau đó tôi đã cố gắng sử dụng nó sẽ 'avr-gcc temp.c -I. -L. -tất cả -o temp '. Tôi vẫn nhận được lỗi không xác định! Tôi có làm điều gì sai?
Will03uk

@ Will03uk Hãy thử avr-gcc -o temp temp.c -I. libtest.a
Toby Jaffey

Hiện tại lại xảy ra lỗi tương tự (hiện tại tôi cũng có lỗi tên tiêu đề không chính xác và do đó lỗi không xác định xảy ra trước khi xử lý trước tệp chương trình, nếu điều đó có ích)
Will03uk

Bạn thực sự thực hiện test_functiontrong test.c, phải không? Không chỉ tuyên bố nó?
Mike DeSimone

Vâng, nó rất tồi tệ; Tôi sẽ chỉnh sửa mã thành câu hỏi.
Will03uk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.