Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: atmega88pa в AVRstudio 6
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
max_mart
Всем привет.
Народ, подскажите, пожалуйста, что за ошибка все время вылазит, когда подключаю внешнюю библиотеку? И как с ней бороться?


Error 7 multiple definition of `SPI_Write_Reg' G:\JETTER_project\radio_module\hope_rf\transmitter\transmitter\transmitter\Debug/.././RFM70_init.c 108 1 transmitter

Error 8 multiple definition of `SPI_Read_Reg' G:\JETTER_project\radio_module\hope_rf\transmitter\transmitter\transmitter\Debug/.././RFM70_init.c 125 1 transmitter

и так далее!!!
Просто кошмар каой-то!!! maniac.gif
_Артём_
А вы библиотеку как подключаете?
Код
#include "RFM70_init.c"

Не так случайно?
max_mart
да
_Артём_
Цитата(max_mart @ May 2 2012, 20:34) *
да

И что вы тогда хотите?
Всё верно говорит компилятор.
Нужно так:
Код
#include "RFM70_init.h"
max_mart
А почему так, интересно???!!! Ведь в 4 версии можно было так делать и в кодвизионе тоже!!!??? wacko.gif

Сделал. Все заработало. Спасибо Но все равно вопрос написанный выше актуален!!! Почуму????

И раз уж мы про авр студио 6, то подскажите пожалуйста как мне дать ему понять, что я исп. 8000000 МГ, Поскольку применяю задержки?

ВСЕ Решил проблему, как Вы и сказали!!! biggrin.gif

Но вопрос написанный выше все равно актуален!!!

И раз уж мы в АВР студио 6, то как мне задать частоту,например 8000000 Гц, компилятору для работу со своими задержками и поменять ,например метод компилирования(пл размеру, по скорости)?
_Артём_
Цитата(max_mart @ May 2 2012, 21:50) *
Ведь в 4 версии можно было так делать и в кодвизионе тоже!!!??? wacko.gif

И здесь тоже можно так делать.
Но не нужно и вредно.

Цитата(max_mart @ May 2 2012, 21:50) *
И раз уж мы про авр студио 6, то подскажите пожалуйста как мне дать ему понять, что я исп. 8000000 МГ, Поскольку применяю задержки?

Возможны варианты:
Используется makefile:
Код
CFLAGS    += -DFREQUENCY=8000000

Могу ошибаться, но как-то так.
Используется свойства проекта (меню Project\Properties).
Тогда выбрать Toolchain\AVR GNU C compiler\Symbols
добавить что-то вроде
Код
FREQUENCY=8000000

Использовать глобальную константу можно так:
Код
uint32_t freq=FREQUENCY;


Цитата(max_mart @ May 2 2012, 21:50) *
поменять ,например метод компилирования(пл размеру, по скорости)?

Тип оптимизации можно выбрать там же Toolchain\AVR GNU C compiler\Optimization


Цитата(max_mart @ May 2 2012, 21:50) *
А почему так, интересно???!!! Ведь в 4 версии можно было так делать и в кодвизионе тоже!!!??? wacko.gif

Попробую объяснить.
пусть есть файл file.c в нём определена функция Myfunc:
Код
void Myfunc(void)
{
// ....
}

#include "file.c" - это, по простому говоря, просто вставка текста.
К примеру, в проекте два файла src1.с и src2.c, оба содержат #include "file.c".
в итоге получается что функция Myfunc определена в двух файлах. Это есть ошибка: непонятно какую из них линковать. Как-то так.

Чтобы ошибки не было создаётся файл file.h:
Код
#ifndef FILE1_H_
#define FILE1_H_

void Myfunc(void);

#endif /* FILE1_H_*/


и в src1.с и src2.c добавляется #include "file.h".
Либо можно просто перед использованием Myfunc написать в src1.с и src2.c:
Код
void Myfunc(void);

max_mart
Спасибо большое!!! Теперь стало ясно!!!

Т.е мне просто достаточно добавить в symbols строку:
FREQUENCY=8000000?

И все будит работать как надо?

Да и в какой symbols: defined or undefined?
_Артём_
Цитата(max_mart @ May 2 2012, 23:52) *
Т.е мне просто достаточно добавить в symbols строку:
FREQUENCY=8000000?
И все будит работать как надо?

Должно работать.
Нужно только выбрать правильный symbols: mfv их два - GNU C и GNU C++.

Цитата(max_mart @ May 2 2012, 23:52) *
Да и в какой symbols: defined or undefined?

В defined, конечно, undefined - отменяет уже определённые.
Сергей Борщ
QUOTE (max_mart @ May 2 2012, 23:52) *
Т.е мне просто достаточно добавить в symbols строку:
FREQUENCY=8000000?

И все будит работать как надо?
будЕт, только не FREQUENCY, а F_CPU
hd44780
Цитата(max_mart @ May 2 2012, 20:34) *
да


Это неправильно. Не по стандарту Си.
Некоторые компиляторы это понимают, некоторые нет. Лучше так никогда не делайте.
max_mart
Всем спасибо большое. Учту на будущее по работе с инклудами.

По поводу частоты все правильно, надо делать так:

#define F_CPU 8000000UL- так было написано в библиотеки delay.h и надо определять частоту перед инклудом самой библиотеки.
Сергей Борщ
QUOTE (max_mart @ May 3 2012, 09:38) *
перед инклудом самой библиотеки.
В каждом файле, где вы хотите использовать задержку? А потом задумаете поменять кварц на более быстрый и будете искать по всем исходникам эту магическую строчку чтобы заменить? И обязательно в каком-нибудь файле забудете и начнете удивляться чудесам в уже работавшей программе? Специально для таких случаев этот символ определяется в одном месте - в оболочке или makefile и будет передан компилятором автоматически в каждый файл.
_Артём_
Цитата(hd44780 @ May 3 2012, 06:57) *
Это неправильно. Не по стандарту Си.
Некоторые компиляторы это понимают, некоторые нет. Лучше так никогда не делайте.

Не в стандарте дело - просто способ кривой.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.