Инициализация пинов Ардуино
- Войдите на сайт для отправки комментариев
Чт, 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() {
}
typedef enum { PIN_Trig01 = 0 , PIN_Trig02, PIN_DC1_in1, PIN_DC1_in2, PIN_DC2_in1, PIN_DC2_in2, PIN_DC1_pwm, PIN_DC2_pwm }OutPin_t; digitalWrite(data_out[PIN_Trig01] , HIGH);Нет тут этой проблемы, обращаемся по именам определённым в #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. Пример для Питона:
#список - итерируемый объект l = ["as","djdjd","xnxnx","rororor","bababa"] #множество - неитерируемый s = set(l) # #печатаем print("--------list------") for x in l: print(x) print("-------set------") for x in s: print(x)У кого не стоит Питон (что бы это не значило ;) ), но запустить пример интересно, можно использовать любую online IDE. Например https://www.online-python.com/
вообще не понимаю, как можно вносить в такой цикл какую-то параллельность?
А если работа с последующими итерациями зависит от результата предыдущих???
Так философский смысл foreach как раз в том, что последовательность пофиг. Если нужна явная последовательность - надо использовать другие циклы.
Что-то я сегодня аж в 4х разных темах облажался... и всюду одинаково - начинаю отвечать про вещи. о которых даже не слыхал...
Вот как с этим foreach - никогда не приходило в голову, что это ДРУГОЙ цикл, всегда считал его просто новомодным синонимом for и потому не использовал...
Когда не видишь в чем-то новизны - это она, старость....
2. Этот тип цикла не обязательно гарантирует порядок исполнения.
Зависит от языка. В С++ обязательно гарантирует. В стандарте прямо сказано:
9.5 .4 The range-based for statement 1 The range-based for statement for ( for-range-declaration : for-range-initializer ) statement is equivalent to { auto &&__range = for-range-initializer ; auto __begin = begin-expr ; auto __end = end-expr ; f or ( ; __begin ! = __end; ++__begin ) { for-range-declaration = *__begin; statement } }Правда, справедливости ради, он там и не называется foreach.
Евгений! Поясни, почему именно так:
f or ( ; __begin ! = __end; ++__begin ) {
а не так:
f or ( ; __begin ! = __end; __begin++ ) {В случае применения списочных переменных... Или как они там по-научному отзываются... префиксная операция более дешевая с точки зрения ресурсоемкости.
Например, как в поше - запросил у системы список USB устройств, она вывалила лист с айтемами по 300кб и по нему нужно пройтись. Постфиксная операция заставит держать в памяти и предыдущий айтем и текущий. А префиксная - только текущий. Примерно такой смысл.
С простыми типами компилятор "для ардуины" справляется и особой разницы между постфиксом и префиксом наблюдать не удаётся.
понял, благодарю
Для x++ нужно делать копию x.
Да, видимо я уже подзабыл чего там читал несколько лет назад про префиксы и постфиксы. Помню, что оверхед есть.