Bir G / Ç pini tanımlamanın en iyi yolu nedir?


9

Gibi tanımları okudum

const int ledPin = 9;

ve ayrıca

#define ledPin 9

Bunun gibi bir tanımın

int ledPin = 9;

Arduino programlarında bunu birkaç kez görmeme rağmen (genellikle yapmayacağınız) değiştirmeyecekseniz kötü bir uygulamadır. Diğer ikisinden hangisi tercih edilir?

Yanıtlar:


6

#define ledPin 9tercih edilir. Bunu yaparak , değeri her kullandığınızda kullanılan int ledPin = 9;bir intbellek ayıracaksınız ledPin. #definebellek ayırmaması anlamında farklıdır. denilen hafıza yok ledPin. Derlemeden önce koddaki tüm "ledPin" ler (dizeler dışında) ile değiştirilir 9. Temel olarak

digitalWrite(ledPin);

olur

digitalWrite(9);

Avantajları #define: Bellek tasarrufu sağlar ve yürütmeden önceledPin hepsi değiştirildiği için işlemci zamanından tasarruf sağlar.9

Küçük kodlarda gerçekten önemli değil ...


Gömülü derleyiciler gerçekten o kadar kötü const intmü, sürekli katlama yapmıyorlar mı?
Chuu

1
Bildiğim kadarıyla Arduino avr için gcc kullanıyor. Bu yüzden neredeyse kesinlikle optimize edilmelidir. Burada cevaplar C ++
chbaker0

3
C ++ 'da, const int ledPin = 9;diğer 2 seçeneğe tercih edilir. intKimsenin yapamayacağı bir yere bir işaretçi tanımlarsanız, bu durum bir bellek ayırmayacaktır .
jfpoilpret

Const int bellek @jfpoilpret ayırır. #define herhangi bir hafızayı

Bu bağlantıya göz atın cplusplus.com/forum/beginner/28089 ve kendiniz görün. Aksi takdirde Arduino IDE ile kontrolü gerçekleştirin: veri boyutunu const ve #define ile kontrol edin.
jfpoilpret

4

Açıkçası, #defineyaklaşım biraz daha az bellek kullanır. Fark genellikle küçüktür. Bellek kullanımını azaltmanız gerekiyorsa, diğer optimizasyonlar muhtemelen çok daha etkili olacaktır.

Kullanarak lehine bir argüman const intolan tip emniyet . Bu pin numarasına değişkenle nerede başvurursanız olun, tam olarak hangi veri türünü aldığınızı bilirsiniz. Onu kullanan kod tarafından örtülü veya açık bir şekilde tanıtılabilir / dönüştürülebilir, ancak çok açık bir şekilde davranmalıdır.

Aksine, a'daki değer #defineyoruma açıktır. Zamanın büyük çoğunluğu, muhtemelen size herhangi bir soruna neden olmaz. Değerin türü veya boyutu hakkında varsayımlar yapan bir kodunuz varsa, biraz dikkatli olmanız gerekir.

Şahsen, hafızayı korumak için çok ciddi bir ihtiyacım olmadıkça, neredeyse her zaman tip güvenliğini tercih ederim.


Peter'ın cevabını okuyana kadar #define kampındaydım. Sanırım bu hafta sonu kodu kimin yeniden düzenleyeceğini biliyorum. ;)
linhartr22

2

Muhtemelen en iyi yol olurdu
const uint8_t LED_PIN = 9; // may require to #include <stdint.h>
veya
const byte LED_PIN = 9; // with no include necessary
const unsigned char LED_PIN = 9; // similarly
isim sabitleri adlandırmak için C ++ (ve diğerleri) genel uygulama göre kapaklar içinde. Bu, kendi içinde RAM kullanmamalı ve kullanım başına yaklaşık 1 bayt program belleği kullanmalıdır.
Ancak, orada belki o pin numaraları ile bunun olma olasılığının düşük olmasına rağmen sayı, daha yüksek 127 ve oturum genişletilmiş (değil tamamen emin bu konuda) büyük imzalı tamsayı terfi etmeden ederken olduğunda sorunlar olabilir.


-1

Sadece

const int ledPin = 9;

RAM alır, ancak bu durumda, digitalWrite(uint8_t, uint8_t)yalnızca bir baytlık bağımsız değişkenlere ihtiyaç duyduğundan gerekenden daha fazla RAM kullanır ve int genellikle iki bayttır (derleyiciye bağımlı, ancak tipik). Değişmeze #define içinde açık bir tür verebileceğinizi unutmayın:

#define ledPin ((int)9) 

belirli bir türün gerekli olduğu işlev bağımsız değişkeni gibi bir bağlamda (işlev düzgün şekilde prototiplendiğinden!), örtük olarak yayınlanır veya türler eşleşmezse bir hata iletisi alır.


@ DriveriveDownvoter, nedenleriniz hakkında yorum yapar mısınız?
JRobert
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.