Главная Настройка Mobile Контакты NSFW Каталог Пожертвования Купить пасскод Pics Adult Pics API Архив Реквест доски Каталог стикеров Реклама
Доски


[Ответить в тред] Ответить в тред

Check this out!


[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 12 | 1 | 7
Назад Вниз Каталог Обновить

Здравствуйте, анонфорумчане! Есть один микроконтроллер Аноним 26/07/17 Срд 10:56:23  1031863  
atmega328pinout.png (234Кб, 961x680)
Здравствуйте, анонфорумчане! Есть один микроконтроллер на ATmega328, в него запихнуто 3 огромных массива. SRAM памяти естественно не хватает, потому пользовался макросом PROGMEM. Проблема в чём: в памяти эти массивы хранятся, всё нормально. Если обращаюсь в коде к одному массиву - тоже, полёт нормальный. Как только обращаюсь к двум, а то и к трём массивам - память категорически заканчивается.
Не совсем понимаю как вообще Flash память работает. Всё уже записано на постоянную память, но при обращении к элементам они копируются что ли?
Надо чтоб во время работы программы можно было выбирать из трёх массивов только один, но при выборе проверками все три лезут в оперативку. Помогите, подскажите что делать, пожалуйста. С меня не как обычно большое спасибо
Аноним 26/07/17 Срд 11:57:47  1031886
Это больше под /ra/ подойдет, мне кажется, тут скорее-всего ничего не ответят
Аноним 26/07/17 Срд 16:12:40  1032043
>>1031886
Я подумал может в языке С как - нибудь решение можно найти. Микроконтроллеры такое - то ли в программировании беда, то ли в железе. По совету обращусь в /ra/.
Аноним 26/07/17 Срд 21:45:41  1032256
>3 огромных массива.
>Если обращаюсь в коде к одному массиву
То компилятор выкидывает не использующиеся переменные.

>PROGMEM
Без понятия что это такое. Для того чтобы компилятор разместил что-то в ПЗУ, нужно это что-то объявить как const, и в скрипте линкера соответствующим образом определить секцию с константами (для gcc это .rodata).
Аноним 27/07/17 Чтв 07:01:23  1032377
>>1032256
>То компилятор выкидывает не использующиеся переменные.
Вразумил, спасибо
>Без понятия
Тут как раз обязательно константой, да ещё статично, и объявляется переменная. PROGMEM говорит что нужно хранить её во флеше, а не в SRAM.
Большое спасибо
Аноним 31/07/17 Пнд 07:19:30  1034745
>>1031863 (OP)
Онан, а зачем тебе три больших константных массива? Хитрой формулой не удается обойти их?
Аноним 01/08/17 Втр 04:26:44  1035333
Может немного кода в студию! Как объявляешь? Как используешь?
Аноним 07/08/17 Пнд 19:09:14  1040174
>>1034745
Хитрой формулой ой как нехорошо получится. Пытаюсь подобие музыкального инструмента сделать - синтезатор. Потому нужны основные виды волн генерировать. Тот же синус вычислять для МК накладно, затратно. Из всех основных видов волн только меандр генерирую, остальное так и не придумал как реализовать. И проблема не в том что я не знаю алгоритмов генерирования, проблема в том что я не знаю как сделать так, чтобы частота при этом всегда нужной была. Вообще есть два варианта: иметь большие массивы и за одно и то же время проигрывать волны разных частот или иметь маленькие массивы и проигрывать волны одной частоты за разное время. По крайней мере обдумывая второй вариант ничего путного не придумал.
Аноним 07/08/17 Пнд 19:12:14  1040176
>>1035333
PROGMEM static const byte sine [16384] = {...};
Вот так объявляю
Использую - читаю массив, отправляю значения в ЦАП, перед этим проделав несколько операции синтезирования.
Аноним 28/08/17 Пнд 09:01:16  1052459
Объявлять нужно так (обязательно в области глобальных переменных, а не внутри функции):

static const PROGMEM int8_t sine[16384] = { ... }

Читать специальными функциями вида:

pgm_read_byte(&sine)
Аноним 28/08/17 Пнд 09:03:22  1052460
>>1052459
>pgm_read_byte(&sine[])
Аноним 01/09/17 Птн 23:29:23  1055931
>>1052459
Волшебное PROGMEM в данном случае без разницы где писать. int8_t - интеджер, которому выделено 8 бит информации = байт. Ардуина понимает что такое byte.
Аноним 02/09/17 Суб 10:19:58  1056014
>>1052459
>pgm_read_byte(&sine)
Это почти наверняка макрос, а не функция.
>>1055931
За волшебным макросом PROGMEM должно скрываться что-то вроде __attribute__(section("название секции"))
>Ардуина понимает
avr-gcc, а не ардуина.

[Назад][Обновить тред][Вверх][Каталог] [Реквест разбана] [Подписаться на тред] [ ] 12 | 1 | 7
Назад Вверх Каталог Обновить

Топ тредов
Избранное