如何为AVR Atmega328p创建静态库?


8

我正在尝试创建一个类似于C语言中的Arduino的库。

我曾经尝试过,尽管我丢失了代码,但我记得只是简单地获取了对未定义引用的加载,这些未定义引用是在头文件和包含所有目标文件的库中指定的(由avr-objdump检查)。

我想知道我应该如何编译该库(示例makefile)以及如何将程序编译到该库。另外,我是否需要针对每种AVR和时钟速度重新编译该库,或者是否可以解决?

如果您需要更多信息,请询问。

谢谢


编辑:示例(不起作用)

程式

#include "test.h"

int main(void)
{
    test_function();
}

测试

#include "test.h"

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

测试

#ifndef __TEST_H_
#define __TEST_H_

void test_function(void);

#endif

Answers:


5

AVR-Libc用户手册整章介绍了如何构建库。我建议从那里开始。如果您使用像eclipse之类的IDE,那么如果您要构建为库而不是可执行文件,则将有适用的项目设置。

编辑

这是我为您的示例设置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 2012年

@ Will03uk尝试使用av​​r-gcc -o temp temp.c -I。libtest.a
Toby Jaffey 2012年

再次发生相同的错误(我现在也有错误的标题名称错误,因此,如果有帮助,在未预处理程序文件之前会发生未定义的错误)
Will03uk 2012年

您实际上是test_function在中实现的test.c,对吧?不只是宣布了吗?
Mike DeSimone 2012年

是的,它太奇怪了;我将代码编辑到问题中。
Will03uk 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.