|
|
  |
Как использовать библиотечную функцию в WinAVR? |
|
|
|
Apr 14 2008, 11:41
|
Группа: Новичок
Сообщений: 11
Регистрация: 8-02-08
Пользователь №: 34 857

|
Здравствуйте, у меня возникла проблема с освоением 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!" с использованием библиотечных функций.
|
|
|
|
|
Apr 14 2008, 12:24
|
Группа: Новичок
Сообщений: 11
Регистрация: 8-02-08
Пользователь №: 34 857

|
Цитата(Сергей Борщ @ Apr 14 2008, 14:59)  Видимо в список компилируемых файлов надо добавить и какие-то .c-файлы библиотеки. Я так понял, опция меню Edit Configuration Options -> Include directories "сама собой" добавляет файлы *.с, если указать к ним путь? Скриншот:
|
|
|
|
|
Apr 14 2008, 12:51
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(AVRdeveloper @ Apr 14 2008, 15:24)  Я так понял, опция меню Edit Configuration Options -> Include directories "сама собой" добавляет файлы *.с, если указать к ним путь? Понятия не имею, как это делается в студии (пользуюсь Eclipse), но сильно сомневаюсь. Заголовочные (include files, header) файлы и файлы с исходным кодом (source) - очень разные файлы. На вашей картинке видно, что проект состоит всего из одного .c - файла (в левом окне ветка source files). Попробуйте понажимать там левую-правую кнопки мыши, наверняка появится меню добавления файла.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 14 2008, 13:43
|
Группа: Новичок
Сообщений: 11
Регистрация: 8-02-08
Пользователь №: 34 857

|
Цитата(Сергей Борщ @ Apr 14 2008, 15:51)  Понятия не имею, как это делается в студии (пользуюсь Eclipse), но сильно сомневаюсь. Заголовочные (include files, header) файлы и файлы с исходным кодом (source) - очень разные файлы. На вашей картинке видно, что проект состоит всего из одного .c - файла (в левом окне ветка source files). Попробуйте понажимать там левую-правую кнопки мыши, наверняка появится меню добавления файла. Так... Как Вы и советовали, добавил используемые файлы: buffer.c - к сорцам. buffer.h, uart.h - к хедерам. Скомпилировалось! Сейчас попробую в девайс залить.
|
|
|
|
|
Apr 26 2008, 21:15
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 12-05-07
Из: Северная Венеция
Пользователь №: 27 684

|
Столкнулся с аналогичной проблемой в 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 26 2008, 21:16
|
|
|
|
|
Apr 28 2008, 06:38
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(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.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 28 2008, 10:19
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
2 Сергей Борщ Имеет ли большой смысл использование Цитата -ffunction-sections, --fdata-sections ? Насколько я понял из описания gcc, можно получить выравнивание в данных и функциях, что может привести к уменьшению объема кода данных и возможному увеличению скорости выполнения кода.
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Apr 28 2008, 11:02
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(mdmitry @ Apr 28 2008, 13:19)  Имеет ли большой смысл использование ? Линкер умеет выкидывать из кода только входные секции целиком. Эти ключи заставляют компилятор класть каждую переменную и каждую функцию в отдельный сегмент. После этого линкер по --gc-sections выкидывает входные секции, к которым нет обращения. Без -ffunction-sections, -fdata-sections линкер не сможет выкинуть неиспользуемые функции, потому что они все будут во входной секции .text. При чем тут выравнивание, я, честно говоря, не понял.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 28 2008, 20:53
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 12-05-07
Из: Северная Венеция
Пользователь №: 27 684

|
Спасибо! Я использую чистый WinAVR с Programmer Notepad'ом. Мне в Мэйк надо дописать в раздел опций Си компилятора CFLAGS += -ffunction-sections CFLAGS += -fdata-sections
В разделе опций линкера LDFLAGS +=-gc-sections
Я прав? (жуть, это китайский?)
|
|
|
|
|
Apr 28 2008, 21:20
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(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. Оппа... Этого я не заметил. Двумя руками поддерживаю.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|