LINUX.ORG.RU

[микроконтроллеры atmel][avr]avr-libc в debian и не только

 


0

1

Вот пишу тут быдлопрограммку для avr (atmega8). Там есть кусок кода, обращающийся к EEPROM (встроенной памяти).

if (eeprom_is_ready())
{
    return eeprom_read_word ((uint16_t*)i);  // (1)
}

При компиляции появидась ошибка в строке (1):

undefined reference to `__eerd_word_m8'

Я грепнул хидеры и узнал, что eeprom_read_word является макросом:

#define eeprom_read_word      _EEPROM_CONCAT2 (__eerd_word, _EEPROM_SUFFIX)

Т.е. для программирования для atmega8 должно быть __eerd_word_m8, для mega128 __eerd_word_m128 итд.

Грепнул эти функции и не нашел их не в одном хидере. Собрал avr-libc в DragonflyBSD - то же самое. Это что, нереализованная фича, или есть какой-то подводный камень?

Не уверен, что пишу в тот раздел, если что, извините) Помню тут был кто-то, занимающийся avr микроконтроллерами, надеюсь на их помощь

Ответ на: комментарий от frey

Ну я по всем файлам искал. Щас тогда ещё и исходники проверю. Вообще интересно, может есть какие-нибудь готовые библиотеки, а то самому писать функции для доступа к EEPROM влом.

different_thing
() автор топика

Скорей всего эти функции объявляются все скопом анологично через define.

#define DECLARE_RD_WORD(size) \
        int __eerd_word_#size(void * addr) \
        {                                  \
        ....................................
        }

DECLARE_RD_WORD(128)
DECLARE_RD_WORD(64)
............

Ищи его.

ttnl ★★★★★
()
Ответ на: комментарий от different_thing

приду домой посмотрю
на всяк проверил - у меня этот символ есть в /usr/lib/avr/lib/avr4/libc.a
сейчас работаю 324p - никаких проблем, все линкуется.
тулчейн из коробки убунты.

k0l0b0k ★★
()
Ответ на: комментарий от k0l0b0k

Это из DragonFly BSD, собирал из pkgsrc, в дебе - из пакетов. в обоих случаях - один хрен

different_thing
() автор топика

Ага, нашел ещё объявление eeprom_read_word как функции (невнимательно смотрел): между #ifdef #endif. Ну что ж, это легче)

Разберусь, отпишусь

different_thing
() автор топика
Ответ на: комментарий от different_thing

Пока ни черта не могу понять. Нужное объявление (в виде функции) стоит между #ifndef __ASSEMBLER__ #endif, ненужное (в виде макроса) - между #ifndef __DOXYGEN__ #endif Попытка вручную убрать __ASSEMBLER__ и поставить __DOXYGEN__ не приводит ни к чему хорошему (тоже undefined reference). Похоже, что собрано как-то не так.

different_thing
() автор топика
Ответ на: комментарий от different_thing

что говорит

avr-objdump -x /usr/lib/avr/lib/avr4/libc.a | grep eerd_word_m8

(путь свой подставь)

у меня линкуется так:
avr-g++ -Wall -fwhole-program -fno-inline -mint8 -Os -mmcu=atmega324p -DNDEBUG CMakeFiles/xxx/src/main.cpp.o -o xxx.elf

k0l0b0k ★★
()
Ответ на: комментарий от different_thing

конечно. работает на:

Using built-in specs.
Target: avr
Configured with: ../src/configure -v --enable-languages=c,c++ --prefix=/usr/lib --infodir=/usr/share/info --mandir=/usr/share/man --bindir=/usr/bin --libexecdir=/usr/lib --libdir=/usr/lib --enable-shared --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --disable-checking --disable-libssp --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=avr
Thread model: single
gcc version 4.3.5 (GCC)

avr-libc Version: 1:1.6.8-2
и
Using built-in specs.
Target: avr
Configured with: ../src/configure -v --enable-languages=c,c++ --prefix=/usr/lib --infodir=/usr/share/info --mandir=/usr/share/man --bindir=/usr/bin --libexecdir=/usr/lib --libdir=/usr/lib --enable-shared --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --disable-checking --disable-libssp --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=avr
Thread model: single
gcc version 4.3.4 (GCC)

avr-libc Version: 1:1.6.7-1ubuntu2

k0l0b0k ★★
()
Ответ на: комментарий от k0l0b0k

> avr-objdump -x /usr/lib/avr/lib/avr4/libc.a | grep eerd_word_m8

Дает некую строку, а именно:

00000000 g F .text.avr-libc 0000000a __eerd_word_m8

Я так понимаю, это хорошо? )

avr-g++ -Wall -fwhole-program -fno-inline -mint8 -Os -mmcu=atmega324p -DNDEBUG CMakeFiles/xxx/src/main.cpp.o -o xxx.elf

Урра. Так всё собирается. Что-то не пойму пока, в чем там с моим мейкфайлом разница, но оно работает, спасибо

different_thing
() автор топика
Ответ на: комментарий от different_thing

Кстати официальный пример от Atmel тоже не собирался

different_thing
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.