วิธีที่ดีที่สุดในการกำหนดพิน I / O คืออะไร?


9

ฉันอ่านคำจำกัดความเช่น

const int ledPin = 9;

และนอกจากนี้ยังมี

#define ledPin 9

ฉันรู้ว่าคำจำกัดความเช่น

int ledPin = 9;

เป็นการปฏิบัติที่ไม่ดีถ้าคุณจะไม่เปลี่ยน (ซึ่งโดยปกติคุณจะไม่ทำ) ถึงแม้ว่าฉันจะได้เห็นหลายครั้งในโปรแกรม Arduino ต้องการหนึ่งในสองอีกอันหนึ่ง

คำตอบ:


6

#define ledPin 9เป็นที่ต้องการ โดยการทำint ledPin = 9;คุณจะได้รับการจัดสรรหน่วยความจำที่มีค่าถูกนำมาใช้ทุกครั้งที่คุณใช้int แตกต่างกันในแง่ที่ไม่ได้จัดสรรหน่วยความจำ มีหน่วยความจำที่เรียกว่า ก่อนที่จะรวบรวมทุกคน "ledPin" S ในรหัส (นอกเหนือสตริง) จะถูกแทนที่ด้วย ดังนั้นโดยทั่วไปledPin#defineledPin9

digitalWrite(ledPin);

กลายเป็น

digitalWrite(9);

ข้อดีของ#define: บันทึกหน่วยความจำและเนื่องจากทั้งหมดledPinจะถูกแทนที่ด้วย9 ก่อนการดำเนินการจะช่วยประหยัดเวลาโปรเซสเซอร์

ไม่สำคัญในรหัสขนาดเล็กจริงๆ ...


คอมไพล์เลอร์แบบฝังตัวนั้นแย่มาก ๆ พวกเขาไม่พับอย่างต่อเนื่องเมื่อใช้const intหรือไม่?
Chuu

1
@chuu เท่าที่ฉันรู้ Arduino ใช้ gcc สำหรับ avr ดังนั้นจึงควรปรับให้เหมาะสม คำตอบที่นี่ไม่ค่อยแสดงความเข้าใจในการฝึกฝนที่ดีใน C ++
chbaker0

3
ใน C ++ const int ledPin = 9;เป็นที่ต้องการมากกว่า 2 ตัวเลือกอื่น ๆ สิ่งนี้จะไม่จัดสรรหน่วยความจำสำหรับข้อintยกเว้นถ้าคุณกำหนดตัวชี้ไปยังที่อื่นซึ่งไม่มีใครทำ
jfpoilpret

Const int จัดสรรหน่วยความจำ @jfpoilpret #define ไม่ใช้หน่วยความจำใด ๆ เพราะมันเป็นเพียงชื่อสัญลักษณ์ของการแสดงออกและไม่ใช่ชื่อของหน่วยความจำ ...

ลองชมลิงค์นี้cplusplus.com/forum/beginner/28089และดูด้วยตัวคุณเอง มิฉะนั้นเพียงแค่ทำการตรวจสอบด้วย Arduino IDE: ตรวจสอบขนาดข้อมูลด้วย const และด้วย #define
jfpoilpret

4

พูดอย่างเคร่งครัด#defineวิธีการจะใช้หน่วยความจำน้อยลงเล็กน้อย ความแตกต่างมักจะเล็กน้อย หากคุณต้องการลดการใช้หน่วยความจำการเพิ่มประสิทธิภาพอื่น ๆ อาจมีประสิทธิภาพมากกว่า

ข้อโต้แย้งในความโปรดปรานของการใช้const intเป็นประเภทความปลอดภัย เมื่อใดก็ตามที่คุณอ้างถึงหมายเลขพินนั้นตามตัวแปรคุณจะรู้ว่าคุณได้รับข้อมูลประเภทใด มันอาจจะได้รับการส่งเสริม / แปลงโดยนัยหรือชัดเจนโดยรหัสที่ใช้มัน แต่มันควรจะทำงานในรูปแบบที่ชัดเจนมาก

ในทางตรงกันข้ามค่าในการ#defineเปิดให้ตีความ ส่วนใหญ่เวลามันอาจจะไม่ทำให้คุณมีปัญหาใด ๆ เลย คุณเพียงแค่ต้องระวังตัวเล็กน้อยหากคุณมีรหัสซึ่งทำให้มีข้อสันนิษฐานเกี่ยวกับชนิดหรือขนาดของค่า

โดยส่วนตัวแล้วฉันมักจะชอบความปลอดภัยมากกว่าประเภทเว้นแต่ว่าฉันมีความต้องการอย่างจริงจังในการบันทึกหน่วยความจำ


ฉันอยู่ในค่าย #dine จนกว่าฉันจะอ่านคำตอบของปีเตอร์ เดาฉันรู้ว่าใครจะเป็น refactoring code สุดสัปดาห์นี้ ;)
linhartr22

2

อาจเป็นวิธีที่ดีที่สุด
const uint8_t LED_PIN = 9; // may require to #include <stdint.h>
หรือ
const byte LED_PIN = 9; // with no include necessary
const unsigned char LED_PIN = 9; // similarly
ชื่ออยู่ในตัวพิมพ์ใหญ่ตามแบบฝึกหัดทั่วไปใน C ++ (และอื่น ๆ ) เพื่อตั้งชื่อค่าคงที่ สิ่งนี้ไม่ควรใช้ RAM ใด ๆ ในตัวเองและใช้หน่วยความจำโปรแกรมประมาณ 1 ไบต์ต่อการใช้งาน
อย่างไรก็ตามอาจมีปัญหาเมื่อจำนวนสูงกว่า 127 และมีการขยายสัญญาณในขณะที่ได้รับการเลื่อนตำแหน่งเป็นจำนวนเต็มขนาดใหญ่ที่ลงนาม (ไม่แน่ใจทั้งหมดนี้) แม้ว่าจะไม่เกิดขึ้นกับหมายเลขพิน


-1

ไม่เพียง แต่จะ

const int ledPin = 9;

take up RAM แต่ในกรณีนี้จะใช้ RAM มากกว่าที่จำเป็นdigitalWrite(uint8_t, uint8_t)เพียงต้องการอาร์กิวเมนต์หนึ่งไบต์และ int มักจะเป็นสองไบต์ (ขึ้นอยู่กับคอมไพเลอร์ แต่โดยทั่วไป) โปรดทราบว่าคุณสามารถให้ชนิดที่ชัดเจนตามตัวอักษรใน #define:

#define ledPin ((int)9) 

แม้ว่าในบริบทเช่นอาร์กิวเมนต์ของฟังก์ชันที่ต้องการชนิดที่เฉพาะเจาะจง (เนื่องจากฟังก์ชันถูกสร้างต้นแบบอย่างถูกต้อง!) มันจะถูกส่งโดยปริยายหรือได้รับข้อความแสดงข้อผิดพลาดหากประเภทไม่ตรงกัน


@DrivebyDownvoter คุณจะแสดงความคิดเห็นกับเหตุผลของคุณหรือไม่
JRobert
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.