@annonomus chim cánh cụt, chắc chắn chúng ta có thể Mặc dù mã biên dịch thành 1180 byte flash + 13 byte RAM cho một máy tính của tôi, chúng tôi có thể cải thiện nó :) vì vậy, thách thức golf được chấp nhận và một vài mẹo hữu ích vì chúng tôi đang kinh doanh học tập.
Bước 1: giảm yêu cầu biến. Sử dụng một int cho một cổng led có vẻ hơi quá mức, chúng tôi chắc chắn không có 65535 cổng IO có thể định địa chỉ trên arduino :) Vì vậy, chúng tôi thay đổi nó thành một byte chỉ để cho vui. Chúng tôi sẽ thay đổi nó thành #define sau này, nhưng để cho thấy tác động của việc sử dụng các loại biến quá lớn.
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
}
Biên dịch thành 1172 byte + RAM 13 byte. Điều này giúp tiết kiệm 8 byte flash do ít thao tác cần thiết hơn cho byte thay vì số nguyên. Tôi sẽ mong đợi 12 byte ram, nhưng không sao. Không nhiều, nhưng mỗi byte được lưu là tốt.
Bước 2: thay đổi biến thành định nghĩa khi nó có ý nghĩa. Ví dụ, byte dẫn là không cần thiết, pin sẽ không tự hàn.
#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
}
Biên dịch thành 1142 byteflash + 11 byte ram. Đã lưu 38 byte. Điều này là do ít hoạt động đăng ký cần thiết để lấy giá trị int. Ngoài ra, chúng tôi đã lưu 2 byte từ RAM. (vẫn thắc mắc tại sao byte không biên dịch thành 1 byte ram ít hơn .....)
Bước 3: tối ưu hóa mã. Tôi thấy 2 sự chậm trễ. Tôi tự hỏi nếu tôi thay đổi nó thành 1 độ trễ thì nó sẽ tiết kiệm không gian, nhưng tôi phải tìm ra giá trị của chân LED và chuyển đổi (đảo ngược) nó. Chúng ta có thể làm điều đó với digitalRead (), nhưng nó có tiết kiệm không gian không?
#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
}
Biên dịch thành 1134 byte + 11 byte ram. Yay! 8 byte khác. Điều đó làm cho tổng cộng 46 byte và ít hơn 2 dòng mã.
Ngoài ra một mẹo chung khác về giảm mã hóa. Đừng sử dụng lớp String. Đó là LỚN, tìm hiểu cách xử lý các mảng char, strcpy (), strcmp (). Nếu tất cả những gì bạn có là một số thao tác chuỗi cơ bản, việc sử dụng lớp String chủ yếu chỉ làm lãng phí không gian trên cả flash và RAM.