|
Инициализация структуры во флэши. |
|
|
|
 |
Ответов
|
Aug 4 2008, 04:05
|
Знающий
   
Группа: Свой
Сообщений: 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 *) - в ИАР это разные типы.
|
|
|
|
|
Aug 4 2008, 08:29
|

извечный пессимист
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 4 2008, 13:35
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Aug 5 2008, 14:24
|

извечный пессимист
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 5 2008, 14:38
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Aug 5 2008, 15:19
|

извечный пессимист
    
Группа: Свой
Сообщений: 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 завести отдельный массив в ОЗУ? Вы знали  Идея была в следующем, есть определенный параметр, с ним связаны определенный адрес, определенная строка и коэфициент, поскольку они константы то в ОЗУ их хранить нет смысла, то пусть они лежат во флэш, фактически хотелось иметь одну структуру часть которой находится во флэш, а часть в ОЗУ, массивы были заведены - потому что меньше писанины, чем выше указанный вами способ. Естественно так не получится, а в ОЗУ будет храниться вся структура (вернее указатели), так что зкономии ОЗУ не будет, это я только недавно понял  , действительно как вы правильно сказали прийдется делать массив в ОЗУ для параметров, в структуре хранить индекс на нужный параметр. В общем Спасибо! Теперь все стало на свои места.
--------------------
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
|
|
|
|
|
Aug 6 2008, 04:10
|
Знающий
   
Группа: Свой
Сообщений: 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) могут меняться? Если не могут, то объедините обе структуры в одну и храните ее во флеше. Инициализация будет удобней.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|