Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Инициализация структуры во флэши.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Stanislav_S
Ссори если глупый вопрос, но голова что то совсем нихрена не работает. Имеем такую структуру:
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)
rezident
Явное приведение типа используйте. Типа
unsigned int *ptr;
ptr=(unsigned int *)0x1000;
Кстати в параметрах инициализации похоже еще ошибка
{S[0],
А надо видимо
{&S0[0],
Stanislav_S
Цитата(rezident @ Aug 1 2008, 22:21) *
Явное приведение типа используйте. Типа
unsigned int *ptr;
ptr=(unsigned int *)0x1000;
Кстати в параметрах инициализации похоже еще ошибка
{S[0],
А надо видимо
{&S0[0],

Ссори конечно я тут не правильно написвл, надо так
struct Parametr PARAMETRS[]=
{
{S0,0,0,1}
};
а насчет приведения я не очень вьехал, поясните на примере если нетрудно.
rezident
Цитата(Stanislav_S @ Aug 1 2008, 23:32) *
а насчет приведения я не очень вьехал, поясните на примере если нетрудно.
Я вам привел пример. В круглых скобках явно указывается тип к которому вы приводите переменную, константу или указатель.
Непомнящий Евгений
Цитата(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 *) - в ИАР это разные типы.
Stanislav_S
Цитата(Непомнящий Евгений @ 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]}
};
Сергей Борщ
Цитата(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},
   .......

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

Это называется не вышли из ситуации, а исправили ошибку. Извиняюсь за занудство, но другого варианта инициализации указателя, хранящегося во флеше, кроме как указанием адреса уже описанного статического объекта, просто нет.
Stanislav_S
Цитата(Сергей Борщ @ 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; // Коэфициент пропорциональности для параметра хранится во флэш
};
Сергей Борщ
Цитата(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 завести отдельный массив в ОЗУ?
Stanislav_S
Цитата(Сергей Борщ @ 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, действительно как вы правильно сказали прийдется делать массив в ОЗУ для параметров, в структуре хранить индекс на нужный параметр. В общем Спасибо! Теперь все стало на свои места.
Непомнящий Евгений
Цитата(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 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) могут меняться? Если не могут, то объедините обе структуры в одну и храните ее во флеше. Инициализация будет удобней.

Нет параметры меняются во время работы, если бы не менялись, то и вопросов бы не было, строки к сожалению не имеют фиксированого размера.
Alex_1811
Подскажите как передать функции указатель на структуру которая находится во флеш.
На такое компилятор 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); // ТУТ МАТЮКАЕТСЯ
}
Палыч
Использовать спецификатор __flash
Alex_1811
Цитата(Палыч @ May 25 2011, 13:59) *
Использовать спецификатор __flash

Компилятор и без __flash также ругается.
Палыч
Ругается он по другой причине. Вот так - не ругается
Код
BUTTON __flash btn;

//=============================================
void Draw(BUTTON __flash * bt)
{
...
}

//=============================================
int main( void )
{
Draw( &btn );
}

Alex_1811
Цитата(Палыч @ May 25 2011, 14:09) *
Вот так - не ругается


Спасибо. С меня бидон виртуального пива!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.