|
|
  |
Структура с хранением данных в flash и eeprom, Возможно ли такое в CodeVison? |
|
|
|
May 16 2008, 02:31
|
Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035

|
Здравствуйте! Потребовалась простенькая структура хранящая часть информации во флеше, а часть в еепром. По документации кодвижина не могу понять как это сделать. Нужно реализовать нечто подобное: Код 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; то есть первые две переменные хранить во флеше, а остальные в еепром. Возможно ли это в кодвижине?
Сообщение отредактировал altlogic - May 16 2008, 02:38
--------------------
|
|
|
|
|
May 16 2008, 04:30
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
По-идее вместо пространств имен прокатят статические члены структуры. Или в чистом С их нет? А если у вас несколько объектов типа 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; ...
|
|
|
|
|
May 16 2008, 05:15
|
Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035

|
Vet, спасибо за исчерпывающий ответ. Цитата По-идее вместо пространств имен прокатят статические члены структуры. Или в чистом С их нет? А если у вас несколько объектов типа mode_t, то что-то в таком духе: А Вам, Непомнящий Евгений, спасибо за код. Я уже собственно и сам подумал, что нужно как-то разбивать свою структуру. Буду пытаться реализовать Ваше предложение.
--------------------
|
|
|
|
|
May 16 2008, 05:46
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

|
Цитата(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. это радует, давно пора было исправить этот момент.
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
May 16 2008, 07:39
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(_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?
|
|
|
|
|
May 16 2008, 08:50
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Непомнящий Евгений @ 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 у указателей. Ага. Прощелкал.
|
|
|
|
|
May 19 2008, 06:59
|
Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035

|
Прошу прощение за невнимательность к теме, т.к. для себя уже нашёл выход. Вот, что я накрутил: Код //!< Названия доступных режимов обогрева #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, поэтому не смог бы применить вашу конструкцию
--------------------
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|