|
Инициализация структуры во флэши. |
|
|
|
Aug 1 2008, 17:32
|

извечный пессимист
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
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) могут меняться? Если не могут, то объедините обе структуры в одну и храните ее во флеше. Инициализация будет удобней.
|
|
|
|
|
Aug 6 2008, 07:44
|

извечный пессимист
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
May 25 2011, 10:52
|

Частый гость
 
Группа: Участник
Сообщений: 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); // ТУТ МАТЮКАЕТСЯ }
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|