Инициализация пинов Ардуино
- Войдите на сайт для отправки комментариев
Чт, 02/06/2022 - 13:36
Инициализация пинов по предлагаемой ниже схеме как-то не озвучивалась или прошла мимо меня.
Какие достоинства и недостатки?
// Определения pin #define Echo01 5 #define Trig01 6 #define Echo02 2 #define Trig02 3 #define DC1_in1 12 #define DC1_in2 11 #define DC2_in1 7 #define DC2_in2 8 #define DC1_pwm 9 #define DC2_pwm 10 #define BTN1 16 #define BTN2 17 #define BTN3 18 const uint8_t data_out[]PROGMEM = {Trig01,Trig02,DC1_in1,DC1_in2,DC2_in1,DC2_in2, DC1_pwm, DC2_pwm, LED_BUILTIN}; const uint8_t data_in[] PROGMEM = {Echo01, Echo02}; const uint8_t data_inp[] PROGMEM = {BTN1,BTN2,BTN3}; void setup() { for(auto p: data_out)pinMode(p, OUTPUT); for(auto p: data_in) pinMode(p, INPUT); for(auto p: data_inp) pinMode(p, INPUT_PULLUP); } void loop() { }
Нет тут этой проблемы, обращаемся по именам определённым в #define (ИМХО)
Какие достоинства и недостатки?
Как говорится - "можно и так".
недостаток - отсутсвие чего-либо принципиального нового в схеме.
Если не трудно, объясните пожалуйста, стр 16
const uint8_t data_out[] можно ли изменять в сетапе после объявления, ведь это тип const?
P.S. Спасибо, разобрался. Просто непривычная форма записи смутила.))
const uint8_t data_out[] можно ли изменять в сетапе после объявления, ведь это тип const?
так там вроде в сетапе никто ее и не меняет
так там вроде в сетапе никто ее и не меняет
Извиняюсь, протупил. Понравилась новая для меня форма записи, и захотел применить немного по другому
Но компилятор ругался. Теперь уже разобрался, спасибо
Какие достоинства и недостатки?
Как говорится - "можно и так".
недостаток - отсутсвие чего-либо принципиального нового в схеме.
мне понравилось, лаконично, память не жрёт, таких возможностей С++11 не знал
Правильней
for
(const auto &p: data_out)pinMode(p, OUTPUT);
Правильней
for
(const auto &p: data_out)pinMode(p, OUTPUT);
порывшись, находил примеры только для виндовс, именно такого не было, принял как данность, поэтому написал так, как написал, убедившись, что работает именно так, как требуется )))
for (auto p : data) схож по функции с php-шной foreach, привычно и понятно. Не знал такого о си.
Деда, ты бы объяснил, почему при разной записи результат на выходе идентичный, ведь p и &p это не одно и тоже
PROGMEM
Деда, ты бы объяснил, почему при разной записи результат на выходе идентичный, ведь p и &p это не одно и тоже
https://ravesli.com/urok-91-tsikl-foreach/
Для тех, кому трудно читать, сразу вывод:
Правило: Используйте обычные ссылки или константные ссылки в качестве объявляемого элемента в цикле foreach (в целях улучшения производительности).
PROGMEM
Видимо компилятору абсолютно индифферентно мнение адептов
Священного Грааля"лживого" С так как код в обоих случаях выдаёт идентичныйЗЫ для меня этот адрес - 403 Forbidden
Или кто-то работает на платформе, не поддерживающей прогмем.
Или кто-то работает на платформе, не поддерживающей прогмем.
ардуино уно однако )))
Или кто-то работает на платформе, не поддерживающей прогмем.
ардуино уно однако )))
тогда эта конструкция не должна правильно работать.
Или кто-то работает на платформе, не поддерживающей прогмем.
ардуино уно однако )))
тогда эта конструкция не должна правильно работать.
в эмуляторе всё пучком ...
Я думаю компилятор, как истинный джентльмен, забивает на потуги недопрограммиста и делает как должно быть, высокоинтеллектуальный то-есть )))
могу выложить ассемблерный листинг, если это что-то даст
for (auto p : data) схож по функции с php-шной foreach, привычно и понятно. Не знал такого о си.
Это и есть foreach.
Просто кто то забыл учебник почитать
в эмуляторе всё пучком ...
уж не позорился бы
del
в эмуляторе всё пучком ...
уж не позорился бы
какой позор, просто оплошал, c PROGMEM не проверил оказывается, ...даже через указатель не работает )))
я жеж и говорю, лживый ваш СИ
Остановимся, что с ОЗУ работает, но забирает байты по числу пинов
Или кто-то работает на платформе, не поддерживающей прогмем.
ардуино уно однако )))
тогда эта конструкция не должна правильно работать.
колись, что в консерватории надо поправить чтобы в PROGMEM работало
колись, что в консерватории надо поправить чтобы в PROGMEM работало
Ничего. Прогмем надо вычитывать ручками.
колись, что в консерватории надо поправить чтобы в PROGMEM работало
Ничего. Прогмем надо вычитывать ручками.
такую идею загубил )))
Ну да ладно, плата в десяток - другой байт ОЗУ не столь существенна, можно и в обычной памяти...
Инициализация пинов по предлагаемой ниже схеме как-то не озвучивалась или прошла мимо меня.
И озвучивалась, и Вы участвовали в обсуждении. Что-то с памятью? :-)
Инициализация пинов по предлагаемой ниже схеме как-то не озвучивалась или прошла мимо меня.
И озвучивалась, и Вы участвовали в обсуждении. Что-то с памятью? :-)
дело в особенности восприятия )))
PS там было int, а здесь auto - в обучении метод ключевых моментов называется ...
я жеж говорю, это психология, особенность подачи материала, чтобы запомнилось надо найти уникальное слово сделав его ключевым, у одного француза в записной книжке поместилось 10 миллионов анекдотов, отмечены как ключевые слова, а память текст восстановит
У кого какие ассоциации ))) У меня все же это с php-шной foreach () ))))
с php-шной foreach () ))))
А там foreach может быть параллельным (асинхронным)? Я не имел дела с перлом с 90-ых и мои знания безнадёжно устарели. Тогда этот вопрос как раз обсуждался. Аргументы "за" были такие - один хрен для тела цикла приходится создавать виртуальный $_, так почему бы не создать их "сколько надо" и не выполнять тело цикла одновременно на нескольких ядрах. Аргумент "против" - язык чуть менее, чем полностью держится на побочных эффектах и неуправляемая, скрытая параллельность внесёт хаос.
Кстати, в С++ эта конструкция строго последовательна - никакой параллельности. В С# - практически тоже, но там всё делается через енумераторы, так что возможны в принципе и варианты.
вообще не понимаю, как можно вносить в такой цикл какую-то параллельность?
А если работа с последующими итерациями зависит от результата предыдущих???
А если работа с последующими итерациями зависит от результата предыдущих???
А если нет, то хоть по ядрам CUDA всё параллель. :)
Цикл - это не только расчёт CRC, но и обслуживание равноправных TCP-сессий, например.
1. циклы foreach сегодня есть во всех основных языках программирования. C++,Java, JS,C#,Python.
2. Этот тип цикла не обязательно гарантирует порядок исполнения. С точки зрения теории ЯП тут зависимость от объекта. Итерируемый он или нет. И даже в случае итерируемого не все языки гарантируют последовательность по итератору.
3. Отсюда общий подход - при необходимости конкретной последовательности исполнения использовать явные итерации!!! (явное лучше неявного (с))
4. И еще одно следствие - цикл foreach почти всегда может быть распараллелен, причем чаще всего - прозрачно для программиста. Всегда стоит об этом помнить.
------------------------------
иллюстрация к п2. Пример для Питона:
У кого не стоит Питон (что бы это не значило ;) ), но запустить пример интересно, можно использовать любую online IDE. Например https://www.online-python.com/
вообще не понимаю, как можно вносить в такой цикл какую-то параллельность?
А если работа с последующими итерациями зависит от результата предыдущих???
Так философский смысл foreach как раз в том, что последовательность пофиг. Если нужна явная последовательность - надо использовать другие циклы.
Что-то я сегодня аж в 4х разных темах облажался... и всюду одинаково - начинаю отвечать про вещи. о которых даже не слыхал...
Вот как с этим foreach - никогда не приходило в голову, что это ДРУГОЙ цикл, всегда считал его просто новомодным синонимом for и потому не использовал...
Когда не видишь в чем-то новизны - это она, старость....
2. Этот тип цикла не обязательно гарантирует порядок исполнения.
Зависит от языка. В С++ обязательно гарантирует. В стандарте прямо сказано:
Правда, справедливости ради, он там и не называется foreach.
Евгений! Поясни, почему именно так:
f or ( ; __begin ! = __end; ++__begin ) {
а не так:
f or ( ; __begin ! = __end; __begin++ ) {
В случае применения списочных переменных... Или как они там по-научному отзываются... префиксная операция более дешевая с точки зрения ресурсоемкости.
Например, как в поше - запросил у системы список USB устройств, она вывалила лист с айтемами по 300кб и по нему нужно пройтись. Постфиксная операция заставит держать в памяти и предыдущий айтем и текущий. А префиксная - только текущий. Примерно такой смысл.
С простыми типами компилятор "для ардуины" справляется и особой разницы между постфиксом и префиксом наблюдать не удаётся.
понял, благодарю
Для x++ нужно делать копию x.
Да, видимо я уже подзабыл чего там читал несколько лет назад про префиксы и постфиксы. Помню, что оверхед есть.