Особенности работы Arduino nano с памятью

Свободная память

В качестве хобби, разрабатываю бортовой компьютер для своего автомобиля УАЗ патриот. Ну как компьютер..громко звучит. Функций не много, но те которых не хватает в повседневном использовании.. Но сейчас не об этом, о БП выпущу потом отдельную статью.

А сейчас поговорим о самой прошивке. Использую в разработке дисплей на базе чипсета SSD1306. Сначала заметил, что в то время как разрастается код программы, на экране случайным образом начинают появляться различные артефакты, в виде «белого шума». Дальше — больше, заполняю массив в одном месте программы, и через какое то время он начинает затираться случайными данными. Одно время даже уже даже почти отчаялся, И уж никак не приходило в голову, что всё это следствие простой не хватки оперативной памяти Arduino.

Хотя по идее, это первое что должно было придти в голову. Но! во всем виноват Яндекс ;). Он подсовывал ссылки в которых рассказывалось о подобных проблемах, но ни в одной из них не было рекомендации подумать в сторону памяти. Всякий бред типа «подпаяйте резистор, нет контакта, плохая плата, не правильно передаёте массив, не так работаете со строками» и .д. и т.п. Однако, решил на всякий случай измерить остаток оперативной памяти в процессе выполнения программы. Код для измерения следующий:

Запустил… и оказалось что проблемы с экраном начинаются, когда свободно памяти становится меньше 168 байт. Проблемы с очисткой и замусоривание переменных — когда остается меньше 140 байт. А сейчас самое время вспомнить, что в arduino nano всего 2кб оперативной памяти и 32кб flash (ну на самом деле на разных чипах по разному, но конкретно на используемой мной — Atmega 327p именно столько). И этого мало! Любое объявление переменной тратит память. Выход? Arduino способен хранить данные и во Flash. Но храниться они будут несколько своеобразно: фактически в оперативной памяти будет храниться ссылка на ячейку памяти Flash где хранятся данные. Показать переменной что она будет храниться во Flash памяти призван модификатор PROGMEM. Например, для того чтобы объявить что данные для отображения графики будут храниться во Flash памяти можно так:

И в принципе всё. Данные, будут помещены во Flash память. PROGMEM может работать со всеми целочисленными типами (8, 16, 32, 64 бита), float и char.
Важное замечание — PROGMEM применяется только к глобальным переменным, которые расположены ВНЕ функций.

Чтение переменных

Если с записью всё просто, то с чтением всё гораздо интереснее: оно осуществляется при помощи специальных функций:

  • pgm_read_byte(data) – для 1-го байта (char, byte, int8_t, uint8_t)
  • pgm_read_word(data) – для 2-х байт (int, word, unsigned int, int16_t, int16_t)
  • pgm_read_dword(data) – для 4-х байт (long, unsigned long, int32_t, int32_t)
  • pgm_read_float(data) – для чисел с плавающей точкой

,где data это адрес (или указатель) блока данных

Вот как например можно прочитать массив из флэш памяти:

Кроме того, есть встроенная функция — помогалка F(), которая при использовании компилируется в строку — константу во флеш памяти, и подставляется в нужном месте сама. Например код вида:

Serial.println(F(«Я занимаю одинаковое количество оперативной памяти вне зависимости от своей длины»));

Будет соответственно занимать 2 байта при любой длине строки.

Собственно перелопатив весь код, с учётом выше озвученного, удалось избавиться от артефактов на дисплее и не адекватного поведения переменных

УАЗ Патриот чудо инженерной мысли в РФ.

Итак, весной этого года окончательно пришло время менять старый автомобиль на новый. Хенде Туксан прослужил верой и правдой почти 18 лет и начал банально уже сыпаться. Стойки сгнили. Подвеска уже стала настолько изношена, что сход-развал уже даже не смогли сделать, чтоб резину не жевало. Фары потускнели. Коробка стала «пинаться». Появилась уже видимая ржавчина. Даже пластмасса в салоне настолько устала, что стала ломаться — подлокотник у водителя сломался пополам. В общем было принято решение избавиться от него и купить новый автомобиль. Продать кстати удалось на удивление быстро и относительно дорого. Человеку не лень было приехать аж из Барнаула за машиной.

Покупка б/у автомобиля не рассматривалась в принципе, ввиду крайне негативного опыта покупок в прошлом (2005г): купил ВАЗ 2115 перевертыш (ну ктож знал!), и год пришлось на нём откататься пока не нашел другого простака, который её у меня купил дороже чем я её купил. Да знакомый один тоже, лет 5 назад купил вроде с виду приличную мазду, которая тоже оказалась бита-крашена в хлам. В общем в такую лотерею играть я не захотел.

Стали рассматривать новые автомобили. Шок. Отрицание. Торг. Все стадии прошел достаточно быстро. 2 миллиона и выше отдавать за кросовер — внедорожник, влезая в кабалу кредитов и отдавая пол зарплаты — был не готов. Семья, дети, жена которая хочет шубу и в отпуск ну и всё такое. Паркетники тоже отпали — поездив на кросовере с заявкой на «внедорожник», перелезать в паркетник уже было неохота. Привык что ни зимой ни летом не парюсь и еду там где паркетники буксуют или не едут.

Стал смотреть отечественные «внедорожники» — нива шевроле и Патриот. Нива отпала по причине того что она для нашей семьи маленькая и маломощная. Да и в самой «заряженой» комплектации из тех которые были в наличии — нет даже задних стеклоподьемников и (барабанная дробь) кондиционера!

Ну что делать, остался только УАЗ Патриот. Приехали в автосалон, потрогали, полазали самую базовую модель. Вроде понравилась и внешне и размерами. Решили брать. Купили.

Итак, спустя месяц владения, могу уже описать минусы данного автомобиля и сколько я в него вложил. Плюсов пока особо не увидел кроме высокой посадки.

Вложения:

  • мультимедиа система на андроиде. Куплена магнитола, куплены 4 громкоговорителя (в базе не было — только провода). Подключить адекватно получилось со второго раза: установщики сказали что «перепутаны были провода, еле разобрались» в торпеде. Не могу проверить, так оно на самом деле или установщики безрукие.
  • Не было подголовников на задних сидениях — наколхозил сам, купив б/у диван, выдрав оттуда крепления и подголовники
  • поставил кнопку запуска. Работает не очень — иногда не гаснет иммобилайзер. Установщики говорят «нужно катушку ставить из замка». Ну будем еще разбираться чуть попозжа.
  • Задние брызговики. Почему на заводе не ставят такую просто тупо необходимую вещь совершенно не понятно. Поставили — один дребезжит при езде — нужно перделывать (мало млять других дребезжаний!)
  • Антикорозийная обработка + шумоизоляция дверей.
  • Сигнализация с автозапуском

Что уже сломалось:

  • вывалился плафон освещения в кабине. Починил сам, отогнув усики и вставив обратно
  • Что-то особо сильно дребезжит (помимо всего остального) под капотом при оборотах около 2500-3000. Нужно будет на ТО-0 искать что

Минусы пока из того что заметил:

  • Стыки сварки на кузове — выполнены очень не аккуратно.
  • Пороги прилеплены с одной стороны вроде боле мене, с другой со щелью, нужно переделывать
  • Провода под капотом кой-где висят. Пока примотал кой где изолентой и стяжками
  • Некоторые трубки под капотом соприкасаются с железом и дребезжат при езде — обернул изоляцией от труб ПВХ
  • Машина ОЧЕНЬ шумная
  • Супруга пока не научилась ездить.

Планы на будущее:

  • купить зимнюю резину и диски
  • купить и поставить рейлинги
  • переделать рычаг КПП — сделать его «безшумным» по технологиям с ютуба
  • купить пластмассовый колпак запаски
  • Пройти ТО-0, всё протянуть, попытаться убрать большинство дребезжаний (особенно тот который на оборотах 2500-3000)