IAR 3.20C и огромный массив в eeprom

Do you have a question? Post it now! No Registration Necessary

Threaded View
Hello, All!
    Hе подскажет ли многоуважаемая публика как создать массив из 50 даблов в
eeprom? Компилятор сабжевый. Камень - Мега32. Инициализация массива - при
прошивке камня.
    Почему у меня возник такой вопрос. Проиллюстрирую кусочком кода:

    __eeprom double string[50]={1,1,1,1 .... 50 штук };
    void main(void)
    {
     double f;
     f=string[0];
    .
    .
    .
    }
    После выполнения этого кусочка в переменной f находится не 1, а какая-то
чача. Если массив string сделать размером в 31 double, то все просто
замечательно. Мало того, можно заполнить всю eeprom такими массивами, тут
проблем нет. Примечательно то, что как только размер массива превышает 256
байт, начинаются чудеса.
    Hапоследок замечу, что дебажу программу AVR студией. Сначала мыслишка
закралась, что может быть дело в студии, но похоже это не так. В железе
творится то же самое.
    Может кто-нибудь подскажет, где чего надо подкрутить, или это вообще не
лечится?


With best regards, Dmitry Gromov.  E-mail: snipped-for-privacy@deletethis.newmail.ru



IAR 3.20C и огромный массив в eeprom
    Всем привет!

Dmitry Gromov писал к All 16.12.2004:

 DG>     Hе подскажет ли многоуважаемая публика как создать массив из 50
 DG> даблов в eeprom? Компилятор сабжевый. Камень - Мега32. Инициализация
 DG> массива - при прошивке камня.

Да просто берешь и создаешь. Никаких проблем не замечаю.

 DG>     Почему у меня возник такой вопрос. Проиллюстрирую кусочком кода:

Проверил - все работает.

 DG>     Hапоследок замечу, что дебажу программу AVR студией. Сначала
 DG> мыслишка закралась, что может быть дело в студии, но похоже это не так.
 DG> В железе творится то же самое.

может в консерватории чего подправить?

--
Аскольд Волков, Новосибирск. http://www.inp.nsk.su/~volkov/


Re: IAR 3.20C и огромный массив в eeprom
Hello, Askold!
You wrote to Dmitry Gromov on Fri, 17 Dec 2004 07:03:43 +0500:



 DG>>     Почему у меня возник такой вопрос. Проиллюстрирую кусочком кода:

 AV> Проверил - все работает.

А смотрел чем? С-спаем?

 DG>>     Hапоследок замечу, что дебажу программу AVR студией. Сначала
 DG>> мыслишка закралась, что может быть дело в студии, но похоже это не
 DG>> так. В железе творится то же самое.

 AV> может в консерватории чего подправить?

Все может быть. Я камень тоже студией прошиваю, причем использую eeprom и
flash из симулятора.
Может действительно студия вредит...

With best regards, Dmitry Gromov.  E-mail: snipped-for-privacy@deletethis.newmail.ru



Re: IAR 3.20C и огромный массив в eeprom
    Всем привет!

Dmitry Gromov писал к Askold Volkov Fri, 17 Dec 2004 12:01:18 +0300:

 DG> А смотрел чем? С-спаем?

Да, + в hex файле наблюдал, что все на месте.

--
Аскольд Волков, Новосибирск. http://www.inp.nsk.su/~volkov/



Re: IAR 3.20C и огромный массив в eeprom
Hello, Владимир!
You wrote to Dmitry Gromov on Fri, 17 Dec 2004 12:25:06 +0500:


 В оригинале было так:

   __eeprom double string[50]={1,1,1,1 ....  50 штук };
 void main(void)
   {
   double f;
  f=string[0];
.
.
.
}

То есть то, что я написал это далеко не вся программа.


 ВО>  Hе уверен, что это будет работать. Массив в
 ВО> EEPROM ты можешь проинициализировать как угодно,
 ВО> хоть char, int, double и т.д., но когда будешь
 ВО> читать ничего хорошего у меня, например, не
 ВО> получалось. Более того при компиляции ты должен
 ВО> получить предупреждение о том, что не
 ВО> испорользуется переменная f (!!!).

Там дальше в программе, переменная f используется.
Смею тебя заверить, что такой способ чтения данных из eeprom вполне
корректен и адекватно воспринимается компилятором. В первом своем письме я
упомянул, что пока размер массива не превышает 256 байт (пусть например,
будет декларирован не string[50], а string[30]) все работает замечательно. И
в дебаггере и в железе.
Массив как надо инициализируется, и данные из eeprom читаются какие надо.
И это, я считаю, чертовски удобная штука, когда с различными типами памяти
можно обращаться совершенно одинаково.




With best regards, Dmitry Gromov.  E-mail: snipped-for-privacy@deletethis.newmail.ru



Re: IAR 3.20C и огромный массив в eeprom
Hello, Kirill!
You wrote to Dmitry Gromov on Sat, 18 Dec 2004 04:18:39 +0500:

 KF> Hемедленно нажми на RESET, Dmitry Gromov!

 KF> On Thu, 16 Dec 04 17:25:23 +0300, Dmitry Gromov wrote:

 DG>>     __eeprom double string[50]={1,1,1,1 .... 50 штук };
 DG>>     После выполнения этого кусочка в переменной f находится не 1, а
 DG>>     какая-то
 DG>> чача. Если массив string сделать размером в 31 double, то все просто
 DG>> замечательно. Мало того, можно заполнить всю eeprom такими массивами,
 DG>> тут проблем нет. Примечательно то, что как только размер массива
 DG>> превышает 256 байт, начинаются чудеса.

 KF>    Листинг ассемблерного текста покажет всё.

Дело в том, что массив создается не в рантайме. Он создается при компиляции
и созданию и заполнению этого массива не соответсвует никакой исполняемый
ассемблерный код.


With best regards, Dmitry Gromov.  E-mail: snipped-for-privacy@deletethis.newmail.ru



Re: IAR 3.20C и огромный массив в eeprom
Hемедленно нажми на RESET, Dmitry Gromov!


 KF>>    Листинг ассемблерного текста покажет всё.
 DG> Дело в том, что массив создается не в рантайме. Он создается при
 DG> компиляции
 DG> и созданию и заполнению этого массива не соответсвует никакой исполняемый
 DG> ассемблерный код.

  И что с того, db byte, byte, byte -- где?  Кроме того, есть ещё
читающий этот массив исполняемый код.


Re: IAR 3.20C и огромный массив в eeprom
Hello, Askold!
You wrote to Dmitry Gromov on Sat, 18 Dec 2004 14:22:37 +0500:

 AV>     Всем привет!

 AV> Dmitry Gromov писал к Askold Volkov Fri, 17 Dec 2004 12:01:18 +0300:

 DG>> А смотрел чем? С-спаем?

 AV> Да, + в hex файле наблюдал, что все на месте.

Ех-ма. Сгенерил hex, проверил, все действительно на месте....
Hе иначе, как студия глючит...


With best regards, Dmitry Gromov.  E-mail: snipped-for-privacy@deletethis.newmail.ru



Re: IAR 3.20C и огромный массив в eeprom
0
Dmitry Gromov пишет:
DG> Hello, All!
DG>    Hе подскажет ли многоуважаемая публика как
создать массив из 50 даблов в
DG> eeprom? Компилятор сабжевый. Камень - Мега32.
Инициализация массива - при
DG> прошивке камня.
DG>    Почему у меня возник такой вопрос.
Проиллюстрирую кусочком кода:

DG>    __eeprom double string[50]={1,1,1,1 ....
50 штук };
DG>    void main(void)
DG>    {
DG>     double f;
DG>     f=string[0];  // !!!!!

 Не уверен, что это будет работать. Массив в
EEPROM ты можешь проинициализировать как угодно,
хоть char, int, double и т.д., но когда будешь
читать ничего хорошего у меня, например, не
получалось. Более того при компиляции ты должен
получить предупреждение о том, что не
испорользуется переменная f (!!!). Это означает,
что чтение подобным образом НЕ РАБОТАЕТ, по
крайней мере в 3.20С. Гарантировано работет способ
чтение/записи char массива c использованием
стандартных _EEGET/_EEPUT. Затем программно
склеиваешь из прочитанных char то, что тебе нужно.
При записи - обратные действия.
Может быть предлагаемы вариант и не красив, зато
работоспособен.     

DG>    .
DG>    .
DG>    .
DG>    }
DG>    После выполнения этого кусочка в
переменной f находится не 1, а какая-то
DG> чача. Если массив string сделать размером в 31
double, то все просто
DG> замечательно. Мало того, можно заполнить всю
eeprom такими массивами, тут
DG> проблем нет. Примечательно то, что как только
размер массива превышает 256
DG> байт, начинаются чудеса.
DG>    Hапоследок замечу, что дебажу программу
AVR студией. Сначала мыслишка
DG> закралась, что может быть дело в студии, но
похоже это не так. В железе
DG> творится то же самое.
DG>    Может кто-нибудь подскажет, где чего надо
подкрутить, или это вообще не
DG> лечится?


DG> With best regards, Dmitry Gromov.  E-mail:
snipped-for-privacy@deletethis.newmail.ru



Еще, может быть, имеет смысл посмотреть довольно
старый документ по работе и инициализации EEPROM.
Раньше он был среди pdf-файлов к IAR 1.40.
С уважением, Владимир Опарко.
--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Re: IAR 3.20C и огромный массив в eeprom
    Всем привет!

Владимир Опарко писал к Dmitry Gromov Fri, 17 Dec 2004 09:25:06 +0000 (UTC):

 ВО>  Не уверен, что это будет работать. Массив в
 ВО> EEPROM ты можешь проинициализировать как угодно,
 ВО> хоть char, int, double и т.д., но когда будешь
 ВО> читать ничего хорошего у меня, например, не
 ВО> получалось. Более того при компиляции ты должен
 ВО> получить предупреждение о том, что не
 ВО> испорользуется переменная f (!!!). Это означает,
 ВО> что чтение подобным образом НЕ РАБОТАЕТ, по
 ВО> крайней мере в 3.20С.

Что за бред? Предупреждение это означает ровно то, о чем оно предупреждает -
что данная переменная нигде не используется, соответственно и код этот
бесполезен. Возможно даже, что в этом случае данная переменная не будет
создана за ненадобностью. Но стоит только ее использовать ниже или объявить
volatile, как все будет прекрасно читаться откуда угодно.

 ВО> Может быть предлагаемы вариант и не красив, зато
 ВО> работоспособен.

равно как и любой другой.

--
Аскольд Волков, Новосибирск. http://www.inp.nsk.su/~volkov/



Re: IAR 3.20C и огромный массив в eeprom
       Доброго здоровья, Владимир!

17 Dec 04 12:25, Владимир Опарко написал для Dmitry Gromov:

 DG>> __eeprom double string[50]={1,1,1,1 ....
 ВО> 50 штук };
 DG>> void main(void)
 DG>> {
 DG>>  double f;
 DG>>  f=string[0];  // !!!!!

 ВО>  Hе уверен, что это будет работать. Массив в
 ВО> EEPROM ты можешь проинициализировать как угодно,
 ВО> хоть char, int, double и т.д., но когда будешь
 ВО> читать ничего хорошего у меня, например, не
 ВО> получалось. Более того при компиляции ты должен
 ВО> получить предупреждение о том, что не
 ВО> испорользуется переменная f (!!!). Это означает,
 ВО> что чтение подобным образом HЕ РАБОТАЕТ, по
 ВО> крайней мере в 3.20С. Гарантировано работет способ
 ВО> чтение/записи char массива c использованием
 ВО> стандартных _EEGET/_EEPUT. Затем программно
 ВО> склеиваешь из прочитанных char то, что тебе нужно.
 ВО> При записи - обратные действия.
 ВО> Может быть предлагаемы вариант и не красив, зато
 ВО> работоспособен.

  может быть я чего-то не понимаю, но у меня вышеописанная конструкция
прекрасно работала еще в 2.28, не говоря уже про 3.20. и я не понимаю, какие
здесь могут быть проблемы, за исключением, конечно, того, что надо правильно
прошивать процессор после компиляции (поскольку содержимое EEPROM падает в
отдельный hex-файл)

    WBR, Сергей.                                     ICQ: 101347299


Re: IAR 3.20C и огромный массив в eeprom
Hемедленно нажми на RESET, Dmitry Gromov!


 DG>     __eeprom double string[50]={1,1,1,1 .... 50 штук };
 DG>     После выполнения этого кусочка в переменной f находится не 1, а
 DG>     какая-то
 DG> чача. Если массив string сделать размером в 31 double, то все просто
 DG> замечательно. Мало того, можно заполнить всю eeprom такими массивами, тут
 DG> проблем нет. Примечательно то, что как только размер массива превышает 256
 DG> байт, начинаются чудеса.

   Листинг ассемблерного текста покажет всё.


Re: IAR 3.20C и огромный массив в eeprom
16 дек 04 17:25, Dmitry Gromov -> All:

 DG>     После выполнения этого кусочка в переменной f находится не 1, а
 DG> какая-то чача. Если массив string сделать размером в 31 double, то все
 DG> просто замечательно. Мало того, можно заполнить всю eeprom такими
 DG> массивами, тут проблем нет. Примечательно то, что как только размер
 DG> массива превышает 256 байт, начинаются чудеса.
Возможно для адресации используется tiny-указатель (байтовый). С какой моделью
памяти компилируешь? Если с tiny, попробуй small.


Re: IAR 3.20C и огромный массив в eeprom
Hello, Arthur!
You wrote to Dmitry Gromov on Sat, 18 Dec 2004 07:39:51 +0500:

 AT> 16 дек 04 17:25, Dmitry Gromov -> All:

 DG>>     После выполнения этого кусочка в переменной f находится не 1, а
 DG>> какая-то чача. Если массив string сделать размером в 31 double, то все
 DG>> просто замечательно. Мало того, можно заполнить всю eeprom такими
 DG>> массивами, тут проблем нет. Примечательно то, что как только размер
 DG>> массива превышает 256 байт, начинаются чудеса.
 AT> Возможно для адресации используется tiny-указатель (байтовый). С какой
 AT> моделью памяти компилируешь? Если с tiny, попробуй small.

Кампилирую с моделью памяти small. Hо дело тут не в модели памяти. Размер
указателя на eeprom определяется ключем --eeprom_size. У меня тут все как
надо.
Все ж таки склоняюсь я к мысли, что это авр-студия глючит.

With best regards, Dmitry Gromov.  E-mail: snipped-for-privacy@deletethis.newmail.ru



Re: IAR 3.20C и огромный массив в eeprom
Привет Владимир!

Пят Дек 17 2004 12:25, Владимир Опарко -> Dmitry Gromov:

 DG>> __eeprom double string[50]={1,1,1,1 ....
 ВО> 50 штук };
 DG>> void main(void)
 DG>> {
 DG>>  double f;
 DG>>  f=string[0];  // !!!!!

 ВО>  Hе уверен, что это будет работать. Массив в
Работает.

 ВО> EEPROM ты можешь проинициализировать как угодно,
 ВО> хоть char, int, double и т.д., но когда будешь
 ВО> читать ничего хорошего у меня, например, не
 ВО> получалось. Более того при компиляции ты должен
 ВО> получить предупреждение о том, что не
 ВО> испорользуется переменная f (!!!). Это означает,
 ВО> что чтение подобным образом HЕ РАБОТАЕТ, по
 ВО> крайней мере в 3.20С. Гарантировано работет способ
 ВО> чтение/записи char массива c использованием
 ВО> стандартных _EEGET/_EEPUT. Затем программно
 ВО> склеиваешь из прочитанных char то, что тебе нужно.
 ВО> При записи - обратные действия.
:))) А еще "a/b" писать нельзя, а надо "Div(a,b)".


Hа этом все, пока.
                                                 Anton Abrosimov.
... Жизнь - игра. Задуманна хреново, но графика обалденная!

Site Timeline