реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Вопрос по синтаксису, AVRStudio+WinAVR
swisst
сообщение Jul 5 2007, 09:13
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 16-02-07
Из: Харьков
Пользователь №: 25 425



Среда разработки и компилятор 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. Подскажите, как это сделать ?
Go to the top of the page
 
+Quote Post
aesok
сообщение Jul 5 2007, 09:26
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(swisst @ Jul 5 2007, 13:13) *
Среда разработки и компилятор AVRStudio+WinAVR, процессор ATMega88

...

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


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

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

Анатолий.
Go to the top of the page
 
+Quote Post
Dimmy
сообщение Jul 5 2007, 09:27
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-09-05
Пользователь №: 8 503



К сожалением 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]={...заполняю константами...};
Go to the top of the page
 
+Quote Post
aesok
сообщение Jul 5 2007, 09:34
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Dimmy @ Jul 5 2007, 13:27) *
К сожалением WinAVR не пользую, но общий синтаксис примерно такой:


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


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

Анатолий.
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Jul 5 2007, 09:52
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



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


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
Dimmy
сообщение Jul 5 2007, 10:22
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-09-05
Пользователь №: 8 503



Просто там явные проблемы с синтаксисом. Вот это:
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={...};

Сообщение отредактировал Dimmy - Jul 5 2007, 10:53
Go to the top of the page
 
+Quote Post
swisst
сообщение Jul 5 2007, 11:31
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 16-02-07
Из: Харьков
Пользователь №: 25 425



Дошел до того-же, что и Dimmy - переменные нового типа размещаю во флэш-памяти.

Появилось новое "но" - нарушилось обращение к полям структур...
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Jul 5 2007, 11:38
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



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

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


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
Dimmy
сообщение Jul 5 2007, 11:52
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-09-05
Пользователь №: 8 503



"Появилось новое "но" - нарушилось обращение к полям структур..."
а как обращаетесь?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 5 2007, 11:57
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(swisst @ Jul 5 2007, 15:31) *
Появилось новое "но" - нарушилось обращение к полям структур...


IMHO, в WinAVR получить что-либо из памяти программ можно только функциями pgm_read_****()
См. < avr/pgmspace.h >
Go to the top of the page
 
+Quote Post
Dimmy
сообщение Jul 5 2007, 12:09
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-09-05
Пользователь №: 8 503



To sensor_ua. Тыкаю по структурам. Керниган и ричи, гл.6:
"...
Точно так же, как в случае любого другого базисного типа, за правой фигурной скобкой, закрывающей список членов, может следовать список переменных. Оператор


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

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

int x,y,z;

в том смысле, что каждый из операторов описывает x, y и z в качестве переменных соотвествующих типов и приводит к выделению для них памяти.
Описание структуры, за которым не следует списка переменных, не приводит к выделению какой-либо памяти; оно только определяет шаблон или форму структуры. Однако, если такое описание снабжено ярлыком, то этот ярлык может быть использован позднее при определении фактических экземпляров структур. Например, если дано приведенное выше описание date, то
struct date d;
...
"
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Jul 5 2007, 12:40
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



2Dimmy
struct { ...} x,y,z;
не то же, что
typedef struct { ...} x;
потому тык не о том


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
Dimmy
сообщение Jul 5 2007, 13:38
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-09-05
Пользователь №: 8 503



Согласен...
"...И опыт - сын ошибок трудных,
И гений - парадоксов друг...
"
(А.С.Пушкин) smile.gif
Go to the top of the page
 
+Quote Post
Tracer
сообщение Jul 6 2007, 13:11
Сообщение #14


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 31-10-05
Пользователь №: 10 350



Цитата(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
:о)

Сообщение отредактировал Tracer - Jul 6 2007, 13:22
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 8 2007, 19:14
Сообщение #15


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(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..
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th July 2025 - 23:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01495 секунд с 7
ELECTRONIX ©2004-2016