реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как использовать библиотечную функцию в WinAVR?
AVRdeveloper
сообщение Apr 14 2008, 11:41
Сообщение #1





Группа: Новичок
Сообщений: 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!" с использованием библиотечных функций. smile3046.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 14 2008, 11:59
Сообщение #2


Гуру
******

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



Цитата(AVRdeveloper @ Apr 14 2008, 14:41) *
Хедеры, которые определены в сорцах, я так же скопировал в каталог с моим исходником.
Видимо в список компилируемых файлов надо добавить и какие-то .c-файлы библиотеки.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 14 2008, 12:11
Сообщение #3


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

Если под библиотекой понимается набор исходников, то скорее всего их всех надо подключать к проекту
А если библиотечный файл, то указать на него линковщику


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
AVRdeveloper
сообщение Apr 14 2008, 12:24
Сообщение #4





Группа: Новичок
Сообщений: 11
Регистрация: 8-02-08
Пользователь №: 34 857



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

Я так понял, опция меню Edit Configuration Options -> Include directories "сама собой" добавляет файлы *.с, если указать к ним путь? Скриншот:
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 14 2008, 12:51
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
AVRdeveloper
сообщение Apr 14 2008, 13:43
Сообщение #6





Группа: Новичок
Сообщений: 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 - к хедерам. Скомпилировалось! smile.gif
Сейчас попробую в девайс залить.
Go to the top of the page
 
+Quote Post
Steel_monkey
сообщение Apr 26 2008, 21:15
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 28 2008, 06:38
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Apr 28 2008, 10:19
Сообщение #9


Начинающий профессионал
*****

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



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


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 28 2008, 11:02
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Steel_monkey
сообщение Apr 28 2008, 20:53
Сообщение #11


Участник
*

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



Спасибо! Я использую чистый WinAVR с Programmer Notepad'ом.
Мне в Мэйк надо дописать в раздел опций Си компилятора
CFLAGS += -ffunction-sections
CFLAGS += -fdata-sections

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

Я прав?
(жуть, это китайский?)
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 28 2008, 21:09
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



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

Анатолий.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 28 2008, 21:20
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 22:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01462 секунд с 7
ELECTRONIX ©2004-2016