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

 
 
> Инициализация структуры во флэши.
Stanislav_S
сообщение Aug 1 2008, 17:11
Сообщение #1


извечный пессимист
*****

Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125



Ссори если глупый вопрос, но голова что то совсем нихрена не работает. Имеем такую структуру:
struct Parametr
{
__flash char const *str;
unsigned char parametr;
__flash unsigned char *adr;
__flash unsigned int *scale_factor;

};
struct Parametr PARAMETRS[27];
Теперь ее надо проинициализировать, делаю так
char const __flash S0[]= {"Вр ЦИКЛА "};

struct Parametr PARAMETRS[]=
{
{S[0],0,0,1}
};
компилятор ругается на последние два поля, что понятно, но к сожалению я не понимаю как правильно проинициализировать поля adr и scale_factor. Чтение документации пока ничего не прояснило, как правильно надо делать? Или я хочу странного? (IAR AVR 5.12)


--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Непомнящий Евген...
сообщение Aug 4 2008, 04:05
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(Stanislav_S @ Aug 1 2008, 21:11) *
struct Parametr
{
__flash char const *str;
unsigned char parametr;
__flash unsigned char *adr;
__flash unsigned int *scale_factor;

};
struct Parametr PARAMETRS[]=
{
{S[0],0,0,1}
};


А кстати, вы точно уверены, что два последних члена именно указатели? Получается, что вы руками засовываете значения во флеш, а потом обращаетесь к ним по фиксированным адресам?

И кстати, приведение скорее всего надо делать не просто к (unsigned char *), а к ( __flash unsigned char *) - в ИАР это разные типы.
Go to the top of the page
 
+Quote Post
Stanislav_S
сообщение Aug 4 2008, 08:29
Сообщение #3


извечный пессимист
*****

Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125



Цитата(Непомнящий Евгений @ Aug 4 2008, 09:05) *
А кстати, вы точно уверены, что два последних члена именно указатели? Получается, что вы руками засовываете значения во флеш, а потом обращаетесь к ним по фиксированным адресам?

И кстати, приведение скорее всего надо делать не просто к (unsigned char *), а к ( __flash unsigned char *) - в ИАР это разные типы.

Пока вышел из ситуции вот так:
__flash unsigned int KF[]=
{
30
};

__flash unsigned char ADR[]=
{
0
};

struct Parametr PARAMETRS[]=
{
{S0,0,&ADR[0],&KF[0]}
};


--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 4 2008, 13:35
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Stanislav_S @ Aug 4 2008, 11:29) *
Пока вышел из ситуции вот так:
Я бы не назвал это "выходом". Если отбросить совершенно лишние массивы, то это наиболее правильное и прямое решение исходя из начального описания структуры Parameter. Не могли бы вы словами описать, что вы хотели разместить в этой струтктуре? Компилятор совершенно правильно в вашем первом сообщении ругался на последние два поля, ибо вы описали их как указатели, а инициализировать пытались целым числом. И соответственно в последнем посте вы инициализируете эти поля указателями на соответствующие данные. Рискну телепатически предположить, что вы хотели сделать примерно так:
Код
typedef struct
{
    char const __flash *str;
    unsigned char parametr;
    unsigned char adr;
    unsigned int  scale_factor;
} Parametr;

char const __flash S0[] = "Вр ЦИКЛА ";
char const __flash S1[] = "Что-то еще ";

Parametr __flash PARAMETRS[27] =
{
   { S0, 0, 0, 1},
   { S1, 1, 2, 3},
   .......

};


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Stanislav_S
сообщение Aug 5 2008, 14:24
Сообщение #5


извечный пессимист
*****

Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125



Цитата(Сергей Борщ @ Aug 4 2008, 18:35) *
Я бы не назвал это "выходом". Если отбросить совершенно лишние массивы, то это наиболее правильное и прямое решение исходя из начального описания структуры Parameter. Не могли бы вы словами описать, что вы хотели разместить в этой струтктуре? Компилятор совершенно правильно в вашем первом сообщении ругался на последние два поля, ибо вы описали их как указатели, а инициализировать пытались целым числом. И соответственно в последнем посте вы инициализируете эти поля указателями на соответствующие данные. Рискну телепатически предположить, что вы хотели сделать примерно так:
Код
typedef struct
{
    char const __flash *str;
    unsigned char parametr;
    unsigned char adr;
    unsigned int  scale_factor;
} Parametr;

char const __flash S0[] = "Вр ЦИКЛА ";
char const __flash S1[] = "Что-то еще ";

Parametr __flash PARAMETRS[27] =
{
   { S0, 0, 0, 1},
   { S1, 1, 2, 3},
   .......

};

Хотелось примерно следующиее
struct Parametr
{
__flash unsigned char *str; // Указатель на строку во флэш
unsigned char parametr; // Сам параметр, поскольку в процесе работы меняется то хранится в ОЗУ
__flash unsigned char *adr; // Адрес параметра во внешнем ЕЕПРОМ - констаната во флэш
__flash unsigned int *scale_factor; // Коэфициент пропорциональности для параметра хранится во флэш
};


--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 5 2008, 14:38
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Stanislav_S @ Aug 5 2008, 17:24) *
Хотелось примерно следующиее
Ага, ну теперь все стало понятнее. Тогда вам просто надо убрать ненужные массивы:
Код
typedef struct
{
    char const __flash *str;
    unsigned char parametr;
    unsigned char const __flash adr;
    unsigned int  const __flash scale_factor;
} Parametr;

char const __flash S0[] = "Вр ЦИКЛА ";
unsigned char const __flash ADR1 = 0;
int const __flash KF1 = 1;

char const __flash S1[] = "Что-то еще ";
unsigned char const __flash ADR2 = 2;
int const __flash KF2 = 3;

Parametr PARAMETRS[27] =
{
   { S0, 0, &ADR1, &KF1},
   { S1, 1, &ADR2, &KF2},
   .......

};
И все же не совсем понятна эта структура. У вас, скажем, для PARAMETERS[0], в процессе работы scale_factor может указывать то на одну, то на другую константу? Ведь все эти указатели занимают место в ОЗУ. Может всю структуру хранить во флеш, а для parameter завести отдельный массив в ОЗУ?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Stanislav_S
сообщение Aug 5 2008, 15:19
Сообщение #7


извечный пессимист
*****

Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125



Цитата(Сергей Борщ @ Aug 5 2008, 19:38) *
Ага, ну теперь все стало понятнее. Тогда вам просто надо убрать ненужные массивы:
Код
typedef struct
{
    char const __flash *str;
    unsigned char parametr;
    unsigned char const __flash adr;
    unsigned int  const __flash scale_factor;
} Parametr;

char const __flash S0[] = "Вр ЦИКЛА ";
unsigned char const __flash ADR1 = 0;
int const __flash KF1 = 1;

char const __flash S1[] = "Что-то еще ";
unsigned char const __flash ADR2 = 2;
int const __flash KF2 = 3;

Parametr PARAMETRS[27] =
{
   { S0, 0, &ADR1, &KF1},
   { S1, 1, &ADR2, &KF2},
   .......

};
И все же не совсем понятна эта структура. У вас, скажем, для PARAMETERS[0], в процессе работы scale_factor может указывать то на одну, то на другую константу? Ведь все эти указатели занимают место в ОЗУ. Может всю структуру хранить во флеш, а для parameter завести отдельный массив в ОЗУ?

Вы знали smile.gif Идея была в следующем, есть определенный параметр, с ним связаны определенный адрес, определенная строка и коэфициент, поскольку они константы то в ОЗУ их хранить нет смысла, то пусть они лежат во флэш, фактически хотелось иметь одну структуру часть которой находится во флэш, а часть в ОЗУ, массивы были заведены - потому что меньше писанины, чем выше указанный вами способ. Естественно так не получится, а в ОЗУ будет храниться вся структура (вернее указатели), так что зкономии ОЗУ не будет, это я только недавно понял smile.gif, действительно как вы правильно сказали прийдется делать массив в ОЗУ для параметров, в структуре хранить индекс на нужный параметр. В общем Спасибо! Теперь все стало на свои места.


--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 6 2008, 04:10
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(Stanislav_S @ Aug 5 2008, 19:19) *
Идея была в следующем, есть определенный параметр, с ним связаны определенный адрес, определенная строка и коэфициент, поскольку они константы то в ОЗУ их хранить нет смысла...


Ну и юзайте что-то такое:
Код
typedef struct
{  
  char const __flash *str;
  unsigned char adr;
  unsigned int  scale_factor;  
} ParametrFlash;

typedef struct
{
  unsigned char parametr;
  ParametrFlash const __flash *pFlash;
} Parametr;

char  __flash Param1S[] = "param1";
ParametrFlash __flash Param1Fl = {Param1S, 10, 20};
Parametr Param1 = {30, &Param1Fl};


Если строки примерно одинакового размера, то можно еще удобнее:
Код
typedef struct
{  
  char str[20];
  unsigned char adr;
  unsigned int  scale_factor;  
} ParametrFlash;

typedef struct
{
  unsigned char parametr;
  ParametrFlash const __flash *pFlash;
} Parametr;

ParametrFlash __flash Param1Fl = {"param1", 10, 20};
Parametr Param1 = {30, &Param1Fl};


И кстати еще к вам вопрос - сами параметры (parametr) могут меняться? Если не могут, то объедините обе структуры в одну и храните ее во флеше. Инициализация будет удобней.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Stanislav_S   Инициализация структуры во флэши.   Aug 1 2008, 17:11
- - rezident   Явное приведение типа используйте. Типа unsigned i...   Aug 1 2008, 17:21
|- - Stanislav_S   Цитата(rezident @ Aug 1 2008, 22:21) Явно...   Aug 1 2008, 17:32
|- - rezident   Цитата(Stanislav_S @ Aug 1 2008, 23:32) а...   Aug 1 2008, 17:41
|- - Stanislav_S   Цитата(Непомнящий Евгений @ Aug 6 2008, 09...   Aug 6 2008, 07:44
|- - Alex_1811   Подскажите как передать функции указатель на струк...   May 25 2011, 10:52
|- - Палыч   Использовать спецификатор __flash   May 25 2011, 10:59
|- - Alex_1811   Цитата(Палыч @ May 25 2011, 13:59) Исполь...   May 25 2011, 11:03
|- - Палыч   Ругается он по другой причине. Вот так - не ругает...   May 25 2011, 11:09
|- - Alex_1811   Цитата(Палыч @ May 25 2011, 14:09) Вот та...   May 25 2011, 11:17
- - _Pasha   Цитата(Stanislav_S @ Aug 4 2008, 11:29) П...   Aug 4 2008, 13:39


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

 


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


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