В чем отличие при объявлении pin'а?
- Войдите на сайт для отправки комментариев
Чт, 07/05/2015 - 20:20
Всем привет.
Господа, разъясните новичку следующий вопрос:
Могу pin 5 объявить через #define:
#define LED_PIN 5
void setup() {
pinMode(LED_PIN, HIGH);
}
void loop() {
бла-бла-бла
}
а могу через константу:
const int ledPin = 13;
void setup() {
pinMode(ledPin, HIGH);
}
void loop() {
бла-бла-бла
}
в чем принципиальное различие? И как правильно?
Вопрос философский, IMHO.
Код, генерируемый компилятором для данного примера кода одинаковый для обоих вариантов. Номер пина подставляется как константа в обоих случаях.
По-большому счету для C++ define использовать нежелательно, хотя и никто особо не запрещает.
Впрочем может кто-нибудь объяснит это более точно с точки зрения стандартов.
Лично я использую оба варианта.
Если по простому :)
#define LED_PIN 5
Везде где встречается в тексте LED_PIN, компилятор будет вставлять 5.
constintledPin = 13;Компилятор выделит память и запишет туда 13. Потом можно будет читать из этой ячейки.
Потом можно будет читать из этой ячейки.
А в каком случае это может пригодиться? Тоже по простому :)
Для экономии памяти.
Если по простому, то это в дальнейшем позволяет быстро заменить номер пина без поиска всех мест где он используется.
Экономии памяти здесь нет.
Это то понятно, и это относится к обеим формам записи.
В каком случае может пригодится чтение из ячейки памяти, в которую записана константа с номером пина?
мне лично пины больше через define нравится объявлять по нескольким причинам
1. в 1 варианте нельзя поменять значение led таким образом led=9, а во втором варианте легко
2. 2 вариант для объявления переменных, и можно случайно перепутать переменную с пином "константой". можно конечно через const объявить. но все же лучше отличать. так как через const также объявляются константы. а тут и то и другое константы. каша короче
Ассемблерный код для варианта #define
000002e6 <setup>: 2e6: 61 e0 ldi r22, 0x01 ; 1 2e8: 85 e0 ldi r24, 0x05 ; 5 2ea: 0c 94 78 01 jmp 0x2f0 ; 0x2f0 <pinMode> 000002ee <loop>: 2ee: 08 95 retАналогично для варианта const:
000002e6 <setup>: 2e6: 61 e0 ldi r22, 0x01 ; 1 2e8: 8d e0 ldi r24, 0x0D ; 13 2ea: 0c 94 78 01 jmp 0x2f0 ; 0x2f0 <pinMode> 000002ee <loop>: 2ee: 08 95 retНайдите здесь чтение из ячейки памяти.
Поскольку Ваш вопрос я не понял, могу сказать, только то, что const int - это не переменная, а константа и разница в этом есть, константа или переменная. Константы могут располагаться в памяти (как решит компилятор/оптимизатор), но чаще оптимальней подставить их прямо в код, нежели читать откуда то.
А вот переменные, как правило (но не всегда), могут занимать место в памяти.
:)) Какой ассемблер? У меня и без него голова кипит.
Ну Вы в состоянии посмотреть, даже не понимая, что текст идентичен.
Могу сказать, что здесь нет чтения, две загрузки констант в регистры и вызов pinMode. Всё.
С дефайнами имхо код читабельнее: константы в раделе дефайн, а переменные в разделе инициализации.
Я вот тоже столкнулся с такой проблемой. Очень большая разница между использованием #define и const
Совершенно непонятно почему этот код не работает:
#include <LiquidCrystal.h> LiquidCrystal lcd (2, 3, 4, 5, 6, 7); #define trigPin 12 #define echoPin 11 //const int trigPin = 11; //const int echoPin = 12; long duration; int distanceCm, distanceInch; void setup() { Serial.begin (9600); lcd.begin(16,2); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distanceCm= duration*0.034/2; distanceInch = duration*0.0133/2; lcd.setCursor(0,0); // Sets the location at which subsequent text written to the LCD will be displayed lcd.print("Distance: "); // Prints string "Distance" on the LCD lcd.print(distanceCm); // Prints the distance value from the sensor lcd.print(" cm"); Serial.print("Длительность: "); Serial.println(duration); Serial.print("Расстояние до объекта: "); Serial.print(distanceCm); Serial.println(" см."); delay(100);}в таком виде он работает очень странно (даже если вручную вместо trigPin и echoPin по тексту вписать 11 и 12 соответственно), дистанцию или ноль показывает или неверно (завышенно раз в 10),
а вот если написать const int trigPin = 11; const int echoPin = 12; все работает четко, интересно, что при этом длина скомпилированного кода одинаковая, отличаются только несколько байтов
кто может пояснить почему?
У меня все скомпилировалось в 1.8.8
Была ошибка в коде. Сорри
#define trigPin 12
#define echoPin 11
//const int trigPin = 11;
//const int echoPin = 12;
перепутаны номера пинов.
А я подумал не компилируется))