Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Структура с хранением данных в flash и eeprom
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
altlogic
Здравствуйте!

Потребовалась простенькая структура хранящая часть информации во флеше, а часть в еепром. По документации кодвижина не могу понять как это сделать.
Нужно реализовать нечто подобное:
Код
typedef struct  
{          
   flash unsigned char ModeID;
   flash unsigned char ModeName[10];
   eeprom int DayTemp[7];
   eeprom int NightTemp[7];
   eeprom unsigned char StartDayTime[2];  
   eeprom unsigned char FinishDayTime[2];  
}mode_t;

то есть первые две переменные хранить во флеше, а остальные в еепром. Возможно ли это в кодвижине?
vet
разумеется, нельзя. структура - это не языковой костыль для удобства именования переменных, а размещаемый линкером неделимый кусок памяти, позволяющий обращение к своим составным частям - полям.
если хотите логически сгруппировать произвольные переменные - смотрите в сторону C++ (пространства имен, классы). если будете юзать IAR - в сторону пространств имен смотрите осторожно, т.к. имеется пока не исправленный баг (см. поиск по форуму).
Непомнящий Евгений
По-идее вместо пространств имен прокатят статические члены структуры. Или в чистом С их нет? А если у вас несколько объектов типа mode_t, то что-то в таком духе:
Код
typedef struct
{
   int DayTemp[7];
   int NightTemp[7];
   unsigned char StartDayTime[2];  
   unsigned char FinishDayTime[2];  
} mode_T_eeprom;

typedef struct
{
   unsigned char ModeID;
   unsigned char ModeName[10];
} mode_T_flash;

typedef struct
{
  eeprom mode_T_eeprom *e; // указатель на eeprom, лежащий в обычной памяти
  flash mode_T_flash *f;
} mode_t;


eeprom mode_T_eeprom p1 = {...};
flash mode_T_flash p2 = {...};

mode_T m = {&p1, &p2};

m->e->DayTemp[5] = 123;
...
altlogic
Vet, спасибо за исчерпывающий ответ.

Цитата
По-идее вместо пространств имен прокатят статические члены структуры. Или в чистом С их нет? А если у вас несколько объектов типа mode_t, то что-то в таком духе:

А Вам, Непомнящий Евгений, спасибо за код. Я уже собственно и сам подумал, что нужно как-то разбивать свою структуру. Буду пытаться реализовать Ваше предложение.
WHALE
V2.03.2 Commercial Release:
there is no need to specify the ‘flash’ or ‘eeprom’ memory attribute during structure or union type definition. Therefore the same structure or union data type can be easily located in any memory area during variable declaration.
vet
Цитата(WHALE @ May 16 2008, 09:34) *
V2.03.2 Commercial Release:
there is no need to specify the ‘flash’ or ‘eeprom’ memory attribute during structure or union type definition. Therefore the same structure or union data type can be easily located in any memory area during variable declaration.

это радует, давно пора было исправить этот момент.
altlogic
Немножко изменил код, и структура, предложенная Вами, Евгений, заработала. Огромное спасибо! Вот что бывает при отсутсвии под рукой хорошего справочника по Си...
WHALE
Цитата(vet @ May 16 2008, 09:46) *
это радует, давно пора было исправить этот момент.


К сожалению,пока радость чисто виртуальная... sad.gif
_Pasha
Код
          
   flash unsigned char ModeID;
   flash unsigned char ModeName[10];
   eeprom int DayTemp[7];
   eeprom int NightTemp[7];
   eeprom unsigned char StartDayTime[2];  
   eeprom unsigned char FinishDayTime[2];  

typedef struct  
{          
   unsigned char *pModeID;
   unsigned char *pModeName;
   int *pDayTemp;
   int *pNightTemp;
   unsigned char *pStartDayTime;  
   unsigned char *pFinishDayTime;  
}mode_t;

flash mode_t Mode={&ModeID,&ModeName,&DayTemp,&NightTemp,&StartDayTime,&FinishDayTime};


Вполне жизнеспособный костыль...
Непомнящий Евгений
Цитата(_Pasha @ May 16 2008, 11:25) *
Вполне жизнеспособный костыль...

До тех пор, пока нам не понадобится второй экземпляр объекта node_T. Тогда ручками придется насоздавать
Код
flash unsigned char ModeID_2;
   flash unsigned char ModeName_2[10];
   eeprom int DayTemp_2[7];
   eeprom int NightTemp_2[7];
   eeprom unsigned char StartDayTime_2[2];  
   eeprom unsigned char FinishDayTime_2[2];

flash mode_t Mode_2={&ModeID_2,&ModeName_2,&DayTemp_2,&NightTemp_2,&StartDayTime_2,&FinishDayTime_2};


И кстати только сейчас заметил - вы не указываете квалификаторы flash и eeprom у указателей. По идее, не скомпилится... Или жто особенность Codevision?
_Pasha
Цитата(Непомнящий Евгений @ May 16 2008, 10:39) *
До тех пор, пока нам не понадобится второй экземпляр объекта node_T.

Понял.
Код
flash unsigned char ModeID;
flash unsigned char ModeName[10];

Для этих мемберов надо заводить массивы, содержащие все возможные значения, и хранящиеся, ессно, во флеше, типа
Код
flash unsigned char Avail_Modes[Max_Avail_Modes];
flash unsigned char * ModeNameStr[Max_Mode_Names]={&ModeName_1, etc...}


А в структуре, которая нужна автору, добавить индексы, по которым можно найти нужные значения из флеша
Код
typedef struct  
{          
   eeprom unsigned short int ModeID_Index;     // хватит же 256 доступных мемберов ?
   eeprom unsigned short int ModeName_Index;
   eeprom int DayTemp[7];
   eeprom int NightTemp[7];
   eeprom unsigned char StartDayTime[2];  
   eeprom unsigned char FinishDayTime[2];  
}mode_t



Цитата
И кстати только сейчас заметил - вы не указываете квалификаторы flash и eeprom у указателей.

Ага. Прощелкал.
altlogic
Прошу прощение за невнимательность к теме, т.к. для себя уже нашёл выход. Вот, что я накрутил:
Код
//!< Названия доступных режимов обогрева
#define MODE_WEEK_NAME  "Недельный"
#define MODE_DAYLY_NAME "Суточный"
#define MODE_SMS_NAME   "SMS"
#define NUM_OF_MODE     3

//!< Идентификаторы доступных режимов обогрева    
#define MODE_DAYLY_ID   0
#define MODE_WEEK_ID    1
#define MODE_SMS_ID     2

//<! Структура для хранения в eeprom
typedef eeprom struct
{
   int DayTemp[7];
   int NightTemp[7];
   unsigned char StartDayTime[2];  
   unsigned char FinishDayTime[2];  
} eeprom_mode_t;

//<! Структура для хранения во flash
typedef flash struct
{
   unsigned char ModeID;
   unsigned char ModeName[10];
} flash_mode_t;


typedef struct
{
  eeprom eeprom_mode_t *e; //<! Указатель на eeprom, лежащий в обычной памяти
  flash flash_mode_t *f;   //<! Указатель на flash, лежащий в обычной памяти
} mode_t;


//!< Данные для инициализации структуры eeprom_mode_t
//<! Суточный режим
eeprom eeprom_mode_t ep1 =
{  {23, 23, 23, 23, 23, 15, 15}, {15, 15, 15, 15, 15, 15, 15}, {6, 30}, {19, 0}  };

//<! Недельный режим
eeprom eeprom_mode_t ep2 =
{  {21, 21, 21, 21, 21, 21, 21}, {20, 20, 20, 20, 20, 20, 20}, {7, 0}, {22, 0}   };

//<! Режим SMS
eeprom eeprom_mode_t ep3;

//!< Данные для инициализации структуры flash_mode_t
flash flash_mode_t fp1 = { MODE_DAYLY_ID, MODE_DAYLY_NAME };   //<! Суточный режим
flash flash_mode_t fp2 = { MODE_WEEK_ID, MODE_WEEK_NAME   };   //<! Недельный режим
flash flash_mode_t fp3 = { MODE_SMS_ID, MODE_SMS_NAME     };   //<! Режим SMS

//<! Объявление массива структур modes
mode_t modes[ NUM_OF_MODE ] = { {&ep1, &fp1}, {&ep2, &fp2},{&ep3, &fp3} };


Инициализация немного сложна, зато обращение выглядит просто:
Код
int id =modes[i].f->ModeID;

Хотя можно было объявить массив указателей fpи ep, но хрен редьки не слаще, тогда при его инициализации нужно было указывать что-то вроде
mode_t modes[ NUM_OF_MODE ] = { {&ep, &fp}, {&ep+xx, &fp+yy},{&ep+2*xx, &fp+2*yy} };
где xx, yy размер структур

Цитата(_Pasha @ May 16 2008, 19:50) *
А в структуре, которая нужна автору, добавить индексы, по которым можно найти нужные значения из флеша
Код
typedef struct  
{          
   eeprom unsigned short int ModeID_Index;     // хватит же 256 доступных мемберов ?
   eeprom unsigned short int ModeName_Index;
   eeprom int DayTemp[7];
   eeprom int NightTemp[7];
   eeprom unsigned char StartDayTime[2];  
   eeprom unsigned char FinishDayTime[2];  
}mode_t

Я решил константы записать во флеш, а переменнные в eeprom, поэтому не смог бы применить вашу конструкцию
_Pasha
Цитата(altlogic @ May 19 2008, 09:59) *
Я решил константы записать во флеш, а переменнные в eeprom, поэтому не смог бы применить вашу конструкцию


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