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

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

Reply to
Dmitry Gromov
Loading thread data ...

Всем привет!

Dmitry Gromov писал к All 16.12.2004:

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

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

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

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

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

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

Reply to
Askold Volkov

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

Reply to
Dmitry Gromov
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. С уважением, Владимир Опарко.

Reply to
invalid unparseable

Доброго здоровья, Владимир!

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

Reply to
Sergei Tuchinski

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

Reply to
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> байт, начинаются чудеса.

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

Reply to
Kirill Frolov
16 дек 04 17:25, Dmitry Gromov -> All:

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

Reply to
Arthur Teryoshkin

Привет Владимир!

Пят Дек 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. ... Жизнь - игра. Задуманна хреново, но графика обалденная!

Reply to
Anton Abrosimov

Всем привет!

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

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

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

Reply to
Askold Volkov

Всем привет!

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

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

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

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

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

Reply to
Askold Volkov

Hello, Kirill! You wrote to Dmitry Gromov on Sat, 18 Dec 2004 04:18:39 +0500:

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

KF> 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

Reply to
Dmitry Gromov

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

Reply to
Dmitry Gromov

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

Reply to
Dmitry Gromov

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

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

Reply to
Kirill Frolov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.