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-файл писать?
Чет запутался вконец!