Инициализация пинов Ардуино

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

Инициализация пинов по предлагаемой ниже схеме как-то не озвучивалась или прошла мимо меня.
Какие достоинства и недостатки?

// Определения 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() {

}

 

mixail844
Offline
Зарегистрирован: 30.04.2012
навскидку : "проблема" доступа 
 
digitalWrite(data_out[0] , HIGH) // вместо 0 , читабельней было бы Trig01  . 
можно конечно и так 
 
digitalWrite(Trig01  , HIGH); //но  я "за" унификацию обращения
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);

 

 

 

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

Нет тут этой проблемы, обращаемся по именам определённым в #define (ИМХО)

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

ua6em пишет:

Какие достоинства и недостатки?

Как говорится - "можно и так".

недостаток - отсутсвие чего-либо принципиального нового в схеме.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Если не трудно, объясните пожалуйста, стр 16

const uint8_t data_out[] можно ли изменять в сетапе после объявления, ведь это тип const?

P.S. Спасибо, разобрался. Просто непривычная форма записи смутила.))

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

Дим-мычъ пишет:

const uint8_t data_out[] можно ли изменять в сетапе после объявления, ведь это тип const?

так там вроде в сетапе никто ее и не меняет

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

b707 пишет:

так там вроде в сетапе никто ее и не меняет

 Извиняюсь, протупил. Понравилась новая для меня форма записи, и захотел применить немного по другому

Но компилятор ругался. Теперь уже разобрался, спасибо

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

b707 пишет:

ua6em пишет:

Какие достоинства и недостатки?

Как говорится - "можно и так".

недостаток - отсутсвие чего-либо принципиального нового в схеме.

мне понравилось, лаконично, память не жрёт, таких возможностей  С++11 не знал

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

Правильней 

for(const auto &p: data_out)pinMode(p, OUTPUT);

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

DetSimen пишет:

Правильней 

for(const auto &p: data_out)pinMode(p, OUTPUT);

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

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

for (auto p : data) схож по функции с php-шной foreach, привычно и понятно. Не знал такого о си.

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

Деда, ты бы объяснил, почему при разной записи результат на выходе идентичный, ведь p и &p это не одно и тоже

rkit
Offline
Зарегистрирован: 23.11.2016

ua6em пишет:

PROGMEM

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

ua6em пишет:

Деда, ты бы объяснил, почему при разной записи результат на выходе идентичный, ведь p и &p это не одно и тоже

https://ravesli.com/urok-91-tsikl-foreach/

Для тех, кому трудно читать, сразу вывод:  

Правило: Используйте обычные ссылки или константные ссылки в качестве объявляемого элемента в цикле foreach (в целях улучшения производительности).

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

rkit пишет:

ua6em пишет:

PROGMEM

Видимо компилятору абсолютно индифферентно мнение адептов Священного Грааля "лживого" С так как код в обоих случаях выдаёт идентичный

ЗЫ для меня этот адрес - 403 Forbidden

rkit
Offline
Зарегистрирован: 23.11.2016

Или кто-то работает на платформе, не поддерживающей прогмем.

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

rkit пишет:

Или кто-то работает на платформе, не поддерживающей прогмем.

ардуино уно однако )))

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

ua6em пишет:

rkit пишет:

Или кто-то работает на платформе, не поддерживающей прогмем.

ардуино уно однако )))

тогда эта конструкция не должна правильно работать.  

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

DetSimen пишет:

ua6em пишет:

rkit пишет:

Или кто-то работает на платформе, не поддерживающей прогмем.

ардуино уно однако )))

тогда эта конструкция не должна правильно работать.  

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

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

могу выложить ассемблерный листинг, если это что-то даст

Kakmyc
Offline
Зарегистрирован: 15.01.2018

BOOM пишет:

for (auto p : data) схож по функции с php-шной foreach, привычно и понятно. Не знал такого о си.

Это и есть foreach.
Просто кто то забыл учебник почитать

rkit
Offline
Зарегистрирован: 23.11.2016

ua6em пишет:

в эмуляторе всё пучком ...
 

уж не позорился бы

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

del

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

rkit пишет:

ua6em пишет:

в эмуляторе всё пучком ...
 

уж не позорился бы

какой позор, просто оплошал, c PROGMEM не проверил оказывается, ...даже через указатель не работает )))
я жеж и говорю, лживый ваш СИ

Остановимся, что с ОЗУ работает, но забирает байты по числу пинов

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

DetSimen пишет:

ua6em пишет:

rkit пишет:

Или кто-то работает на платформе, не поддерживающей прогмем.

ардуино уно однако )))

тогда эта конструкция не должна правильно работать.  

колись, что в консерватории надо поправить чтобы в PROGMEM работало

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

ua6em пишет:

колись, что в консерватории надо поправить чтобы в PROGMEM работало

Ничего.  Прогмем надо вычитывать ручками. 

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

DetSimen пишет:

ua6em пишет:

колись, что в консерватории надо поправить чтобы в PROGMEM работало

Ничего.  Прогмем надо вычитывать ручками. 

такую идею загубил )))
Ну да ладно, плата в десяток - другой байт ОЗУ не столь существенна, можно и в обычной памяти...
 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

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

  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);

И озвучивалась, и Вы участвовали в обсуждении. Что-то с памятью? :-)

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

ЕвгенийП пишет:

ua6em пишет:

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

  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);

И озвучивалась, и Вы участвовали в обсуждении. Что-то с памятью? :-)

дело в особенности восприятия )))
PS там было int, а здесь auto - в обучении метод ключевых моментов называется ...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:
там было int, а здесь auto
Смотрю, смотрю на компас. Вроде, юх там один - он и в Африке юх :-)

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

ЕвгенийП пишет:

ua6em пишет:
там было int, а здесь auto
Смотрю, смотрю на компас. Вроде, юх там один - он и в Африке юх :-)

я жеж говорю, это психология, особенность подачи материала, чтобы запомнилось надо найти уникальное слово сделав его ключевым, у одного француза в записной книжке поместилось 10 миллионов анекдотов, отмечены как ключевые слова, а память текст восстановит

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

У кого какие ассоциации ))) У меня все же это с php-шной foreach () ))))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

BOOM пишет:

с php-шной foreach () ))))

А там foreach может быть параллельным (асинхронным)? Я не имел дела с перлом с 90-ых и мои знания безнадёжно устарели. Тогда этот вопрос как раз обсуждался. Аргументы "за" были такие - один хрен для тела цикла приходится создавать виртуальный $_, так почему бы не создать их "сколько надо" и не выполнять тело цикла одновременно на нескольких ядрах. Аргумент "против" - язык чуть менее, чем полностью держится на побочных эффектах и неуправляемая, скрытая параллельность внесёт хаос.

Кстати, в С++ эта конструкция строго последовательна - никакой параллельности. В С# - практически тоже, но там всё делается через енумераторы, так что возможны в принципе и варианты.

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

вообще не понимаю, как можно вносить в такой цикл какую-то параллельность?

А если работа с последующими итерациями зависит от результата предыдущих???

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

b707 пишет:

А если работа с последующими итерациями зависит от результата предыдущих???

А если нет, то хоть по ядрам CUDA всё параллель.  :) 

sadman41
Offline
Зарегистрирован: 19.10.2016

Цикл - это не только расчёт CRC, но и обслуживание равноправных TCP-сессий, например.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

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/

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

вообще не понимаю, как можно вносить в такой цикл какую-то параллельность?

А если работа с последующими итерациями зависит от результата предыдущих???

Так философский смысл foreach как раз в том, что последовательность пофиг. Если нужна явная последовательность - надо использовать другие циклы.

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

Что-то я сегодня аж в 4х разных темах облажался... и всюду одинаково - начинаю отвечать про вещи. о которых даже не слыхал...

Вот как с этим foreach - никогда не приходило в голову, что это ДРУГОЙ цикл, всегда считал его просто новомодным синонимом for и потому не использовал...

Когда не видишь в чем-то новизны - это она, старость....

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:

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.

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

Евгений! Поясни, почему именно так:
f or ( ; __begin ! = __end; ++__begin ) {
а не так:
f or ( ; __begin ! = __end; __begin++ ) {

 

sadman41
Offline
Зарегистрирован: 19.10.2016

В случае применения списочных переменных... Или как они там по-научному отзываются... префиксная операция более дешевая с точки зрения ресурсоемкости.

Например, как в поше - запросил у системы список USB устройств, она вывалила лист с айтемами по 300кб и по нему нужно пройтись. Постфиксная операция заставит держать в памяти и предыдущий айтем и текущий. А префиксная - только текущий. Примерно такой смысл.

С простыми типами компилятор "для ардуины" справляется и особой разницы между постфиксом и префиксом наблюдать не удаётся.

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

sadman41 пишет:
С простыми типами компилятор "для ардуины" справляется и особой разницы между постфиксом и префиксом наблюдать не удаётся.

понял, благодарю

rkit
Offline
Зарегистрирован: 23.11.2016

Для x++ нужно делать копию x.

sadman41
Offline
Зарегистрирован: 19.10.2016

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