Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по синтаксису
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
swisst
Среда разработки и компилятор AVRStudio+WinAVR, процессор ATMega88

Переопределяю тип данных:

typedef struct
{
char Name;
char Type_Item;
char Prev;
char Next;
void (*Show_Proc) ();
void (*Show_Edit_Proc) ();
void (*Menu_Read) ();
void (*Menu_Write) ();
char Min_Value;
char Max_Value;
char Step_Value;

}Menu_Item;


Объявляю переменную такого типа:

Menu_Item AVT_Menu_Item[14]={...заполняю константами...};

Такой массив будет размещаться в ОЗУ, а мне необходимо разместить его во FLASH. Подскажите, как это сделать ?
aesok
Цитата(swisst @ Jul 5 2007, 13:13) *
Среда разработки и компилятор AVRStudio+WinAVR, процессор ATMega88

...

Такой массив будет размещаться в ОЗУ, а мне необходимо разместить его во FLASH. Подскажите, как это сделать ?


Прочтите в avr-libc-user-manual 'avr/pgmspace.h>: Program Space String Utilities' и FAQ#14.

Потом отвечу на оставшиеся вопросы.

Анатолий.
Dimmy
К сожалением WinAVR не пользую, но общий синтаксис примерно такой:

typedef struct Menu_Item
{
char Name;
char Type_Item;
char Prev;
char Next;
void (*Show_Proc) ();
void (*Show_Edit_Proc) ();
void (*Menu_Read) ();
void (*Menu_Write) ();
char Min_Value;
char Max_Value;
char Step_Value;

};
//---------------------------------------------
const struct Menu_Item AVT_Menu_Item[14]={...заполняю константами...};
aesok
Цитата(Dimmy @ Jul 5 2007, 13:27) *
К сожалением WinAVR не пользую, но общий синтаксис примерно такой:


//---------------------------------------------
const struct Menu_Item AVT_Menu_Item[14]={...заполняю константами...};


Не вводите людей в заблуждение, масив AVT_Menu_Item будет расположен в RAM.

Анатолий.
sensor_ua
typedef struct Menu_Item{
...
}Menu_Item_t;
#define AVT_Menu_Item_Default0 {...заполняю константами...}
#define AVT_Menu_Item_Default1 {...заполняю константами...}
const Menu_Item_t AVT_Menu_Item[]={AVT_Menu_Item_Default0,AVT_Menu_Item_Default1};

Только как во FLASH положить, пока не знаюwink.gif
Dimmy
Просто там явные проблемы с синтаксисом. Вот это:
typedef struct
{
char Name;
char Type_Item;
char Prev;
char Next;
void (*Show_Proc) ();
void (*Show_Edit_Proc) ();
void (*Menu_Read) ();
void (*Menu_Write) ();
char Min_Value;
char Max_Value;
char Step_Value;

}Menu_Item;

уже создает экземпляр структуры Menu_Item с выделением под него памяти.

А это (можно даже без typedef):

typedef struct MENU_ITEM
{
char Name;
char Type_Item;
char Prev;
char Next;
void (*Show_Proc) ();
void (*Show_Edit_Proc) ();
void (*Menu_Read) ();
void (*Menu_Write) ();
char Min_Value;
char Max_Value;
char Step_Value;
};
- только объявление структуры. Оно позволяет создавать экземпляры (переменные, константы) типа MENU_ITEM:
struct MENU_ITEM MyMenu; //это переменная
const struct MENU_ITEM MyMenuArray[]={...}; //а это константа. В IAR,например, она по умолчанию разместится в памяти программ, поскольку использовано кл. слово "const"
А что касается WinAVR:
//--------------------------------
#include <avr/pgmspace.h>
//--------------------------------
typedef struct MENU_ITEM
{
char Name;
char Type_Item;
char Prev;
char Next;
void (*Show_Proc) ();
void (*Show_Edit_Proc) ();
void (*Menu_Read) ();
void (*Menu_Write) ();
char Min_Value;
char Max_Value;
char Step_Value;
};
//------------------------------------------
struct MENU_ITEM MyMenuArray[] PROGMEM={...};
swisst
Дошел до того-же, что и Dimmy - переменные нового типа размещаю во флэш-памяти.

Появилось новое "но" - нарушилось обращение к полям структур...
sensor_ua
Цитата
}Menu_Item; уже создает экземпляр структуры Menu_Item с выделением под него памяти.

Ткните, плз, где такое написано. Для плюсов - понимаю - экземпляр должен быть (хоть по-правильному автоматом потом, кажись линкером, лишнее и вычищается). А для С - мне кажется такое утверждение слишком категорично. То, что компилеры зачастую уже не C, а C++ и есть свои нюансы - тоже понятно и как в этом смысле себя ведёт GCC для AVR не знаю. Но всё-таки ткните, плз.
http://en.wikipedia.org/wiki/Typedef уже смотрел
ЗЫ. насчёт PROGMEM спасибо, буду знать
Dimmy
"Появилось новое "но" - нарушилось обращение к полям структур..."
а как обращаетесь?
Палыч
Цитата(swisst @ Jul 5 2007, 15:31) *
Появилось новое "но" - нарушилось обращение к полям структур...


IMHO, в WinAVR получить что-либо из памяти программ можно только функциями pgm_read_****()
См. < avr/pgmspace.h >
Dimmy
To sensor_ua. Тыкаю по структурам. Керниган и ричи, гл.6:
"...
Точно так же, как в случае любого другого базисного типа, за правой фигурной скобкой, закрывающей список членов, может следовать список переменных. Оператор


struct { ...} x,y,z;

синтаксически аналогичен

int x,y,z;

в том смысле, что каждый из операторов описывает x, y и z в качестве переменных соотвествующих типов и приводит к выделению для них памяти.
Описание структуры, за которым не следует списка переменных, не приводит к выделению какой-либо памяти; оно только определяет шаблон или форму структуры. Однако, если такое описание снабжено ярлыком, то этот ярлык может быть использован позднее при определении фактических экземпляров структур. Например, если дано приведенное выше описание date, то
struct date d;
...
"
sensor_ua
2Dimmy
struct { ...} x,y,z;
не то же, что
typedef struct { ...} x;
потому тык не о том
Dimmy
Согласен...
"...И опыт - сын ошибок трудных,
И гений - парадоксов друг...
"
(А.С.Пушкин) smile.gif
Tracer
Цитата(swisst @ Jul 5 2007, 12:13) *
Среда разработки и компилятор AVRStudio+WinAVR, процессор ATMega88
...
const Menu_Item_t AVT_Menu_Item[]...
Подскажите, как это сделать ?


#include <avr/eeprom.h>
...
const Menu_Item_t AVT_Menu_Item[] EEMEM ={
...
для детальной информации читай доку по avr-libc - Идет в комплекте с WinAVR
:о)
defunct
Цитата(Dimmy @ Jul 5 2007, 13:22) *
Просто там явные проблемы с синтаксисом. Вот это:

typedef struct
{
...
}Menu_Item;
уже создает экземпляр структуры Menu_Item с выделением под него памяти.

Нет тут никаках проблем с синтаксисом, и не создается никакого экземпляра Menu_Item.
Menu_Item - это имя нового типа - структуры без тэга.


Цитата
А это (можно даже без typedef):
...
struct MENU_ITEM MyMenu; //это переменная

наврятли это будет чем-то удобнее чем
Menu_Item MyMenu; // это переменная

Цитата
To sensor_ua. Тыкаю по структурам. Керниган и ричи, гл.6:

вы бы сами разобрались что к чему, прежде чем тыкать пальцем в небо.

Цитата(Tracer @ Jul 6 2007, 16:11) *
const Menu_Item_t AVT_Menu_Item[] EEMEM ={

Автору вопроса структуру надо было во флеш разместить, а не в eeprom..
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.