www.open-tager.ru

открытый лазертаг форум
Текущее время: 21 ноя 2024, 22:40

Часовой пояс: UTC + 3 часа [ Летнее время ]


Реклама

Правила форума


В разделе запрещены - обсуждение оборудования не поддерживающего открытых протоколов, реклама и ссылки на готовые продукты лазертага, обсуждение политики производителей и самих производителей. Виден всем.



Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Вопросы по компилятору avr-gcc (WinAVR).
СообщениеДобавлено: 01 окт 2011, 16:43 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Поимогите разобраться! Что делаю не так?
Хотел вынести функции прерывания в отдельный файл, но тут возникла проблема с глобальными переменными.
В новом файле глобальные переменные были не видны, компилятор создавал новые с такими же именами.
Пробовал и global перед переменной писать, и двоеточия ставить ::peremennaya.
Не помогает.
Если все функции в одном файле описаны - то нет проблем. :(

И к tommy вопрос - в исходниках с выстрелом массив со звуком объявлен без макроса PROGMEM.
У как же в таком случае компилятор его в памяти программ создаёт? Чего я не понял?

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 01 окт 2011, 20:03 
Не в сети
Завсегдатай

Зарегистрирован: 13 авг 2011, 01:14
Сообщений: 153
Откуда: Moscow
Честно говоря хотелось бы увидеть код.
На тему глобальных, вы их делаете в каком-нибудь C файле,
после чего extern-ите в хедер, так должно работать.

Ещё может быть проблема, если вы мешаете C и C++ файлы,
в этом случае нужно extern делать в блоке extern C { }.

В общем объяснить сложно, телепатия тоже работает плохо,
давайте код, получите разъяснения.

_________________
LaserTag своими руками? Легко! http://3zu.ru/projects/lasertag/wiki


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 01 окт 2011, 21:28 
Не в сети
Местный

Зарегистрирован: 13 июл 2011, 17:05
Сообщений: 475
Откуда: Perm
Pingvin писал(а):
И к tommy вопрос - в исходниках с выстрелом массив со звуком объявлен без макроса PROGMEM.
У как же в таком случае компилятор его в памяти программ создаёт? Чего я не понял?
может не те какие-то исходники смотрите? лучше смотреть версию для 16-й меги. .h файл скриптиком создаётся и там таки, да, есть этот PROGMEM. только что проверил. этого прогмем нет в той версии что на опентаге была выложена неделю назад, но там и звук не работа. а так в файле должно быть:
Код:
const unsigned char pSnd[] PROGMEM = {


Pingvin писал(а):
Хотел вынести функции прерывания в отдельный файл, но тут возникла проблема с глобальными переменными.
В новом файле глобальные переменные были не видны, компилятор создавал новые с такими же именами.
Пробовал и global перед переменной писать, и двоеточия ставить ::peremennaya.
Не помогает.
Если все функции в одном файле описаны - то нет проблем.
по поводу переменных - а откуда такое global? может лучше extern тогда? или вынести определение в .h файл. или оставить в одном из си файлов, но в другом их как extern объявить. :: не поможет, т.к. каждый файл он в глобальном неймспейсе всё одно сидит. ну или ещё можно архитектуру пересмотреть, чтоб без глобальных переменных обойтись.

а так, да - исходник проще подправить. ну и пролистать какую-нить книжку "с/с++ за 30 дней" или методичку по си - там обычно с примерами объясняют.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 02 окт 2011, 09:38 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
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-файл писать?
Чет запутался вконец! :?

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 02 окт 2011, 14:20 
Не в сети
Завсегдатай

Зарегистрирован: 13 авг 2011, 01:14
Сообщений: 153
Откуда: Moscow
Если вы делаете #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.

_________________
LaserTag своими руками? Легко! http://3zu.ru/projects/lasertag/wiki


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 02 окт 2011, 14:36 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
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 буду разбираться, обязательно, так же надеюсь на вашу помощь. :)

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 02 окт 2011, 14:58 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Цитата:
может не те какие-то исходники смотрите? лучше смотреть версию для 16-й меги. .h файл скриптиком создаётся и там таки, да, есть этот PROGMEM. только что проверил. этого прогмем нет в той версии что на опентаге была выложена неделю назад, но там и звук не работа

Да, я с open-tag.ru качал. А где под 16 мегу лежат?

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 02 окт 2011, 17:03 
Не в сети
Местный

Зарегистрирован: 13 июл 2011, 17:05
Сообщений: 475
Откуда: Perm
Pingvin писал(а):
Да, я с open-tag.ru качал. А где под 16 мегу лежат?
Теперь и на open-tag'e лежит версия с вавкой для 8-й меги. Сам звук - ak47.raw.h. Для 16-й пока нигде не лежит, т.к. платок под неё ещё нет. Наброски присылал по почте полторы недели назад (проект под avrstudio5 - BaseB3).


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 окт 2011, 08:09 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
А кто-нибудь работал с avr под никсами?
Я вот попробовал kontrollerlad поставить из исходников - не вышло.
Сейчас установил на Eclipse avr-plugin.
Компилится вроде.
Залить пока не могу - нет на компе COM-порта.
В принципе, AVR-Studio меня полностью устраивает, но хочется открытый проект делать на открытых программных продуктах (вплоть до ОС).
Да и, опять же, спортивный интерес...

P.S. Удалось запустить с симулятором simulavr. Работает.

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 14 окт 2011, 21:12 
Не в сети
Завсегдатай

Зарегистрирован: 13 авг 2011, 01:14
Сообщений: 153
Откуда: Moscow
Pingvin писал(а):
А кто-нибудь работал с avr под никсами?


Я работаю под GNU/Linux, всегда и везде.

Pingvin писал(а):
P.S. Удалось запустить с симулятором simulavr. Работает.


Поздравляю, а у меня оно предательски сегфолтится :-)
Хотя штука очень интересная, поддерживает Verilog для аппаратуры
и имеет swig, что позволяет использовать любой язык типо Python, Ruby, Perl
для коварных прикладных нужд...

_________________
LaserTag своими руками? Легко! http://3zu.ru/projects/lasertag/wiki


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 37


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB