Хотели как лучше, а получилось как всегда (с)

Как то с полгода назад, озаботился я, что текущая тема для моего бложика как-то не очень хорошо отображается на мобильных устройствах. А в «наш век космических кораблей» это уже не очень хорошо.. Поставил другую… трафик и посещаемость стала падать…

век космических кораблей и SEO

Шло время…ну примерно 3 месяца прошло.., и решил я, что не плохо бы прикрутить яндекс метрику на сайте, и посмотреть что там творится с сайтом в Яндекс.мастере. Результат: упал ТИС и посещаемость…

Шло время… как-то с месяц назад, поставил для бложика плагин YOAST SEO, и начал потихоньку причёсывать бложик, чтобы статьи и записи «соответствовали». Жду когда яндекс вообще сайт забанит 😉

Ну я к чему? Так то мне всё равно на самом деле сколько посетителей ко мне заходит на сайт в сутки. В основном всё равно это всё я для себя веду. Но обидно чуток 😉 Вроде «хочешь как лучше, а получилось как всегда»

«В наш век космических кораблей»…нужно меньше ручки куда попало присовывать если всё работает ;). В общем пройтись с наскока и поставить во всех статьях написанных в этом бложике за 12 с гаком лет все фокусные ключевые фразы, SEO заголовки и MEta описания я так и не осилил. Уж больно много. Если только очень постепенно-постепенно, когда совсем будет нечего делать. И фактически единственной статьёй, которая полностью удовлетворяет всем критериям плагина YOAST, является эта статья. Уж я старался, С заголовки придумал, и текст до 300 знаков растянул водой, и картинку вставил с описанием. Есть и одна внутренняя ссылка на самую популярную статью, и одна внешняя, Чтоб этот чёртов смайл наконец уже стал зеленым…

Особенности работы 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 байта при любой длине строки.

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

Решено: Нужна помощь зала. Не объяснимая ошибка

Прошу очень помощи зала. Ситуация следующая: пишу прошивку «Бортовой компьютер» автомобиля
на основе Arduino Nano (хобби у меня такое, не работа).
Минимальный пример, для воспроизведения ошибки (удалил по максимуму всё, лишь бы ошибка воспроизводилась):

https://wokwi.com/projects/390348182761575425

Проблема в следующем, не обьяснимым образом, теряются данные в переменных при вызове функции translate.

Например при использовании вот так (строки 141-146):

На экран выводится «Bridge». Однако стоит убрать строчку

Как волшебным образом, на экран начинает выводится и Transmission: и Bridge:.

Дело не только в этой строчке. Закомментировав рандомно часть кода выше-ниже, вообще не относящегося к выводу на экран, можно добиться эффекта, что выводятся на экран все три строчки.

Подумал что памяти не хватает. Но вроде норм. Я уже начинаю сходить с ума, несколько дней бьюсь над проблемой. Проблема воспроизводится и на «реальном железе», не только в эмуляторе.

Update: си не умеет возвращать строки. Только массивы символов. Поэтому верный код что-то вроде:

Arduino: передача массива строк в качестве функции

За что я не очень люблю СИ, так за то что можно споткнуться на пустом месте и долго думать почему так? И в этот раз тоже, долго гуглил, почему у меня не получается передать массив строк в функцию, массив внутри «обнулялся». Наконец наткнулся, что СИ это не умеет. Умеет только передавать указатель на массив. Поэтому функция может выглять подобным образом:

Чтиво за последние полгода

Давненько не выкладывал список литературы, которую читаю. Сын уже подрос, и читать ему не нужно. Дочь вырубается после 5 минут чтения, потому одну книгу мусолим уже полгода 😉 Потому выкладываю только свой список литературы. Не весь правда, т.к. FBReader меня немножко подвел не так давно, и список «читаемых сейчас» книг был утерян.

  • Сам себе властелин 1-5. Александр Горбов. Уже читал, но перечитал, т.к. вышла последняя часть. Оценка 4/5. Краткий сюжет: очередной попаданец волею судеб попадает в мир магии, где оказывается наследником замка Кулькуара
  • Отмороженный 1-4. Гарцевич Е.А. Оценка 3 из 5. МЧСник исследую мир в Арктике, попал в другое измерение, и был «заморожен» на 100 лет. Мосле того как это измерение было обнаружено, его спасли. И далее он помогает исследовать «Мерзлоту».
  • Адский Пекарь. Сергей Мутев, Сириус Дрейк. Оценка 1 из 5. Не дочитал, ибо бред..
  • Моё пространственное убежище 1-14. Дмитрий Дорничев. Оценка 3 из 5. Зомобиаппокалипсис с системой.
1 12 13 14 15 16 293