@annonomus penguin แน่นอนว่าเราทำได้แม้ว่ารหัสจะรวมเป็น 1180 ไบต์แฟลช + RAM ขนาด 13 ไบต์สำหรับ uno บนคอมพิวเตอร์ของฉัน แต่เราสามารถปรับปรุงมันได้ :) ดังนั้นการยอมรับความท้าทายของกอล์ฟและเคล็ดลับที่มีประโยชน์เนื่องจากเราอยู่ในธุรกิจของ การเรียนรู้
ขั้นตอนที่ 1: ลดความต้องการตัวแปร การใช้ int สำหรับพอร์ตนำดูเหมือนว่าเกินความเป็นจริงเราไม่มีพอร์ต IO ที่สามารถระบุได้ 65535 แอดเดรสใน arduino :) ดังนั้นเราจึงเปลี่ยนเป็นไบต์เพียงเพื่อความสนุกของมัน เราจะเปลี่ยนเป็น #define ในภายหลัง แต่เพื่อแสดงผลกระทบของการใช้ประเภทตัวแปรที่มีขนาดใหญ่เกินไป
byte led = 13;
int val;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
blink();
val = digitalRead(10);
}
void blink() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
คอมไพล์เป็น RAM 1172 + 13 ไบต์ วิธีนี้ช่วยประหยัด 8 ไบต์ของแฟลชเนื่องจากการทำงานที่จำเป็นน้อยลงสำหรับไบต์แทนจำนวนเต็ม ฉันคาดว่าจะได้ ram 12 ไบ แต่ก็โอเค ไม่มากนัก แต่ทุก ๆ ไบต์ที่บันทึกไว้นั้นดี
ขั้นตอนที่ 2: เปลี่ยนตัวแปรเป็นนิยามเมื่อมันสมเหตุสมผล ตัวอย่างเช่นไม่จำเป็นต้องใช้ไบต์นำ
#define LED 13
int val;
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
blink();
val = digitalRead(10);
}
void blink() {
digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
คอมไพล์เป็น 1142 ไบต์ไบต์ + RAM 11 ไบต์ บันทึกไปแล้ว 38 ไบต์ นี่คือเนื่องจากการดำเนินการลงทะเบียนน้อยลงที่จำเป็นในการดึงค่า int นอกจากนี้เรายังบันทึก 2 ไบต์จาก RAM (ยังคงสงสัยว่าทำไมไบต์ไม่คอมไพล์เป็น RAM น้อยกว่า 1 ไบต์ ..... )
ขั้นตอนที่ 3: ปรับรหัสให้เหมาะสม ฉันเห็นความล่าช้า 2 ครั้ง ฉันสงสัยว่าถ้าฉันเปลี่ยนมันเป็น 1 ดีเลย์มันจะประหยัดพื้นที่ แต่ฉันต้องคิดออกค่าของพิน LED และสลับ (สลับ) มัน เราสามารถทำได้ด้วย digitalRead () แต่มันจะประหยัดพื้นที่หรือไม่
#define LED 13
int val;
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
blink();
val = digitalRead(10);
}
void blink() {
digitalWrite(LED, !digitalRead(LED)); // toggle the led based on read value
delay(1000); // wait for a second and spare yourself the other delay
}
รวบรวมเป็น 1134 ไบต์ + 11 ไบต์ ram เย้! อีก 8 ไบต์ นั่นทำให้จำนวน 46 ไบต์และโค้ดน้อยลง 2 บรรทัด
อีกหนึ่งเคล็ดลับทั่วไปในการลดขนาดโค้ด อย่าใช้คลาส String มันมีขนาดใหญ่มากเรียนรู้วิธีจัดการกับอาร์เรย์ char, strcpy (), strcmp () หากคุณมีการใช้งานสตริงขั้นพื้นฐานการใช้งานคลาส String นั้นส่วนใหญ่จะเป็นการสิ้นเปลืองพื้นที่บนแฟลชและ RAM