Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как задать большой массив в ПЗУ?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
хардварщик
1. MCU = ATmega128
2. среда программирования = WinAVR
2. большой - это ~90к
3. в Keil это выглядит как "unsigned char code x[y]", есть аналог в WinAVR?
Snaky
Цитата(хардварщик @ Jul 4 2007, 10:24) *
1. MCU = ATmega128
2. среда программирования = WinAVR
2. большой - это ~90к
3. в Keil это выглядит как "unsigned char code x[y]", есть аналог в WinAVR?

Читать описание функций объявленных в <avr/pgmspace.h>
mdmitry
В добавление к Snaky. Использовать соответствующие атрибуты сегментов при описании данных для флэша. В документации к Winavr это есть (см. FAQ и описание компилятора).
aesok
Цитата(хардварщик @ 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 КВ. Вам придеться расположить ваши данные в нескольких массивах.

Анатолий.
defunct
Цитата
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 + ... );
и т.п.
хардварщик
>Читать описание функций объявленных в <avr/pgmspace.h>
прочитал, работает. Snaky, спасибо.

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

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


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


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

ВСЕМ СПАСИБО!!!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.