Phần mã trên lõi ATmega có thiết lập () và loop () như sau:
#include <Arduino.h>
int main(void)
{
init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
Khá đơn giản, nhưng có chi phí hoạt động của serialEventRun (); trong đó.
Hãy so sánh hai bản phác thảo đơn giản:
void setup()
{
}
volatile uint8_t x;
void loop()
{
x = 1;
}
và
void setup()
{
}
volatile uint8_t x;
void loop()
{
while(true)
{
x = 1;
}
}
X và dễ bay hơi chỉ để đảm bảo nó không được tối ưu hóa.
Trong ASM được sản xuất, bạn nhận được các kết quả khác nhau:
Bạn có thể thấy while (true) chỉ thực hiện rjmp (nhảy tương đối) một vài hướng dẫn, trong khi loop () thực hiện phép trừ, so sánh và gọi. Đây là 4 hướng dẫn vs 1 hướng dẫn.
Để tạo ASM như trên, bạn cần sử dụng một công cụ có tên avr-objdump. Điều này được bao gồm với avr-gcc. Vị trí khác nhau tùy thuộc vào hệ điều hành nên dễ dàng nhất để tìm kiếm theo tên.
avr-objdump có thể hoạt động trên các tệp .hex, nhưng những tệp này thiếu nguồn gốc và nhận xét. Nếu bạn vừa xây dựng mã, bạn sẽ có tệp .elf chứa dữ liệu này. Một lần nữa, vị trí của các tệp này thay đổi theo HĐH - cách dễ nhất để xác định vị trí của chúng là bật tính năng biên dịch dài dòng trong các tùy chọn và xem nơi các tệp đầu ra đang được lưu trữ.
Chạy lệnh như sau:
avr-objdump -S output.elf> asm.txt
Và kiểm tra đầu ra trong một trình soạn thảo văn bản.