www.open-tager.ru https://open-tager.ru/forum/ |
|
Вопросы по компилятору avr-gcc (WinAVR). https://open-tager.ru/forum/viewtopic.php?f=5&t=330 |
Страница 1 из 4 |
Автор: | Pingvin [ 01 окт 2011, 16:43 ] |
Заголовок сообщения: | Вопросы по компилятору avr-gcc (WinAVR). |
Поимогите разобраться! Что делаю не так? Хотел вынести функции прерывания в отдельный файл, но тут возникла проблема с глобальными переменными. В новом файле глобальные переменные были не видны, компилятор создавал новые с такими же именами. Пробовал и global перед переменной писать, и двоеточия ставить ::peremennaya. Не помогает. Если все функции в одном файле описаны - то нет проблем. И к tommy вопрос - в исходниках с выстрелом массив со звуком объявлен без макроса PROGMEM. У как же в таком случае компилятор его в памяти программ создаёт? Чего я не понял? |
Автор: | ASM [ 01 окт 2011, 20:03 ] |
Заголовок сообщения: | Re: Вопросы по компилятору avr-gcc (WinAVR). |
Честно говоря хотелось бы увидеть код. На тему глобальных, вы их делаете в каком-нибудь C файле, после чего extern-ите в хедер, так должно работать. Ещё может быть проблема, если вы мешаете C и C++ файлы, в этом случае нужно extern делать в блоке extern C { }. В общем объяснить сложно, телепатия тоже работает плохо, давайте код, получите разъяснения. |
Автор: | tommy [ 01 окт 2011, 21:28 ] |
Заголовок сообщения: | Re: Вопросы по компилятору avr-gcc (WinAVR). |
Pingvin писал(а): И к tommy вопрос - в исходниках с выстрелом массив со звуком объявлен без макроса PROGMEM. может не те какие-то исходники смотрите? лучше смотреть версию для 16-й меги. .h файл скриптиком создаётся и там таки, да, есть этот PROGMEM. только что проверил. этого прогмем нет в той версии что на опентаге была выложена неделю назад, но там и звук не работа. а так в файле должно быть:У как же в таком случае компилятор его в памяти программ создаёт? Чего я не понял? Код: const unsigned char pSnd[] PROGMEM = { Pingvin писал(а): Хотел вынести функции прерывания в отдельный файл, но тут возникла проблема с глобальными переменными. по поводу переменных - а откуда такое global? может лучше extern тогда? или вынести определение в .h файл. или оставить в одном из си файлов, но в другом их как extern объявить. :: не поможет, т.к. каждый файл он в глобальном неймспейсе всё одно сидит. ну или ещё можно архитектуру пересмотреть, чтоб без глобальных переменных обойтись.В новом файле глобальные переменные были не видны, компилятор создавал новые с такими же именами. Пробовал и global перед переменной писать, и двоеточия ставить ::peremennaya. Не помогает. Если все функции в одном файле описаны - то нет проблем. а так, да - исходник проще подправить. ну и пролистать какую-нить книжку "с/с++ за 30 дней" или методичку по си - там обычно с примерами объясняют. |
Автор: | Pingvin [ 02 окт 2011, 09:38 ] |
Заголовок сообщения: | Re: Вопросы по компилятору avr-gcc (WinAVR). |
ASM писал(а): Честно говоря хотелось бы увидеть код. На тему глобальных, вы их делаете в каком-нибудь C файле, после чего extern-ите в хедер, так должно работать. Ещё может быть проблема, если вы мешаете C и C++ файлы, в этом случае нужно extern делать в блоке extern C { }. В общем объяснить сложно, телепатия тоже работает плохо, давайте код, получите разъяснения. Кажется разобрался - нельзя такие переменные объявлять static! ---------------- Нифига не разобрался. Мне нужно, чтобы глобальная переменная была видна из любого файла проекта. Как правильно это сделать? Вот описал переменные в хедере test2.h Код: #ifndef TEST2_H #define TEST2_H #define F_CPU 8000000UL // ×àñòîòà 8 MHz #define BIT1 1 #define BIT2 2 #define BIT3 4 #define BIT4 8 #include <avr/io.h> // áèáëèîòåêà I/O #include <util/delay.h> // áèáëèîòåêè ïàóç #include <avr/pgmspace.h> #include <avr/eeprom.h> //unsigned char buffer[20]; unsigned char st[] PROGMEM = "hello world!"; uint8_t bit_mask[] PROGMEM = { 0b00000001, 0b00000010, 0b00000011, 0b00000100}; int n; typedef enum damage {Damage_1, Damage_2} tdamage; unsigned char buffer[20] = { 1,2,3, 0b00000001 }; volatile tdamage damage; volatile uint8_t i; #endif /* TEST2_H */ Этот хедер подключаю в двух файлах test2.c Код: #include "test2.h" int main(void) { i = pgm_read_byte(&(bit_mask[0])); i = pgm_read_byte(&(bit_mask[1])); i = pgm_read_byte(&(bit_mask[2])); i = pgm_read_byte(&(bit_mask[3])); damage = Damage_1; n = damage; damage = Damage_2; n = damage; strncpy_P(buffer, (PGM_P)st, 20); DDRB |= BIT1|BIT2|BIT4; // íàçíà÷èòü íîæêó PB0 ÂÛÕÎÄÎÌ n = strlcpy_P (buffer, (PGM_P)st, strnlen_P(st, 20)); while(1) { // Áåñêîíå÷íûé öèêë //PORTB &= ~_BV(PB0); // "0" íà PB0 - ñâåòîäèîä âêëþ÷åí //_delay_us(200); // Ïàóçà 200 000 ÌèêðîÑåê. //PORTB |= _BV(PB0); // "1" íà PB0 - ñâåòîäèîä âÛêë. //_delay_ms(6); // Ïàóçà 600 ìèëèÑåê. PORTB ^=_BV(PB1); // PORTB ^=_BV(PB0); // } // ñêîáêà äëÿ while(1) return 0; } // ñêîáêà äëÿ main(void) и в func.c Код: #include "test2.h" //volatile uint8_t i; //extern i; //extern damage; void init_damage() { i++; switch(damage) { case Damage_1: { i++; break; } case Damage_2: { i++; break; } } } Компилятор ошибок не находит, а линковщик ругается: Цитата: func.o:(.progmem.data+0x0): multiple definition of `st' test2.o:(.progmem.data+0x0): first defined here func.o:(.progmem.data+0xd): multiple definition of `bit_mask' test2.o:(.progmem.data+0xd): first defined here func.o:(.data+0x0): multiple definition of `buffer' test2.o:(.data+0x0): first defined here make: *** [test2.elf] Error 1 Build failed with 1 errors and 3 warnings... Как грамотно разрулить ситуацию. Нужно свой MAKE-файл писать? Чет запутался вконец! |
Автор: | ASM [ 02 окт 2011, 14:20 ] |
Заголовок сообщения: | Re: Вопросы по компилятору avr-gcc (WinAVR). |
Если вы делаете #include <имя файла>.h из двух разных исходников (файлов на языке C), то вы как бы "вставляете" содержимое. Если вы создаёте объект, например unsigned char buffer[20] в хереде (H файле), то каждый #include <имя файла>.h вынудит создать объект buffer. Иными словами вы это и видите в матюгальнике: func.o:(.data+0x0): multiple definition of `buffer' test2.o:(.data+0x0): first defined here Файлы func.c и text2.c делают #inlcude. Для правильной работы в H файле необходимо ТОЛЬКО описывать какие имена объектов какой формат представления в памяти имеют. Иными словами писать: extern unsigned char buffer[20]; Это говорит что есть некий объект ГДЕ-ТО, который представляет из себя массив из 20 элементов без знака. А уже в ОДНОМ каком-нибудь C файле нужно определять этот объект. Я очень рекомендую почитать какую-нибудь литературу по тому что такое язык C, как хранятся объекты в памяти, что такое объектные файлы, как происходит линковка. Что такое стек и куча. Все переменные и функции что вы определяете в C файлах по умолчанию являются глобальными. Если вы хотите что бы область видимости их была только в файле, необходимо создавать их как "static". Замечу что при определении переменной внутри функции с параметром "static", создаётся переменная не в стеке, а в куче. P.S. Вместо unsigned char очень рекомендую использовать uint8_t, определение этого и других полезных типов есть в стандартном файле stdint.h. P.P.S Так же прошу потратить силы и время, но осилить работу с github. |
Автор: | Pingvin [ 02 окт 2011, 14:36 ] |
Заголовок сообщения: | Re: Вопросы по компилятору avr-gcc (WinAVR). |
ASM писал(а): Если вы делаете #include <имя файла>.h из двух разных исходников (файлов на языке C), то вы как бы "вставляете" содержимое. Если вы создаёте объект, например unsigned char buffer[20] в хереде (H файле), то каждый #include <имя файла>.h вынудит создать объект buffer. Иными словами вы это и видите в матюгальнике: func.o:(.data+0x0): multiple definition of `buffer' test2.o:(.data+0x0): first defined here Файлы func.c и text2.c делают #inlcude. Для правильной работы в H файле необходимо ТОЛЬКО описывать какие имена объектов какой формат представления в памяти имеют. Иными словами писать: extern unsigned char buffer[20]; Это говорит что есть некий объект ГДЕ-ТО, который представляет из себя массив из 20 элементов без знака. А уже в ОДНОМ каком-нибудь C файле нужно определять этот объект. Я очень рекомендую почитать какую-нибудь литературу по тому что такое язык C, как хранятся объекты в памяти, что такое объектные файлы, как происходит линковка. Что такое стек и куча. Все переменные и функции что вы определяете в C файлах по умолчанию являются глобальными. Если вы хотите что бы область видимости их была только в файле, необходимо создавать их как "static". Замечу что при определении переменной внутри функции с параметром "static", создаётся переменная не в стеке, а в куче. P.S. Вместо unsigned char очень рекомендую использовать uint8_t, определение этого и других полезных типов есть в стандартном файле stdint.h. P.P.S Так же прошу потратить силы и время, но осилить работу с github. Спасибо! Пару минут назад сообразил, наконец то, что к чему! (честно говоря, никогда толком не понимал все эти "тонкости" компиляции) Вы ещё больше внесли ясность. Спасибо. Вопрос снят. А с github буду разбираться, обязательно, так же надеюсь на вашу помощь. |
Автор: | Pingvin [ 02 окт 2011, 14:58 ] |
Заголовок сообщения: | Re: Вопросы по компилятору avr-gcc (WinAVR). |
Цитата: может не те какие-то исходники смотрите? лучше смотреть версию для 16-й меги. .h файл скриптиком создаётся и там таки, да, есть этот PROGMEM. только что проверил. этого прогмем нет в той версии что на опентаге была выложена неделю назад, но там и звук не работа Да, я с open-tag.ru качал. А где под 16 мегу лежат? |
Автор: | tommy [ 02 окт 2011, 17:03 ] |
Заголовок сообщения: | Re: Вопросы по компилятору avr-gcc (WinAVR). |
Pingvin писал(а): Да, я с open-tag.ru качал. А где под 16 мегу лежат? Теперь и на open-tag'e лежит версия с вавкой для 8-й меги. Сам звук - ak47.raw.h. Для 16-й пока нигде не лежит, т.к. платок под неё ещё нет. Наброски присылал по почте полторы недели назад (проект под avrstudio5 - BaseB3).
|
Автор: | Pingvin [ 11 окт 2011, 08:09 ] |
Заголовок сообщения: | Re: Вопросы по компилятору avr-gcc (WinAVR). |
А кто-нибудь работал с avr под никсами? Я вот попробовал kontrollerlad поставить из исходников - не вышло. Сейчас установил на Eclipse avr-plugin. Компилится вроде. Залить пока не могу - нет на компе COM-порта. В принципе, AVR-Studio меня полностью устраивает, но хочется открытый проект делать на открытых программных продуктах (вплоть до ОС). Да и, опять же, спортивный интерес... P.S. Удалось запустить с симулятором simulavr. Работает. |
Автор: | ASM [ 14 окт 2011, 21:12 ] |
Заголовок сообщения: | Re: Вопросы по компилятору avr-gcc (WinAVR). |
Pingvin писал(а): А кто-нибудь работал с avr под никсами? Я работаю под GNU/Linux, всегда и везде. Pingvin писал(а): P.S. Удалось запустить с симулятором simulavr. Работает. Поздравляю, а у меня оно предательски сегфолтится Хотя штука очень интересная, поддерживает Verilog для аппаратуры и имеет swig, что позволяет использовать любой язык типо Python, Ruby, Perl для коварных прикладных нужд... |
Страница 1 из 4 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |