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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Инициализация структуры во флэши.
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
rezident
сообщение Aug 1 2008, 17:21
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Явное приведение типа используйте. Типа
unsigned int *ptr;
ptr=(unsigned int *)0x1000;
Кстати в параметрах инициализации похоже еще ошибка
{S[0],
А надо видимо
{&S0[0],
Go to the top of the page
 
+Quote Post
Stanislav_S
сообщение Aug 1 2008, 17:32
Сообщение #3


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

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



Цитата(rezident @ Aug 1 2008, 22:21) *
Явное приведение типа используйте. Типа
unsigned int *ptr;
ptr=(unsigned int *)0x1000;
Кстати в параметрах инициализации похоже еще ошибка
{S[0],
А надо видимо
{&S0[0],

Ссори конечно я тут не правильно написвл, надо так
struct Parametr PARAMETRS[]=
{
{S0,0,0,1}
};
а насчет приведения я не очень вьехал, поясните на примере если нетрудно.


--------------------
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
rezident
сообщение Aug 1 2008, 17:41
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Stanislav_S @ Aug 1 2008, 23:32) *
а насчет приведения я не очень вьехал, поясните на примере если нетрудно.
Я вам привел пример. В круглых скобках явно указывается тип к которому вы приводите переменную, константу или указатель.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 4 2008, 04:05
Сообщение #5


Знающий
****

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


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

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


Гуру
******

Группа: Модераторы
Сообщений: 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
_Pasha
сообщение Aug 4 2008, 13:39
Сообщение #8


;
******

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



Цитата(Stanislav_S @ Aug 4 2008, 11:29) *
Пока вышел из ситуции вот так:

Это называется не вышли из ситуации, а исправили ошибку. Извиняюсь за занудство, но другого варианта инициализации указателя, хранящегося во флеше, кроме как указанием адреса уже описанного статического объекта, просто нет.
Go to the top of the page
 
+Quote Post
Stanislav_S
сообщение Aug 5 2008, 14:24
Сообщение #9


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

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


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #11


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

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


Знающий
****

Группа: Свой
Сообщений: 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 6 2008, 07:44
Сообщение #13


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

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



Цитата(Непомнящий Евгений @ Aug 6 2008, 09:10) *
Ну и юзайте что-то такое:
Код
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) могут меняться? Если не могут, то объедините обе структуры в одну и храните ее во флеше. Инициализация будет удобней.

Нет параметры меняются во время работы, если бы не менялись, то и вопросов бы не было, строки к сожалению не имеют фиксированого размера.


--------------------
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
Alex_1811
сообщение May 25 2011, 10:52
Сообщение #14


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

Группа: Участник
Сообщений: 178
Регистрация: 31-10-06
Из: Яблунець
Пользователь №: 21 821



Подскажите как передать функции указатель на структуру которая находится во флеш.
На такое компилятор IAR AVR ругается "Error[Pe171]: invalid type conversion"

Код
typedef  struct  _BUTTON
{
    int  hdr;        
    int  radius;    
    int  textWidth;
}BUTTON;


BUTTON btn;

//=============================================
void Draw(BUTTON *bt)
{
int A, B;
  
  A = bt->hdr;
  B = bt->radius;

}

//=============================================
int main( void )
{
Draw((BUTTON*) btn); // ТУТ МАТЮКАЕТСЯ
}
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 25 2011, 10:59
Сообщение #15


Гуру
******

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



Использовать спецификатор __flash
Go to the top of the page
 
+Quote Post

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

 


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


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