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

 
 
 
Reply to this topicStart new topic
> Как задать большой массив в ПЗУ?
хардварщик
сообщение Jul 4 2007, 04:24
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 19-05-07
Пользователь №: 27 824



1. MCU = ATmega128
2. среда программирования = WinAVR
2. большой - это ~90к
3. в Keil это выглядит как "unsigned char code x[y]", есть аналог в WinAVR?
Go to the top of the page
 
+Quote Post
Snaky
сообщение Jul 4 2007, 05:07
Сообщение #2


Mute Beholder
***

Группа: Свой
Сообщений: 260
Регистрация: 4-04-07
Из: Третья планета от Солнца
Пользователь №: 26 754



Цитата(хардварщик @ Jul 4 2007, 10:24) *
1. MCU = ATmega128
2. среда программирования = WinAVR
2. большой - это ~90к
3. в Keil это выглядит как "unsigned char code x[y]", есть аналог в WinAVR?

Читать описание функций объявленных в <avr/pgmspace.h>


--------------------
Common sense is not so common.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jul 4 2007, 05:42
Сообщение #3


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



В добавление к Snaky. Использовать соответствующие атрибуты сегментов при описании данных для флэша. В документации к Winavr это есть (см. FAQ и описание компилятора).


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
aesok
сообщение Jul 4 2007, 06:16
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(хардварщик @ Jul 4 2007, 08:24) *
2. большой - это ~90к


Указатели в avr-gcc 16-битные поэтому будут проблеммы при работе с таким большим объемом данных, зтот масив залезит в верхние 64КВ флеш и нужен 17 битный адрес для работы с таким масивом. Посмотрите здесь о том как их обойти:
http://www.avrfreaks.net/index.php?name=PN...GET_FAR_ADDRESS

Размерность масива не может превышать max( int ), тоесть масив char-ов не может быть больше 32 KB, int-ов - 64 КВ. Вам придеться расположить ваши данные в нескольких массивах.

Анатолий.

Сообщение отредактировал aesok - Jul 4 2007, 06:20
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 4 2007, 21:07
Сообщение #5


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
3. в Keil это выглядит как "unsigned char code x[y]", есть аналог в WinAVR?


#include <avr/pgmspace.h>

const char PROGMEM arr[] =
{
...

};


работать с ним -
pgm_read_byte_near( arr + ... );
pgm_read_word_near( arr + ... );
и т.п.
Go to the top of the page
 
+Quote Post
хардварщик
сообщение Jul 5 2007, 04:44
Сообщение #6





Группа: Новичок
Сообщений: 5
Регистрация: 19-05-07
Пользователь №: 27 824



>Читать описание функций объявленных в <avr/pgmspace.h>
прочитал, работает. Snaky, спасибо.

Но работает как-то странно, похоже далее чем на ~5к в ром не лезет, даже если я разбиваю массив по 4к. Выше - считывает константу.

defunct, возможно, это предложение исправит ситуацию. Еще не пробовал.


mdmitry, aesok, спасибо за дополнения. Не все так просто в си как кажется. Думаю перейти обратно на асм, там вроде таких странных заморочек не было smile.gif


/*30 мин спустя*/
>работать с ним -
>pgm_read_byte_near( arr + ... );
>pgm_read_word_near( arr + ... );
Это важное замечание!!!
Я обращался как обычно к массиву (типа OCR0=arr[]), в результате - заморочки.

ВСЕМ СПАСИБО!!!

Сообщение отредактировал хардварщик - Jul 5 2007, 05:10
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 26th July 2025 - 01:01
Рейтинг@Mail.ru


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