Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: возможна ли инициализация во флэш...
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Faradey
сейчас делаю так:

Код
typedef struct nod{
  char count;
  struct nod __farflash*  prev_nod;
  struct nod __farflash** pod_nods;
}NOD;
#define NOD_F    NOD __farflash
#define pNOD_F   NOD_F*
#define ppNOD_F  struct pNOD_F*

pNOD_F   any_nods[2];        
NOD_F    root_nod = {2, any_nods , 0};

NOD_F    nod1 = {0,0, &root_nod};
NOD_F    nod2 = {0,0, &root_nod};


и вызываю ф-цию инициализации:

Код
void init_nod( void )
{
    any_nods[0] = &nod1;        
    any_nods[1] = &nod2;        
}


вопрос в след.: существует ли возможность разместить any_nods тоже во flash,
и обойтись без вызова ф-ции инициализации.
arttab
Если объявить как константу. Если Вы захотите ее изменить, то нужно это сделать через самопрограммирование.
Непомнящий Евгений
__farflash NOD * any_nods[] = {&nod1, &nod2}
Faradey
Цитата(Непомнящий Евгений @ Aug 13 2007, 07:43) *
__farflash NOD * any_nods[] = {&nod1, &nod2}


в том то и дело, что
NOD_F nod1 = {0,0, &root_nod};
NOD_F nod2 = {0,0, &root_nod};

объявляются ниже чем any_nods...

Цитата
Если объявить как константу....


по существу здесь все константы и менять их мне ненадо, просто для того чтобы инициализировать
any_nods как предлагает 'Непомнящий Евгений' необходимо чтобы выше были инициализированы nod1 и nod2, но для того чтобы их инициализировать нужно чтобы перед ними был иниц.
Код
NOD_F    root_nod = {2, any_nods , 0};

... короче замкнутый круг.
GetSmart
Можно применить предворительное указание типа переменной без её инициализации так:
Код
extern NOD_F nod1
Даже если переменная в других модулях не используется. Я так иногда делаю в хидерах. А уже потом в любом месте файла ниже присвоить ей константное значение.
Faradey
Цитата(GetSmart @ Aug 13 2007, 12:31) *
Можно применить предворительное указание типа переменной без её инициализации так:
Код
extern NOD_F nod1
Даже если переменная в других модулях не используется. Я так иногда делаю в хидерах. А уже потом в любом месте файла ниже присвоить ей константное значение.


вот, млин. оказалось очевидно:

Код
typedef struct nod{
  char count;
  struct nod __farflash*  prev_nod;
  struct nod __farflash*__farflash* pod_nods;
}NOD;
#define NOD_F    NOD __farflash
#define pNOD_F   NOD_F*

NOD_F    nod1;
NOD_F    nod2;

__farflash pNOD_F   any_nods[] = {&nod1,&nod2};        
NOD_F    root_nod = {2, any_nods , 0};

NOD_F    nod1 = {0,0, &root_nod};
NOD_F    nod2 = {0,0, &root_nod};


спасибо.
Непомнящий Евгений
По идее, в вашем коде три ошибки (по крайней мере на IAR 4.20).
А вот так компилируется:

Код
typedef struct nod{
  char count;
  struct nod __farflash*  prev_nod;
  struct nod __farflash*__farflash* pod_nods;
}NOD;
#define NOD_F    NOD __farflash
#define pNOD_F   NOD_F*

extern NOD_F nod1;
extern NOD_F nod2;

__farflash pNOD_F   any_nods[] = {&nod1,&nod2};        
NOD_F    root_nod = {2, 0, any_nods };

NOD_F    nod1 = {0, &root_nod, 0};
NOD_F    nod2 = {0, &root_nod, 0};
Faradey
Цитата(Непомнящий Евгений @ Aug 15 2007, 08:54) *
По идее, в вашем коде три ошибки (по крайней мере на IAR 4.20).
А вот так компилируется:

Код
typedef struct nod{
  char count;
  struct nod __farflash*  prev_nod;
  struct nod __farflash*__farflash* pod_nods;
}NOD;
#define NOD_F    NOD __farflash
#define pNOD_F   NOD_F*

extern NOD_F nod1;
extern NOD_F nod2;

__farflash pNOD_F   any_nods[] = {&nod1,&nod2};        
NOD_F    root_nod = {2, 0, any_nods };

NOD_F    nod1 = {0, &root_nod, 0};
NOD_F    nod2 = {0, &root_nod, 0};


весьма признателен, тут невнимательно написал, НО "extern" всетаки считаю лишним...
Непомнящий Евгений
Цитата(Faradey @ Aug 17 2007, 01:38) *
весьма признателен, тут невнимательно написал, НО "extern" всетаки считаю лишним...


Да как же лишним?! Если без extern, то мы имеем два определения одной и той же переменной в ОДНОЙ единице трансляции.
что-то типа:
int a, b;
<какой-то код>
int a=10, b=20;
А это неправильно!
И IAR и Visual studio в этом случае выдают ошибку redefenition
Faradey
Цитата(Непомнящий Евгений @ Aug 17 2007, 07:55) *
Да как же лишним?! Если без extern, то мы имеем два определения одной и той же переменной в ОДНОЙ единице трансляции.
что-то типа:
int a, b;
<какой-то код>
int a=10, b=20;
А это неправильно!
И IAR и Visual studio в этом случае выдают ошибку redefenition


Не надо так смело ссылаться на IAR. уж он так точно никакой ошибки не выдаст, если не написать спецификатор "extern" в моем примере.

предлагаю не спорить, а самому проверить...
Непомнящий Евгений
Цитата(Faradey @ Aug 19 2007, 23:03) *
Не надо так смело ссылаться на IAR. уж он так точно никакой ошибки не выдаст, если не написать спецификатор "extern" в моем примере.

предлагаю не спорить, а самому проверить...


Сорри, первоначально компилил как C++ - при этом выдает ошибку
[Pe247] variable 'nod1' has already been defined

Если скомпилить как C - ошибки нет.
Хотя, ИМХО, без extern-а все равно как-то криво...
Serguey_A
Цитата(arttab @ Aug 13 2007, 05:12) *
Если объявить как константу. Если Вы захотите ее изменить, то нужно это сделать через самопрограммирование.

А что можно почитать про самопрограммирование
arttab
можно. поиск на сайте, в книгах по AVR и доках Вам помогут.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.