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

 
 
 
Reply to this topicStart new topic
> возможна ли инициализация во флэш...
Faradey
сообщение Aug 12 2007, 20:42
Сообщение #1


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

Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638



сейчас делаю так:

Код
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,
и обойтись без вызова ф-ции инициализации.


--------------------
Завтра пойму, что нужно было сделать вчера...
Go to the top of the page
 
+Quote Post
arttab
сообщение Aug 13 2007, 02:12
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Если объявить как константу. Если Вы захотите ее изменить, то нужно это сделать через самопрограммирование.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 13 2007, 04:43
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



__farflash NOD * any_nods[] = {&nod1, &nod2}
Go to the top of the page
 
+Quote Post
Faradey
сообщение Aug 13 2007, 08:29
Сообщение #4


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

Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638



Цитата(Непомнящий Евгений @ 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};

... короче замкнутый круг.

Сообщение отредактировал Faradey - Aug 13 2007, 08:35


--------------------
Завтра пойму, что нужно было сделать вчера...
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 13 2007, 09:31
Сообщение #5


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Можно применить предворительное указание типа переменной без её инициализации так:
Код
extern NOD_F nod1
Даже если переменная в других модулях не используется. Я так иногда делаю в хидерах. А уже потом в любом месте файла ниже присвоить ей константное значение.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Faradey
сообщение Aug 13 2007, 13:22
Сообщение #6


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

Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638



Цитата(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};


спасибо.


--------------------
Завтра пойму, что нужно было сделать вчера...
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 15 2007, 05:54
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



По идее, в вашем коде три ошибки (по крайней мере на 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};
Go to the top of the page
 
+Quote Post
Faradey
сообщение Aug 16 2007, 21:38
Сообщение #8


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

Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638



Цитата(Непомнящий Евгений @ 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" всетаки считаю лишним...


--------------------
Завтра пойму, что нужно было сделать вчера...
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 17 2007, 04:55
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



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


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

Сообщение отредактировал Непомнящий Евгений - Aug 17 2007, 04:56
Go to the top of the page
 
+Quote Post
Faradey
сообщение Aug 19 2007, 19:03
Сообщение #10


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

Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638



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


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

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


--------------------
Завтра пойму, что нужно было сделать вчера...
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 20 2007, 06:07
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



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

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


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

Если скомпилить как C - ошибки нет.
Хотя, ИМХО, без extern-а все равно как-то криво...
Go to the top of the page
 
+Quote Post
Serguey_A
сообщение Feb 25 2008, 08:16
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 12-09-06
Из: Москва СВАО
Пользователь №: 20 316



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

А что можно почитать про самопрограммирование
Go to the top of the page
 
+Quote Post
arttab
сообщение Feb 26 2008, 02:50
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



можно. поиск на сайте, в книгах по AVR и доках Вам помогут.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 16:12
Рейтинг@Mail.ru


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