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

 
 
 
Reply to this topicStart new topic
> Структура с хранением данных в flash и eeprom, Возможно ли такое в CodeVison?
altlogic
сообщение May 16 2008, 02:31
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
vet
сообщение May 16 2008, 04:11
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



разумеется, нельзя. структура - это не языковой костыль для удобства именования переменных, а размещаемый линкером неделимый кусок памяти, позволяющий обращение к своим составным частям - полям.
если хотите логически сгруппировать произвольные переменные - смотрите в сторону C++ (пространства имен, классы). если будете юзать IAR - в сторону пространств имен смотрите осторожно, т.к. имеется пока не исправленный баг (см. поиск по форуму).


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение May 16 2008, 04:30
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 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;
...
Go to the top of the page
 
+Quote Post
altlogic
сообщение May 16 2008, 05:15
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Vet, спасибо за исчерпывающий ответ.

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

А Вам, Непомнящий Евгений, спасибо за код. Я уже собственно и сам подумал, что нужно как-то разбивать свою структуру. Буду пытаться реализовать Ваше предложение.


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
WHALE
сообщение May 16 2008, 05:34
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



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.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
vet
сообщение May 16 2008, 05:46
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 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.

это радует, давно пора было исправить этот момент.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
altlogic
сообщение May 16 2008, 05:48
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Немножко изменил код, и структура, предложенная Вами, Евгений, заработала. Огромное спасибо! Вот что бывает при отсутсвии под рукой хорошего справочника по Си...


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
WHALE
сообщение May 16 2008, 06:04
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Цитата(vet @ May 16 2008, 09:46) *
это радует, давно пора было исправить этот момент.


К сожалению,пока радость чисто виртуальная... sad.gif


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
_Pasha
сообщение May 16 2008, 07:25
Сообщение #9


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Код
          
   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};


Вполне жизнеспособный костыль...
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение May 16 2008, 07:39
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 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?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение May 16 2008, 08:50
Сообщение #11


;
******

Группа: Участник
Сообщений: 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 у указателей.

Ага. Прощелкал.
Go to the top of the page
 
+Quote Post
altlogic
сообщение May 19 2008, 06:59
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 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, поэтому не смог бы применить вашу конструкцию


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
_Pasha
сообщение May 19 2008, 08:35
Сообщение #13


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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


Дык я тоже самое и имел ввиду, только другими средствами.
Go to the top of the page
 
+Quote Post

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

 


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


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