Страница 1 из 1

структуру во FLash

Добавлено: Вс сен 29, 2013 14:34:42
Akula
Помогите "загнать" структуру во Flash память МК (Mega 16). Пробую в студии 6.1. Компилятор никак не хочет инициализировать структуру во Flash. На CodeVision подобной проблемы не было.

#include <avr/io.h>
#include <avr/pgmspace.h>

PROGMEM struct Sobitia {
unsigned char on;
unsigned char off;

};

int main(void)
{
unsigned char chTemp = 1;

struct Sobitia chTimer_1 = {2, 2};

while(1)
{
asm("nop"); //TODO:: Please write your application code

chTemp = chTimer_1.on;
}
}

Re: структуру во FLash

Добавлено: Вс сен 29, 2013 14:56:56
Аlex
Интересно, а как Вы собираетесь менять в ней данные, во время программы, если она находится во flsh'е ?

Re: структуру во FLash

Добавлено: Вс сен 29, 2013 15:13:49
pcb
в теме про авр был от меня подобный вопрос. ищи поиском.

Re: структуру во FLash

Добавлено: Вс сен 29, 2013 15:26:00
Akula
Аlex писал(а):Интересно, а как Вы собираетесь менять в ней данные, во время программы, если она находится во flsh'е ?
Считывать с помощью макросов. В коде я конечно ошибку допустил надо было:

//макрос для чтения флэш памяти
#define prb(data) pgm_read_byte(&(data))

chTemp = prb(chTimer_1.on);

Но не столь важно. Компилятор размещает структуру в ОЗУ.

Re: структуру во FLash

Добавлено: Вс сен 29, 2013 15:27:58
Akula
pcb писал(а):в теме про авр был от меня подобный вопрос. ищи поиском.
Не нашёл поиском.

Re: структуру во FLash

Добавлено: Вс сен 29, 2013 15:51:44
blackx
Попробуйте так

Код: Выделить всё

typedef struct PROGMEM { // !!!
unsigned char on;
unsigned char off;
} Sobitia ; // !!!

int main(void)
{
unsigned char chTemp = 1;	

Sobitia chTimer_1 = {2, 2}; // !!!

// ...	
}
GCC случайно не выдает warning на объявление структуры?

Re: структуру во FLash

Добавлено: Вс сен 29, 2013 16:24:59
Akula
blackx писал(а):Попробуйте так

Код: Выделить всё

typedef struct PROGMEM { // !!!
unsigned char on;
unsigned char off;
} Sobitia ; // !!!

int main(void)
{
unsigned char chTemp = 1;	

Sobitia chTimer_1 = {2, 2}; // !!!

// ...	
}
GCC случайно не выдает warning на объявление структуры?
К сожалению не получилось.
Компилятор на структуру не ругается.

Re: структуру во FLash

Добавлено: Вс сен 29, 2013 18:00:17
urry
через typedef вы создаете тип переменной, а не указываете ее размещение.
typedef struct { // !!!
unsigned char on;
unsigned char off;
} Sobitia ; // !!!

int main(void)
{
unsigned char chTemp = 1;

PROGMEM Sobitia chTimer_1 = {2, 2};

Re: структуру во FLash

Добавлено: Вс сен 29, 2013 18:26:07
Akula
urry писал(а):через typedef вы создаете тип переменной, а не указываете ее размещение.
typedef struct { // !!!
unsigned char on;
unsigned char off;
} Sobitia ; // !!!

int main(void)
{
unsigned char chTemp = 1;

PROGMEM Sobitia chTimer_1 = {2, 2};
Ну ни в какую не хочет работать. Я уже колдовал с этим PROGMEM. И так делал

Sobitia chTimer_1 PROGMEM = {2, 2};

Вообще ошибку выдаёт.

Re: структуру во FLash

Добавлено: Вс сен 29, 2013 18:46:49
urry
убери эту хрень из мейна вверх

typedef struct { // !!!
unsigned char on;
unsigned char off;
}Sobitia; // !!!

const PROGMEM Sobitia chTimer = {2, 2};
Компилятор визжит из-за этого

Re: структуру во FLash

Добавлено: Вс сен 29, 2013 19:10:15
Akula
urry писал(а):убери эту хрень из мейна вверх

typedef struct { // !!!
unsigned char on;
unsigned char off;
}Sobitia; // !!!

const PROGMEM Sobitia chTimer = {2, 2};
Компилятор визжит из-за этого
Всё, заработало. Большое спасибо за помощь!

Re: структуру во FLash

Добавлено: Вс сен 29, 2013 21:02:17
xterro
О, расскажите подробнее про структуры во flash, их действительно нельзя использовать в программе? (Просто ни разу с ними в AVR не работал) какие есть ограничения, как их использовать?

Re: структуру во FLash

Добавлено: Пн сен 30, 2013 09:30:03
urry
Никто не запрещает размещать структуры в памяти программ - просто их область применения крайне ограничена. Ну, первое, конечно - это менюшки - смысл забивать оперативку строками и рисунками - а второе - это копирование дефолтных значений при старте в структуру в оперативке. Больше и не придумаю...

Re: структуру во FLash

Добавлено: Пн сен 30, 2013 09:31:37
ploop
их действительно нельзя использовать в программе?
Почему нельзя? Используйте, но только для чтения :)

Re: структуру во FLash

Добавлено: Пн сен 30, 2013 09:39:34
xterro
но только для чтения
Вот это "для чтения" меня и смущает. Т.е объявляем структуру, загоняем её скажем в массив и его заранее инициализируем, а потом в main просто бегаем по этому массиву и берём из него структуру и используем, так что-ли? :dont_know:

Re: структуру во FLash

Добавлено: Пн сен 30, 2013 09:53:05
Akula
xterro писал(а):
но только для чтения
Вот это "для чтения" меня и смущает. Т.е объявляем структуру, загоняем её скажем в массив и его заранее инициализируем, а потом в main просто бегаем по этому массиву и берём из него структуру и используем, так что-ли? :dont_know:
Именно так, но только считывая данные. Т.е. как бы неизменяемый массив.

Re: структуру во FLash

Добавлено: Пн сен 30, 2013 10:08:33
urry
бегать по массиву нужно в спортивных трусах.
Здесь есть пример, как это делать правильно
http://www.avrfreaks.net/modules/Freaks ... roMenu.zip

Re: структуру во FLash

Добавлено: Пн сен 30, 2013 11:52:14
xterro
Благодарствую :)