Здравствуйте, анонфорумчане! Есть один микроконтроллер на ATmega328, в него запихнуто 3 огромных массива. SRAM памяти естественно не хватает, потому пользовался макросом PROGMEM. Проблема в чём: в памяти эти массивы хранятся, всё нормально. Если обращаюсь в коде к одному массиву - тоже, полёт нормальный. Как только обращаюсь к двум, а то и к трём массивам - память категорически заканчивается.Не совсем понимаю как вообще Flash память работает. Всё уже записано на постоянную память, но при обращении к элементам они копируются что ли? Надо чтоб во время работы программы можно было выбирать из трёх массивов только один, но при выборе проверками все три лезут в оперативку. Помогите, подскажите что делать, пожалуйста. С меня не как обычно большое спасибо
Это больше под /ra/ подойдет, мне кажется, тут скорее-всего ничего не ответят
>>1031886Я подумал может в языке С как - нибудь решение можно найти. Микроконтроллеры такое - то ли в программировании беда, то ли в железе. По совету обращусь в /ra/.
>3 огромных массива.>Если обращаюсь в коде к одному массивуТо компилятор выкидывает не использующиеся переменные.>PROGMEMБез понятия что это такое. Для того чтобы компилятор разместил что-то в ПЗУ, нужно это что-то объявить как const, и в скрипте линкера соответствующим образом определить секцию с константами (для gcc это .rodata).
>>1032256>То компилятор выкидывает не использующиеся переменные.Вразумил, спасибо>Без понятияТут как раз обязательно константой, да ещё статично, и объявляется переменная. PROGMEM говорит что нужно хранить её во флеше, а не в SRAM.Большое спасибо
>>1031863 (OP)Онан, а зачем тебе три больших константных массива? Хитрой формулой не удается обойти их?
Может немного кода в студию! Как объявляешь? Как используешь?
>>1034745Хитрой формулой ой как нехорошо получится. Пытаюсь подобие музыкального инструмента сделать - синтезатор. Потому нужны основные виды волн генерировать. Тот же синус вычислять для МК накладно, затратно. Из всех основных видов волн только меандр генерирую, остальное так и не придумал как реализовать. И проблема не в том что я не знаю алгоритмов генерирования, проблема в том что я не знаю как сделать так, чтобы частота при этом всегда нужной была. Вообще есть два варианта: иметь большие массивы и за одно и то же время проигрывать волны разных частот или иметь маленькие массивы и проигрывать волны одной частоты за разное время. По крайней мере обдумывая второй вариант ничего путного не придумал.
>>1035333PROGMEM static const byte sine [16384] = {...};Вот так объявляюИспользую - читаю массив, отправляю значения в ЦАП, перед этим проделав несколько операции синтезирования.
Объявлять нужно так (обязательно в области глобальных переменных, а не внутри функции):static const PROGMEM int8_t sine[16384] = { ... }Читать специальными функциями вида:pgm_read_byte(&sine)
>>1052459>pgm_read_byte(&sine[])
>>1052459Волшебное PROGMEM в данном случае без разницы где писать. int8_t - интеджер, которому выделено 8 бит информации = байт. Ардуина понимает что такое byte.
>>1052459>pgm_read_byte(&sine)Это почти наверняка макрос, а не функция.>>1055931За волшебным макросом PROGMEM должно скрываться что-то вроде __attribute__(section("название секции"))>Ардуина понимаетavr-gcc, а не ардуина.