Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.56/158: Рейтинг темы: голосов - 158, средняя оценка - 4.56
motot
0 / 0 / 0
Регистрация: 18.02.2011
Сообщений: 173
1

Atmel studio 6

16.04.2014, 21:37. Просмотров 28557. Ответов 33
Метки нет (Все метки)

Вопрос таков, есть некая библиотека, в lcd_lib.h прототипы, в lcd_lib.c сами функции, оба файла находятся в папке с проектом.
В исходнике пишу #include "lcd_lib.h" - фиг не компилится, пишет что undefined reference, т.е. сишник автоматом не прицепился,
если я вписать #include "lcd_lib.c", тогда все работает, но думается мне что это не есть правильное решение, ибо среда сама должна его найти и прицепить. Или все же студия не умеет так делать?
Код
#define F_CPU 8000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdyo.h>
#include "lcd_lib.h"
//#include "lcd_lib.c"
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2014, 21:37
Ответы с готовыми решениями:

Почему AVR Studio 4, а не Atmel Studio 6?
По какой причине большинство специалистов по AVR микроконтроллерам в основном используют AVR Studyo...

Atmel Studio
Подскажите где смотреть библиотеку Atmel Studio.

Atmel studio 6.1
Здравствуйте. столкнулся с проблемой запуска программы. вылетает сообщение:debugging tool is not...

Atmel Studio
помогите написать программу работы светофора на языке Assembler

Atmel Studio 6.0
Здравствуйте! Подскажите пожалуйста , не пойму почему при запуске программы компилятор выдает : ...

33
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
19.05.2014, 14:45 21
Цитата Сообщение от dymyurk1978
IAR. Начал с AVR-Studyo и AVR-Toolchain. Так как тогда только начал си изучать, заколебался воевать с компилером. Окончательно опечалился из-за костылей с Ftosh. Пересел на IAR. С тех пор не нарадуюсь. Нет костылей с Ftosh и EEPROM. Компактный код. Делал последний проект. Ради интереса поставил максимальную оптимизацию по коду. Заколебался 8 килобайт забивать (МК 32 мега, спокойно можно брать мегу 8535). Так и не забил. А в проекте и вывод на символьный дисплей, и сам цикл работы, работа с EEPROM. Вывод текста и преобразование чисел на самописных либах.
про костыли вы это зря, в AVR-GNU-toolchain работа с flash и eeprom сделана на стандартном Си через API на функциях, некорректно называть это костылями
В IAR это сделано насколько понимаю как надстройка над Си, т.е. это не соответствует стандартному Си, но безусловно удобно
Насчет примера с атмега32 совсем не показательно, показательным может быть только сравнение размера HEX одной и той же программы скомпилированной двумя разными компиляторами. Общепризнано, что IAR лучший оптимизатор, но речь не идет о разнице в разы, конкретно на вашей программе разница может быть 10%, а может и 2%. У меня вон последняя поделка на 2313, что ни делал все равно 30% flash не заполнено и что?) и это на AVR studyo.

А что с железной отладкой в IAR? Не пользовали? Она у них своя или же они все равно вызывают отладчик atmel atudyo?
0
Rout'
0 / 0 / 0
Регистрация: 10.03.2013
Сообщений: 13
19.05.2014, 14:53 22
Цитата Сообщение от oxytt
варианта два
если делать либу *.a то конфигурить можно уже только runtime, т.е. писать код с динамической инициализацией и делать функцию конфигурирования
если хочется конфигурировать sompytation time то не делайте либу, просто включайте нужные *.h и *.c в проект, а конфигурирование можно делать передавая нужные параметры через символы определенные в Project properties. Это полный аналог #define в коде программы, только он глобальный, будет определен сразу для всех исходников
Спасибо, попробовал размер массива в либе задавать через extern переменную, все работает но вырос объем кода. Наверное пока буду цеплять исходники к проектам и настраивать через Custom Options, тут тока одно не удобство - возможность случайного их изменения.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
19.05.2014, 15:01 23
Цитата Сообщение от oxytt
про костыли вы это зря, в AVR-GNU-toolchain работа с flash и eeprom сделана на стандартном Си через API на функциях, некорректно называть это костылями
В IAR это сделано насколько понимаю как надстройка над Си, т.е. это не соответствует стандартному Си, но безусловно удобно
Насчет примера с атмега32 совсем не показательно, показательным может быть только сравнение размера HEX одной и той же программы скомпилированной двумя разными компиляторами. Общепризнано, что IAR лучший оптимизатор, но речь не идет о разнице в разы, конкретно на вашей программе разница может быть 10%, а может и 2%. У меня вон последняя поделка на 2313, что ни делал все равно 30% flash не заполнено и что?) и это на AVR studyo.

А что с железной отладкой в IAR? Не пользовали? Она у них своя или же они все равно вызывают отладчик atmel atudyo?
Вы не поверите, начал работать с AVR c 2007-2008 года (не помню точно). И ни разу не пользовался железной отладкой. Только проверка кода, дизасм, симулятор студии, осциллограф, тестовые куски кода, светодиоды. Иногда ЖКИ. В последнем проекте много дискретных входов выходов, расширял сдвиговыми регистрами. Так для проверки входов и программы сделал тестовый кусок программы, чтобы на дисплей выводило номер входа.
Ессно, в моем случае нужно четко знать и понимать, что происходит в МК, схеме и в программе.
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
19.05.2014, 16:16 24
Цитата Сообщение от dymyurk1978
в моем случае нужно четко знать и понимать, что происходит в МК, схеме и в программе.
это не только в вашем случае))) это у всех так, правда не все об этом знают

конечно можно и без железной отладки
но только попробовав ее можно узнать разницу, разница громадная, особенно JTAG где отладка очень комфортна и стабильна
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
19.05.2014, 17:13 25
Не знаю как в студии, в IAR в опциях проекта add files. Присоединяешь к проекту сишные файлы. И в студии так должно быть. Где окно проекта, правой кнопой мыши, опции проекта, там должно быть добавление файлов. Единственный случай в моей практике, объявление typedef. Нужно было в сишном файле писать инклюд файла, в котором был объявлен typedef.
А пагубную привычку все писать и объявлять в сишных файлах, потом их прислюнявливать, нужно искоренять. Этим многие студийцы страдают.
0
yshtorom
0 / 0 / 0
Регистрация: 31.08.2014
Сообщений: 1
04.09.2014, 08:21 26
У меня в 6ой студии все хорошо работает...
0
Otmorid
0 / 0 / 0
Регистрация: 27.02.2015
Сообщений: 2
02.03.2015, 17:53 27
Спасибо за информацию, у меня похожая проблема, не решается даже подключением к проекту файлов.
Может подскажете в чем может быть проблема, весь форум перерыл, все перепробовал, не помогает.

Если вкратце ситуация следующая:
Использую AtmelStudyo 6.2.
Из проекта убрал практически весь код, чтобы упростить так, чтобы исключить ошибок в других местах.
Коротко проект:

mane.cpp
Код
#include "lcd_lib/lcd.h"
//...
int main(void)
{
//...
lcd_init();
lcd_puts("ok!");
//...
while(1)
{
;
}
}
lcd_lib/lcd.h
Код
#ifndef LCD_H
#define LCD_H

void lcd_init( void );
void lcd_puts( const char *str);
//...
#endif //LCD_H
lcd_lib/lcd.с
Код
#include "lcd.h"

void lcd_init( void )
{
;
}

void lcd_putc(unsykned char c)
{
;
}
В общем все, как надо. К проекту в Solution Explorer подключил .c и .h файлы (lcd_lib/lcd.h, lcd_lib/lcd.с) отдельно откомпилировал специально, убедился в присутствии файлов .o, начинаю Build-ить проект: "undefined reference to" к любой из функций из lcd_lib/lcd.h. В Make файле моя библиотека содержится.

Теперь главное, создаю один в один такой же проект в AVRStudyo 4 - все нормально Build-ится!.
В 6 студии так же если вместо lcd_lib/lcd.h поставить lcd_lib/lcd.с - билдится, но тут понятно.

В общем уже в отчаянии. Получается выход только сменить 6-ку на что-то другое?..(
0
oomomstir
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,864
02.03.2015, 18:02 28
Otmorid, я нечаянно ответил в другом треде:

Ещё могут быть грабли с name mangling между C и C++. Попробуйте или всё сделать C++, или поправить хедер (lcd.h) так: http://stackoverflow.com/questions/3789 ... splus-work - вписать в начало файла
Код
#ifdef __cplusplus
extern "C" {
#endif
и в конец файла
Код
#ifdef __cplusplus
}
#endif
(идея в том, что без этого при компиляции mane.cpp компилятор заменит имя lcd_init на адскую хрень, содержащую информацию о типах аргументов)
0
TioMoom
0 / 0 / 0
Регистрация: 19.01.2014
Сообщений: 44
03.03.2015, 08:50 29
Цитата Сообщение от Otmorid
(
Может я чего-то не догоняю, а прототип lcd_putc есть?
Плюс, вы делаете вызов из другого файла (mane.c)

На мой взгляд должно было быть примерно так:

lcd.h
Код
extern void lcd_init(void);
extern void lcd_puts(unsykned char *str);
void lcd_putc(unsykned char c);
lcd.c
Код
void lcd_init(void) {};
void lcd_puts(unsykned char *str){};
void lcd_putc(unsykned char c) {};
ну и в mane остается все как есть.
0
HotD
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
03.03.2015, 09:27 30
В .h файлах прототипы функций должны быть с extern. В 4.19 прокатывает и без них, но на автомате пишу везде extern.
0
oomomstir
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,864
03.03.2015, 09:44 31
Я бы даже сказал, с extern "C", раз автор смешивает C и C++.
0
Otmorid
0 / 0 / 0
Регистрация: 27.02.2015
Сообщений: 2
03.03.2015, 13:36 32
Огромное спасибо за помощь, радует прям оперативность. Проблема решена.

Попробовал все предыдущие советы.
Помог совет товарища oomomstir, действительно видимо были косяки с именами функций.
Добавление в файл .h в начало
Код
#ifdef __cplusplus
extern "C" {
#endif
и в конец
Код
#ifdef __cplusplus
}
#endif
решило проблему.

Установка "extern" перед прототипами функций в .h ни к чему не привело. extern "С" вообще отказалось понимать.

Кстати еще навело на мысль, попробовал файл lcd_lib/lcd.c переименовать в lcd_lib/lcd.cpp. Подключил к проекту, все нормально скомпилировалось и завелось. Ну и теперь понятно почему)

Еще раз спасибо за помощь, не знал про extern, почитаю документацию.
0
oomomstir
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,864
03.03.2015, 14:04 33
Ключевое слово в документации - name mangling.

Ну а если вкратце - то, поскольку C++ позволяет перегрузку функций (можно описать void f(int x) и void f(int x, int y) - и в зависимости от количества аргументов будет использована нужная), нельзя в объектном файле функцию обозначать просто именем - нужна сигнатура (имя функции и список типов её аргументов). Да ещё всякие классы и неймспейсы - в которых тоже могут быть функции с одинаковыми именами.
Поэтому при компиляции функции f будут переименованы во что-то типа _Z1fi и _Z1fii или ещё во что (зависит от компилятора, стандартом не регламентируется), и вроде единственный способ этого избежать - написать extern "C" (тогда функция обязана быть поименована, как в старом добром чистом Си)
0
ostio
0 / 0 / 0
Регистрация: 01.01.2015
Сообщений: 2
01.08.2015, 00:36 34
Тоже парился над подобной проблемой, пока не разобрался как добавить файлы в проект в Solution Explorer

0
01.08.2015, 00:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2015, 00:36

Помощь с Atmel Studio 7
Доброе время суток. У меня такая ситуация с Atmel Studyo 7: перестала видеть хиадеры. полез в...

Платная ли Atmel Studio?
Переустановил систему, скачал AS с офф сайта. Запускаю инсталятор - выводит уведомление... Не...

Симуляция в Atmel Studio 6
Здравствуйте. Не могу понять, в чем проблема. Запускаю в отладке программу для USORTa....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru