avatar_UriBas

Моргалка на Arduino. Этюды для начинающих.

Автор UriBas, 08 Март 2017 в 16:08

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Necromant

Иногда и только грубые...
Соответствие типов вообще по-моему пофиг ему. И самой ардуине тоже. И самое забавное это значение для двухбайтного числа равное 65538... Как в том анекдоте: значение синуса в военное время может достигать четырех.

Alex_N


Alex_Soroka

Цитата: Alex_N от 29 Май 2018 в 08:57
Что правда ? Надо попробовать.
...там еще много подводных камней  :hello:
...о которых вы узнаете тогда когда уже за вас все решит компилятор...

Necromant

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

Alex_N

Цитата: Alex_Soroka от 29 Май 2018 в 10:37...о которых вы узнаете тогда когда уже за вас все решит компилятор...
Лет 30 назад я наверное бы послушал такие песни про компилятор. А сейчас - 20-летним сказки рассказывайте.
И то они наверное небольно то поверят.

KIE

#1031
Цитата: Necromant от 29 Май 2018 в 11:32И вполне можно добиться надежной стабильной работы.
Это не от железа зависит в 99%, а от качества программы и тямы пользователя.
Например:
Цитата: Necromant от 29 Май 2018 в 11:32Там самый главный подводный камень - не использовать константы и периодически освежать значение переменных
Явно указывает на большие ляпы в программе. Где то, кто то пытается поселить в одну берлогу двух или больше медведей (шучу), но оно так и есть. Разные ветви п\программ берут и записывают данные в одни регистры (на вскидку).  Есть конструкции которые годами работают не выключаясь на ширпотребе Атмела. Годами как загрузились константы при старте так и есть, т. более оперативные данные.

Necromant

Цитата: KIE от 01 Июнь 2018 в 16:30Годами как загрузились константы при старте так и есть, т. более оперативные данные.
на Си или асме писались программы?

Alex_N

Цитата: KIE от 01 Июнь 2018 в 16:30Годами как загрузились константы при старте так и есть
А что возможны другие варианты ?

KIE

Цитата: Alex_N от 01 Июнь 2018 в 20:05А что возможны другие варианты ?
На удивление есть. См. сообщение 1029.

Alex_Soroka

Цитата: Necromant от 29 Май 2018 в 11:32
Там самый главный подводный камень - не использовать константы и периодически освежать значение переменных
проги надо писать правильно  :hello:
...например, не совать везде инициацию переменных при каждом вызове функции  :facepalm:
...особенно в обработчике прерываний, как это умеют делать юные дарования, начитавших таких-же "учителей" которые им лекции читают. ...

Кass

Цитата: Necromant от 29 Май 2018 в 11:32Там самый главный подводный камень - не использовать константы и периодически освежать значение переменных

Ну не совсем это так. Прежде чем писать подобные тезисы, нужно понимать смысл того и другого. Ведь авторы компиляторов далеко не идиоты, и раз они предусматривают и то и другое, значит нужно и то и другое. Нет бутерброда как без хлеба, так и без масла. Нужно и то и другое. В маленьких МК нужно понимать, что у вас довольно ограниченные ресурсы, то есть ПЗУ и ОЗУ. При этом константы занимают место в ПЗУ собственно в самой прошивке, а вот под переменные, при их объявлении выделяется память в ОЗУ. Таким образом отказавшись от констант и заменив их чисто переменными легко просто забить все ОЗУ и получить ошибку при компиляции.

Поэтому не стоит так сразу рубить с плеча константы. Они тем и хороши, что не едят оперативную память. ;)
АРМ стенда онлайн: http://scada.kontar.ru Пользователь: Электротранспорт, Пароль: 111111

Гербалайф от всех болезней, Кашпировский лучший врач,  Орифлейм самая лучшая косметика, а МММ самый лучший способ вложения денег. Кто бы спорил. ;)

green99

Necromant :

Стесняюсь спросить, но всё же - а зачем вам вообще такие переменные? Вы хотите поставить микроконтролер и компиллятор на колени - флаг в руки. Кажется, темка про что-то простое на ардуине или тиньке  - так не используйте в алгоритмах решения в лоб, ВСЕГДА можно обойтись в простом устройстве 8 БИТАМИ! Доказано без меня миллионы раз!

Alex_N

??????
Кто нибудь что понял ?
В своё время доказали, что самая оптимальная система счисления - троичная. И что с того ?

Necromant

Цитата: Кass от 06 Июнь 2018 в 17:32Поэтому не стоит так сразу рубить с плеча константы. Они тем и хороши, что не едят оперативную память.
В C++ любая константа - это переменная с постоянным значением. Её значение даже можно поменять в программе, и часть компиляторов даже ошибку не выдаст. С++ резервирует буфер для хранения константы в ОЗУ как и для любой глобальной переменной. В Турбопаскале такого нет. Любое ОЗУ чувствительно и перепадам напряжения и к статике. Что будет со временем записано в конкретной неизменяемой ячейке со временем одному богу известно (котик прошелся по столу), ведь у нас же не ECC память в ардуинах. В тепличных условиях (идеальное питание, помехозащищенность) может ардуина и годами отпашет не перезагружаясь.
А вместо констант правильней указывать директиву подстановки #define, тогда значение будет каждый раз напрямую переноситься из флеш в стек при вычислениях, да чуть медленнее, но нам микросекунды большой роли не сыграют, зато оперативу не жрем.

Necromant

Цитата: Alex_Soroka от 06 Июнь 2018 в 09:32..например, не совать везде инициацию переменных при каждом вызове функции
для экономии памяти полезно динамически создавать и удалять переменные, особенно те, в которых данные не актуальны в течении длительного времени (например массивы обработки мгновенных измерений, нафига постоянно держать занятыми 1,5 кБ из 2 опративы? ).

Добавлено 07 Июнь 2018 в 11:35

Цитата: Alex_Soroka от 06 Июнь 2018 в 09:32особенно в обработчике прерываний
а здесь, согласен,  дело тонкое, требуется предельная внимательность при изменении переменных при выполнении прерывания и возврате в основной цикл и все будет хорошо

Кass

#1041
Цитата: Necromant от 07 Июнь 2018 в 11:21В C++ любая константа - это переменная с постоянным значением. Её значение даже можно поменять в программе, и часть компиляторов даже ошибку не выдаст. С++ резервирует буфер для хранения константы в ОЗУ как и для любой глобальной переменной.

У меня создается впечатление, что у вас как то все в кучу смешалось. С++ - это язык программирования. Помимо его есть конкретные компиляторы, соторые с текстового файла на языке С++ генерит двоичный файл прошивки МК. Возможно какой то конкретный компилятор языка С++ и компилирует именно так, как вы это написали. Но тогда описывая подобные вещи нужно сразу указывать компилятор, о котором идет речь. В самом же языке С++ константа и переменная это разные вещи. И большинство компиляторов абсолютно по разному их компилируют. К примеру тот же Keil. Да вроде и сам компилятор Ардуины не резервирует под константы область в ОЗУ. ИМХО это в корне не верно. Значение константы хранится в коде программы, и ее нет в ОЗУ. В этом и есть ее смысл.

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

Цитата: Necromant от 07 Июнь 2018 в 11:30для экономии памяти полезно динамически создавать и удалять переменные, особенно те, в которых данные не актуальны в течении длительного времени (например массивы обработки мгновенных измерений, нафига постоянно держать занятыми 1,5 кБ из 2 опративы? ).

... В реальности конечно переменные должны быть по большей мере локальными, место под которые выделяется только в пределах одной функции. Сделать все глобальными можно только в каком то большом контроллере, на АРМе, где ОЗУ все забить очень сложно. Когда же речь о Ардуино и этюдов для начинающих, то злоупотреблять этим точно не стоит.
АРМ стенда онлайн: http://scada.kontar.ru Пользователь: Электротранспорт, Пароль: 111111

Гербалайф от всех болезней, Кашпировский лучший врач,  Орифлейм самая лучшая косметика, а МММ самый лучший способ вложения денег. Кто бы спорил. ;)

Alex_N

Абсолютно согласен. С и Паскаль отличаются только синтаксисом, всё остальное - конкретная реализация компилятора.
В Delphi и Builder например среда одна и та же. В Ардуине конечно есть косяки компилятора. А где их нет ?
Можно писать всё в машинных кодах и проблем не будет. Я правда таких людей не видел. Они остались в 60-х.
Есть где, есть с кем, но зачем ?

Dunkel

Выложил некоторые результаты опытов с моргалкой, ссылка в подписи.
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/