Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как использовать библиотечную функцию в WinAVR?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
AVRdeveloper
Здравствуйте, у меня возникла проблема с освоением WINAVR. При попытке использовать библиотечные функции из Procyon AVRlib Version 20061029 студия ругается. А именно, при использовании функции uartInit(); или еще какой то из того же пакета происходит ошибка:

" C:\WinAVR-20071221\Uart\default/../s_uart.c:7: undefined reference to `uartInit' ".

(gcc ver.20071221)
Листинг:
#include <avr/io.h>
#include <avr/interrupt.h>
#include "buffer.h"
#include "uart.h"

int main ()
{
uartInit();
return 0;
}

Хедеры, которые определены в сорцах, я так же скопировал в каталог с моим исходником.
Что я не так делаю? Кто-то ведь использовал эту библиотеку, подскажите, буду благодарен за простой пример вроде "Hello, world!" с использованием библиотечных функций. smile3046.gif
Сергей Борщ
Цитата(AVRdeveloper @ Apr 14 2008, 14:41) *
Хедеры, которые определены в сорцах, я так же скопировал в каталог с моим исходником.
Видимо в список компилируемых файлов надо добавить и какие-то .c-файлы библиотеки.
MrYuran
Цитата(Сергей Борщ @ Apr 14 2008, 14:59) *
Видимо в список компилируемых файлов надо добавить и какие-то .c-файлы библиотеки.

Если под библиотекой понимается набор исходников, то скорее всего их всех надо подключать к проекту
А если библиотечный файл, то указать на него линковщику
AVRdeveloper
Цитата(Сергей Борщ @ Apr 14 2008, 14:59) *
Видимо в список компилируемых файлов надо добавить и какие-то .c-файлы библиотеки.

Я так понял, опция меню Edit Configuration Options -> Include directories "сама собой" добавляет файлы *.с, если указать к ним путь? Скриншот: Нажмите для просмотра прикрепленного файла
Сергей Борщ
Цитата(AVRdeveloper @ Apr 14 2008, 15:24) *
Я так понял, опция меню Edit Configuration Options -> Include directories "сама собой" добавляет файлы *.с, если указать к ним путь?
Понятия не имею, как это делается в студии (пользуюсь Eclipse), но сильно сомневаюсь. Заголовочные (include files, header) файлы и файлы с исходным кодом (source) - очень разные файлы. На вашей картинке видно, что проект состоит всего из одного .c - файла (в левом окне ветка source files). Попробуйте понажимать там левую-правую кнопки мыши, наверняка появится меню добавления файла.
AVRdeveloper
Цитата(Сергей Борщ @ Apr 14 2008, 15:51) *
Понятия не имею, как это делается в студии (пользуюсь Eclipse), но сильно сомневаюсь. Заголовочные (include files, header) файлы и файлы с исходным кодом (source) - очень разные файлы. На вашей картинке видно, что проект состоит всего из одного .c - файла (в левом окне ветка source files). Попробуйте понажимать там левую-правую кнопки мыши, наверняка появится меню добавления файла.

Так... Как Вы и советовали, добавил используемые файлы:
buffer.c - к сорцам. buffer.h, uart.h - к хедерам. Скомпилировалось! smile.gif
Сейчас попробую в девайс залить.
Steel_monkey
Столкнулся с аналогичной проблемой в WinAVR200712.. Хочу использовать uartInit из набора библиотек AVRlib в своей программе. Кидаю uart.h и uart.c , а так же все остальные *.h файлы, которые вызывает uart.h и друг друга, ну и *c файлы к ним ( global.h, buffer.h, buffer.c, avrlibdefs.h, avrlibtypes.h) в директорию проекта, где находится main.c.
Вариант первый: подключаю только uart.h
Код
#include "uart.h"


В программе есть

Код
uartInit()


результат
main.c:108: undefined reference to `uartInit'
В секции "Linking: main.elf" , из чего я делаю вывод, что это косяк линкера.


Попытка два: подключаю все хидеры:

Код
#include "uart.h"
#include "global.h"
#include "buffer.h"
#include "avrlibdefs.h"
#include "avrlibtypes.h


Результат тот же.

Вариант 3.
Теперь подключаю еще и *.с файлы.


Код
#include "uart.h"
#include "uart.c"
#include "global.h"
#include "buffer.h"
#include "buffer.c"
#include "avrlibdefs.h"
#include "avrlibtypes.h


Теперь компилит. Но засовывает все содержимое *.с файлов в программу, результат 2 килобайта вместо 400 байт, и это если убрать uartInit ( то есть ничего из вложенных функций не вызывается).
Подскажите пожалуйста простым русским языком, что и куда надо дописать. Поискал тут на форуме, почитал документацию по ВинАВР. Что-то линкеру скормить надо (как?), но он (линкер) для меня это даже не темный лес, это соседняя галактика.
Сергей Борщ
Цитата(Steel_monkey @ Apr 27 2008, 00:15) *
результат
main.c:108: undefined reference to `uartInit'
В секции "Linking: main.elf" , из чего я делаю вывод, что это косяк линкера.
Нет, это косяк программиста, не прочитавшего (или не понявшего) учебника по С. Ключевые слова для поиске в учебнике - "раздельная компиляция", "заголовочные файлы (header files)", "объявление и определение функций". Причем сначала надо понять разницу между объявлением и определением функции, из этого вытекает все остальное.
Цитата(Steel_monkey @ Apr 27 2008, 00:15) *
Вариант 3.
Теперь подключаю еще и *.с файлы.

Что-то линкеру скормить надо (как?), но он (линкер) для меня это даже не темный лес, это соседняя галактика.
Методом тыка удалось попасть в правильный вариант. Лучше бы это время потратили на чтение учебника - приблизили галактику. Если в качестве оболочки используете студию, то на вкладке дополнительных опций компилятора дописываете -ffunction-sections, -fdata-sections. На вкладке дополнительных опций линкера впишите -Wl,--gc-sections. Что означают эти опции, вы найдете в описаниях на gcc, ld, avr-libc в папке документации WinAVR.
mdmitry
2 Сергей Борщ
Имеет ли большой смысл использование
Цитата
-ffunction-sections, --fdata-sections
? Насколько я понял из описания gcc, можно получить выравнивание в данных и функциях, что может привести к уменьшению объема кода данных и возможному увеличению скорости выполнения кода.
Сергей Борщ
Цитата(mdmitry @ Apr 28 2008, 13:19) *
Имеет ли большой смысл использование ?
Линкер умеет выкидывать из кода только входные секции целиком. Эти ключи заставляют компилятор класть каждую переменную и каждую функцию в отдельный сегмент. После этого линкер по --gc-sections выкидывает входные секции, к которым нет обращения. Без -ffunction-sections, -fdata-sections линкер не сможет выкинуть неиспользуемые функции, потому что они все будут во входной секции .text. При чем тут выравнивание, я, честно говоря, не понял.
Steel_monkey
Спасибо! Я использую чистый WinAVR с Programmer Notepad'ом.
Мне в Мэйк надо дописать в раздел опций Си компилятора
CFLAGS += -ffunction-sections
CFLAGS += -fdata-sections

В разделе опций линкера
LDFLAGS +=-gc-sections

Я прав?
(жуть, это китайский?)
aesok
Маленький совет: НИКОГДА не делайте #include для .с файлов, а добавляйте их в переменую SRC в Makefile.

Анатолий.
Сергей Борщ
Цитата(Steel_monkey @ Apr 28 2008, 23:53) *
Я прав?
С CFLAGS - абсолютно. С LDFLAGS - если у вас линковка делается вызовом $(LD), то прав. Если вызовом $(CC), то LDFLAGS += -Wl,--gc-sections. В качестве бонуса можете добавить еще -Wl,--relax -тоже может немного уменьшить код.

P.S. обратите внимание - опция --gc-sections начинается с двух минусов.

Цитата(aesok @ Apr 29 2008, 00:09) *
Маленький совет: НИКОГДА не делайте #include для .с файлов, а добавляйте их в переменую SRC в Makefile.
Оппа... Этого я не заметил. Двумя руками поддерживаю.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.