Разместить данные в EEPROM, чтобы Сэкономить FLASH

b612
Offline
Зарегистрирован: 12.03.2017

qwone пишет:

Наверно писал большой коллектив индусов https://www.youtube.com/watch?v=NDMaH3XqtRc

Люблю. Классный фильм. Добрый.

там мой 707-ой тёзка обещал этот же функционал уложить в 1000 строк

посмотрим, вдруг уложит

b707
Offline
Зарегистрирован: 26.05.2017

b612 пишет:

там мой 707-ой тёзка обещал этот же функционал уложить в 1000 строк

посмотрим, вдруг уложит

я обещал за пятерку советы по оптимизации. Переписать твой код обойдется дороже, меньше чем за пятнашку не возьмусь. И да, если не уложусь в 1000 строк - денег не возьму. Но нужен код.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Бросайте уже вдахновенна сраца. Все, что надо было ТСу ему сказали. Тему можно закрыть, я думаю, и даже посылать никаво в никуда не надо.

b612
Offline
Зарегистрирован: 12.03.2017

DetSimen пишет:

Бросайте уже вдахновенна сраца. Все, что надо было ТСу ему сказали. Тему можно закрыть, я думаю, и даже посылать никаво в никуда не надо.

Мне всё ещё надо как-то компилировать мой код (несколько массивов) в файл xxx.eep 

с заданными адресами

b707
Offline
Зарегистрирован: 26.05.2017

закрывать ты сам сказал - оснований нет. Можешь потереть те мои сообщения. которые считаешь лишними. Тебе - доверяю.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b612, Ну храшо. Разбирайся. 

То b707, ничего не буду чистить, каждый имеет право на свое мнение. Мне, например, прошивки без исходников тоже нихрена не нравятся. Я тоже считаю, что Ардуина - открытая платформа.

qwone
qwone аватар
Онлайн
Зарегистрирован: 03.07.2016

Да что там укладывать. Берем пишем 10 строк в одной строке и количество строк уменьшится. Напишите библиотеки и Include Вот и основной скетч "похудеет". Но фишка в том на каком стиле писать будете - если Ардуино-Си это одно. а если с классами шаблонами то другое. Ведь почему в инете дерьмокод, так он сделан дерьмокодерами и для дерьмокодеров. В идеальных кодах для таких программистах просто не хватает основного копонента.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Пух, ты еще функторы не освоил? 

qwone
qwone аватар
Онлайн
Зарегистрирован: 03.07.2016

нафига изучать эту дрянь. функторы придуманы для того чтобы индусы могли программировать и зарабатывать себе на жизнь.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Не знаю. Ты ж для чего-то всю эту дрянь изучаешь, шаблоны с бесполезными лямбдами. Я и подумал, када ты нас стройными рядами к функторам поведешь. 

negavoid
Offline
Зарегистрирован: 09.07.2016

Функторы придуманы, чтобы не париться с указателями :) самоделкиным всё это, разумеется, не нужно. нужно суровым энтерпрайзерам, где по 20 человек в команде на одном репо, и у каждого зп от $4500 начинается, вот для чего они нужны.

b612
Offline
Зарегистрирован: 12.03.2017

Столкнулся ещё с такой бедой

static uint16_t nachalyMelodij[32] EEMEM = {0, 18, .....

в еепром ложится так 00 00 12 00 ...

вроде всё нормально НО

eeprom_read_word((uint16_t*)(0))  читает 0

а 

eeprom_read_word((uint16_t*)(1)) читает 0x1200

т.е путает старший байт с младшим

Как поправить ?

 

b707
Offline
Зарегистрирован: 26.05.2017

b612 пишет:

eeprom_read_word((uint16_t*)(1)) читает 0x1200

т.е путает старший байт с младшим

Как поправить ?

это не функция путает, а ты. У тебя значение типа word - размером 2 байта, поэтому его смещение должно быть четным

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Единичку в скобках на 2 замени и подумай, почему. 

Upd. А, ну все, думать не нада. :-)

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

Единичку в скобках на 2 замени и подумай, почему. 

ему думать некогда, код набивать надо :) еще пару тысяч строк

b612
Offline
Зарегистрирован: 12.03.2017

Спасибо.

недоглядел. раньше там индекс 16-битного массива стоял теперь просто адрес

b707
Offline
Зарегистрирован: 26.05.2017

b612 пишет:

Спасибо.

так сказать, "в благодарность", можешь ответить на пару вопросов по своему проекту?

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:

так сказать, "в благодарность", можешь ответить на пару вопросов по своему проекту?

конечно, всегда пожалуйста )

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Вапще, я в этой ветке причин для срача не вижу.  Пусь нарот сам выбирает, что повторять, здешний код или с котофорума. 

Дед, он сказал, что я (начинающий), этого кода не осилю, это что?, не смогу скомпилировать и залить?

b707
Offline
Зарегистрирован: 26.05.2017

b612 пишет:

конечно, всегда пожалуйста )

ок

На часах правее цифр есть еще один сегмент - горизонтальная палочка на уровне верхнего края цифры. Для чего он?

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

Дед, он сказал, что я (начинающий), этого кода не осилю

не хватит терпения прочитать по причне огромного размера :)

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:

b612 пишет:

конечно, всегда пожалуйста )

ок

На часах правее цифр есть еще один сегмент - горизонтальная палочка на уровне верхнего края цифры. Для чего он?

чтобы изображать букву "Т" или значок "°"

и ещё сотни в настройках

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:

не хватит терпения прочитать по причне огромного размера :)

почти что так

когда люди видят такой код

    xTag[1] = basColorR;
    xTag[0] = basColorG;
    xTag[2] = basColorB;
    //переберём цвета (RGB)
    #ifdef __NeoPixel
    tripix = pix * 3;
    CurPix = Cur + tripix;

    for (uint8_t i = 0; i < 3; i++)
    { if ((CurPix[i]) < (xTag[i])) //определимся надо уменьшать или увеличивать
        //если до цели больше чем один шаг, делаем шаг
      { if (((xTag[i]) - (CurPix[i])) > (shagx[i])) {
          CurPix[i] = (CurPix[i]) + (shagx[i]);
          LocalFlajok = false;
        }

то у подаляющего большинства пропадает желание что-либо там править и воообще дальше читать 

))

Там пришлость делать кучу всяких ухищрений, чтобы успевало просчитываться табло для обеспечения плавности. И оперативу тоже пришлось оптимизировать, ибо два раза буферировать табло уже не влазило, а надо ведь ещё синусоиды хранить для синтеза звука.
Звук никак не совмещается с одновременным переливом.
Всё состоит из вот таких простых мелких заморочек.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b612 пишет:

b707 пишет:

не хватит терпения прочитать по причне огромного размера :)

почти что так

когда люди видят такой код

    xTag[1] = basColorR;
    xTag[0] = basColorG;
    xTag[2] = basColorB;
    //переберём цвета (RGB)
    #ifdef __NeoPixel
    tripix = pix * 3;
    CurPix = Cur + tripix;

    for (uint8_t i = 0; i < 3; i++)
    { if ((CurPix[i]) < (xTag[i])) //определимся надо уменьшать или увеличивать
        //если до цели больше чем один шаг, делаем шаг
      { if (((xTag[i]) - (CurPix[i])) > (shagx[i])) {
          CurPix[i] = (CurPix[i]) + (shagx[i]);
          LocalFlajok = false;
        }

то у подаляющего большинства пропадает желание что-либо там править и воообще дальше читать 

))

Там пришлость делать кучу всяких ухищрений, чтобы успевало просчитываться табло для обеспечения плавности. И оперативу тоже пришлось оптимизировать, ибо два раза буферировать табло уже не влазило, а надо ведь ещё синусоиды хранить для синтеза звука.
Звук никак не совмещается с одновременным переливом.
Всё состоит из вот таких простых мелких заморочек.

а зачем его читать, наше дело скомпилировать и залить )))

b707
Offline
Зарегистрирован: 26.05.2017

интересно, как один единственный сегмент может показать знак градуса?

а на второй мой вопрос вы уже частично ответили - в чем заключается плавный перелив.

Если я правильно понял этот кусочек кода, CurPix[i] - цвет пикседя в старой картинке, например вывод времени, а xTag[i] - цвет в новой картике, например при выводе температуры. А плавный переход заключается в изменении от первого значения до второго по шагам.

Это вроде вопрос 20-30 строк

b612
Offline
Зарегистрирован: 12.03.2017

ua6em пишет:

а зачем его читать, наше дело скомпилировать и залить )))

а зачем компилировать ?

огребать все заморочки с версиями библиотек и т.п.

берём SinaProg2.1.1 и нет проблем

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:

Это вроде вопрос 20-30 строк

почти угадали 50

b707
Offline
Зарегистрирован: 26.05.2017

еще вопрос вот по этому видео

https://youtu.be/-oNX_1El7Ts

здесь на 6 секунде дисплей показывает "10.ПН" - что это значит? И почему "10" одним цветом, а непонятные буквы другим?

Ну и вообще это видео, имхо, более показательно, чем первое. Если запустить его в замедленном повторе - видно как работает "плавный переход". ИМХО, задумка с переходом интересная, но уж больно много паразитно засвеченных пикселей

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:

еще вопрос вот по этому видео

https://youtu.be/-oNX_1El7Ts

здесь на 6 секунде дисплей показывает "10.ПН" - что это значит? И почему "10" одним цветом, а непонятные буквы другим?

вы далеко не первый 

все поголовно не могут понять что такое ПН, ВТ, СР, ЧТ

я удивляюсь, такое впечатление, что люди никогда не пользовались никакими календариками

хуже всего с "ВС" , все сразу думают ято это температура в цельсиях

 

Плавный переход придуман НЕ ДЛЯ КРАСОТЫ

b707
Offline
Зарегистрирован: 26.05.2017

b612 пишет:

вы далеко не первый 

все поголовно не могут понять что такое ПН, ВТ, СР, ЧТ

:))))

Цитата:
Плавный переход придуман НЕ ДЛЯ КРАСОТЫ

а для чего?

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:

а для чего?

у вас уже есть такие часы ? 

они находятся в жилой комнате или гдето в коридоре ?

b707
Offline
Зарегистрирован: 26.05.2017

b612 пишет:

у вас уже есть такие часы ? 

они находятся в жилой комнате или гдето в коридоре ?

я понимаю, о чем вы. Картинка все время прыгает и мешает спать. Но вы боритесь с причиной, а не со следствием. Причина в том, что часы слишком перегружены дополнительной инфой. Время, дата. давление, температура с 10 датчиков??? - имхо. это бред И все это часы прокручивают каждые 2-3 секунды, причем даже глухой ночью.

Я себе собрал такие часы (фото не мое)

они выводят только время и в темноте приглушают яркость на саый минимум. Даже даты нет. Итог - спать совершенно не мешают.

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:

 Но вы боритесь с причиной, а не со следствием. Причина в том, что часы слишком перегружены дополнительной инфой.

нормальненькие красивые у вас получились

Куча инфы выводится только днём и вы правильно заметили, это уже перебор.

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

Просто когда я это сделал речь о всяких температурах ещё не шла, был только календарь.
А когда сделал, то стало понятно, что это ещё и красивенько.
И уж потом добавились градусники и барометр, ну как без них ?

b707
Offline
Зарегистрирован: 26.05.2017

b612 пишет:

нормальненькие красивые у вас получились

да че там, шрифт спер у какого-то индийца :) Типичные офисные часы. Разница от покупных только в том, что мои синхронизируются с инетом и не теряют время при пропадении электричества.

вся программа - примерно 20 строк для 8266 и 30 строк для СТМ32 :)

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:

b612 пишет:

нормальненькие красивые у вас получились

да че там, шрифт спер у какого-то индийца :) Типичные офисные часы. Разница от покупных только в том, что мои синхронизируются с инетом и не теряют время при пропадении электричества.

вся программа - примерно 20 строк для 8266 и 30 строк для СТМ32 :)

да, синхронизация это хорошо
как бы и к моим присобачить ?
Портировал бы на ESP8266 , но тогда со звуком беда. там максимум 5-битный звук можно получить
Можно на ESP32, но она пока что только едет из китая.
Ещё напрягает провод до уличного градусника.
Вообще уличный градусник это реально хорошая функция

Logik
Онлайн
Зарегистрирован: 05.08.2014

b612 пишет:

b707 пишет:

не хватит терпения прочитать по причне огромного размера :)

почти что так

когда люди видят такой код

    xTag[1] = basColorR;
    xTag[0] = basColorG;
    xTag[2] = basColorB;
    //переберём цвета (RGB)
    #ifdef __NeoPixel
    tripix = pix * 3;
    CurPix = Cur + tripix;

    for (uint8_t i = 0; i < 3; i++)
    { if ((CurPix[i]) < (xTag[i])) //определимся надо уменьшать или увеличивать
        //если до цели больше чем один шаг, делаем шаг
      { if (((xTag[i]) - (CurPix[i])) > (shagx[i])) {
          CurPix[i] = (CurPix[i]) + (shagx[i]);
          LocalFlajok = false;
        }

то у подаляющего большинства пропадает желание что-либо там править и воообще дальше читать 

 

А че не так в коде? Нормальный вполне. Разве что временных переменных для текущих элементов массива добавить для оптимизации. Если компилятор сам не сообразит. Или через указатели, или массив структур, или выкинуть массив и раскрыть цикл, шо там тех 3-х элементов. В общем нормальный код, но можно покрутить если есть желание. Главное чтоб у Вас желание не пропало, а писать код доступный каждому идиоту - прямой путь в идиоты. И всеравно найдется еще тупей, который "нипанимаю!" ))

b707
Offline
Зарегистрирован: 26.05.2017

b612 пишет:

Портировал бы на ESP8266 , но тогда со звуком беда. там максимум 5-битный звук можно получить

читал я вашу ветку на радиокоте - вы там пишете, что у ЕСП8266 нет ШИМ. Откуда вы это взяли. это ерунда. У ЕСП ШИМ на всех ногах. кроме. если не ошибаюсь. 16-й. Частота ШИМ настраивается, то ли до 32 КГц, толи до 64х. В любом случае весь звуковой диапазон покрывает.

Цитата:
Ещё напрягает провод до уличного градусника.

делайте мобильный датчик на любом радиомодуле

b612
Offline
Зарегистрирован: 12.03.2017

Logik пишет:
А че не так в коде? Нормальный вполне.
.....
идиоты. И всеравно найдется еще тупей, который "нипанимаю!" ))
о том и речь, что в коде совершенно ничего сложного
Он не ценен мыслями.
Никакой пользы для обучения.
Он ценен только как готовый товар, в который вложена куча времени.

 

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:
ЕСП ШИМ на всех ногах. кроме. если не ошибаюсь. 16-й. Частота ШИМ настраивается, то ли до 32 КГц, толи до 64х. В любом случае весь звуковой диапазон покрывает.
шим там софтовый, частоту больше 1кГц держит совершенно не стабильно.
Вообщем знающие люди говорят что для звука не годится.
Там для звука есть I2S, но он требует внешний ЦАП, либо если использовать его как ШИМ то это только 5 бит

b707
Offline
Зарегистрирован: 26.05.2017

b612 пишет:

о том и речь, что в коде совершенно ничего сложного

но все-таки 6тыс строк для таких часов - нереально много. Вот сейчас говорю абсолютно спокойно. без глума - я абсолютно уверен, что если не до 1000 строк - то хотя бы раза в 2 ваш код точно можно сократить. И вообще вам следовало бы этим заняться - тогда не придется трахаться с запхзиванием жалких тысячи байт в ЕЕПРОМ

Logik
Онлайн
Зарегистрирован: 05.08.2014

Дак Вы решаете заодно попытку защитить интелектуальную собственность на опенсорс платформе. Ну возможно, но боюсь что тогда и хек не стоит публиковать.

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:
но все-таки 6тыс строк для таких часов - нереально много. Вот сейчас говорю абсолютно спокойно. без глума - я абсолютно уверен, что если не до 1000 строк - то хотя бы раза в 2 ваш код точно можно сократить. И вообще вам следовало бы этим заняться - тогда не придется трахаться с запхзиванием жалких тысячи байт в ЕЕПРОМ
строки то конечно можно уменьшить
поубирать пустые разделительные строки, комменты, ну там дефайны лишние
Ну там может быть реального кода ещё отжать строк 100.
Я вас уверяю в коде нет или почти нет лишних повторений.
Есть немного только там, где требуется скорость работы. Возможно и можно такое подсократить если посмотреть на сколько реально станет медленнее и может быть это допустимо.
Но всё это крохи. И полкилобайта не освободить.

b707
Offline
Зарегистрирован: 26.05.2017

b612 пишет:

шим там софтовый, частоту больше 1кГц держит совершенно не стабильно.
Вообщем знающие люди говорят что для звука не годится.

ну не знаю, я по внутренностям 8266 не специалист, использую его только через ардуино. Но что-то как-то не верится, неужели там нет таймеров?

Если не подходит 8266 - возьмите СТМ32. Уж там с таймерами и с ШИМ-ом все в порядке. Кроме того, там есть ДМА - а значит можно одновременно выводить картинку на пиксели и звук

b612
Offline
Зарегистрирован: 12.03.2017

Logik пишет:
боюсь что тогда и хек не стоит публиковать.
об этом много говорено
Кекс публиковать не боюсь. Чем его декомпилировать проще новый написать.
А в готовом виде он непригоден для серийного производства.

Знаете сколько народу повторило мои часики ?
Не более двух десятков

Logik
Онлайн
Зарегистрирован: 05.08.2014

Много  строк или нет - вопрос сильно относительный. Делал контроллер аквариума с графическим многооконным интерфейсом, тачскрином, 8 каналами управления (почти все индивидуальные там насос, сям подсвет с ШИМ), RTC, несколько термометров, серврпривод кормушки, ИК ДУ и может еще что забыл - 3000 строк плюс либ на глаз пару тысяч будет. Собирается в 27кБ. С таким  функционалом часики тоже займут прилично. Понятно что можно все в либы запихнуть и в 20 строк вызовы в скетче вписать. Надо в се в сумме рассматривать.

b707
Offline
Зарегистрирован: 26.05.2017

b612 пишет:

строки то конечно можно уменьшить
поубирать пустые разделительные строки, комменты, ну там дефайны лишние

не говорите ерунды, это все никак не влияет на размер кода, я не об этом. Оптимизация кода - это переписать код и убрать все повторы, правильно организовать данные. чтобы обрабатывать их пакетом. Избавится от неэффективных конструкция. например использования типа float и класса String
Я недавно одному заказчику оптимищировал код - так только одно избавление от String уменьшило размер прошивки почти вдвое.

Цитата:
Ну там может быть реального кода ещё отжать строк 100.
Я вас уверяю в коде нет или почти нет лишних повторений.

а я вас уверяю, что вы очень сильно ошибаетесь. Вы этих повторов просто не видите

 

 

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:
ну не знаю, я по внутренностям 8266 не специалист, использую его только через ардуино. Но что-то как-то не верится, неужели там нет таймеров?

Если не подходит 8266 - возьмите СТМ32. Уж там с таймерами и с ШИМ-ом все в порядке. Кроме того, там есть ДМА - а значит можно одновременно выводить картинку на пиксели и звук

8266 это хрень в китайском стиле.
Пользователям отдаётся только свободная флэш и свободное процессорное время
и почти никакой документации о том сколько его отдаётся и когда.
И про реальную периферию очень мало инфы, я уж не говорю про то, что я на всё это гляжу сквозь ARDUINO IDE
Вообщем это китайская тайна покрытая китайским мраком.

Logik
Онлайн
Зарегистрирован: 05.08.2014

Но тем не менее сочетание WiFi, низкой цены и простоты вхождения для 8266 почитай уникально. И часики на нем и WS2812B выглядят заманчиво за счет исключения RTC. Про нормальный звук с него - тоже сомневаюсь. Хотя ШИМ для движка в Н-мосте сделал.

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:
неэффективных конструкция. например использования типа float и класса String
от флоата можно отказаться, но он такой удобный
от serial-a можно отказаться, он не оч нужен, но это значит с нуля писать какое-то взаимодействие с компом.
string-а нет

Вообщем на данном этапе мне показалось проще выкинуть несколько массивов в еепром, тем более что им там самое место.
Да и функционал уже практически весь реализован.
Даже вантачный таймер. 
Тыкаешь по кнопке и уже пошел обратный отсчет 5 или 20 минут, тыкаешь второй раз и добавилось 5 или 20.

Logik
Онлайн
Зарегистрирован: 05.08.2014

флоат исключать, очень громоздкая. Нафига оно вобще в часах, эффекты посчитать и с фиксированой точкой отлично.