Đây là một ví dụ cho Arduino sử dụng hàm clockC đuaPerMicrosecond () để tính toán các đồng hồ đã qua. Mã này sẽ đợi 4 giây, sau đó in thời gian đã trôi qua kể từ khi bắt đầu chương trình. 3 giá trị còn lại là tổng thời gian (micro giây, mili giây, tổng chu kỳ đồng hồ) và hầu hết 3 phải là thời gian trôi qua:
Đầu ra:
clocks for 1us:16
runtime us, ms, ck :: elapsed tme us, ms ck
4003236 4002 64051776 :: 4003236 4002 64051760
8006668 8006 128106688 :: 4003432 4004 64054912
12010508 12010 192168128 :: 4003840 4004 64061440
16014348 16014 256229568 :: 4003840 4004 64061440
20018188 20018 320291008 :: 4003840 4004 64061440
24022028 24022 384352448 :: 4003840 4004 64061440
28026892 28026 448430272 :: 4004864 4004 64077824
32030732 32030 512491712 :: 4003840 4004 64061440
36034572 36034 576553152 :: 4003840 4004 64061440
40038412 40038 640614592 :: 4003840 4004 64061440
44042252 44042 704676032 :: 4003840 4004 64061440
48046092 48046 768737472 :: 4003840 4004 64061440
52050956 52050 832815296 :: 4004864 4004 64077824
Tôi chắc chắn có một lời giải thích hợp lý tại sao các vòng lặp đầu tiên có chu kỳ đồng hồ trôi qua ngắn hơn hầu hết và tại sao tất cả các vòng lặp khác chuyển đổi giữa hai độ dài của chu kỳ đồng hồ.
Mã số:
unsigned long us, ms, ck;
unsigned long _us, _ms, _ck;
unsigned long __us, __ms, __ck;
void setup() {
Serial.begin(9600);
}
boolean firstloop=1;
void loop() {
delay(4000);
if (firstloop) {
Serial.print("clocks for 1us:");
ck=microsecondsToClockCycles(1);
Serial.println(ck,DEC);
firstloop--;
Serial.println("runtime us, ms, ck :: elapsed tme us, ms ck");
}
_us=us;
_ms=ms;
_ck=ck;
us=micros(); // us since program start
ms=millis();
//ms=us/1000;
ck=microsecondsToClockCycles(us);
Serial.print(us,DEC);
Serial.print("\t");
Serial.print(ms,DEC);
Serial.print("\t");
Serial.print(ck,DEC);
Serial.print("\t::\t");
__us = us - _us;
__ms = ms - _ms;
__ck = ck - _ck;
Serial.print(__us,DEC);
Serial.print("\t");
Serial.print(__ms,DEC);
Serial.print("\t");
Serial.println(__ck,DEC);
}
Sidenote: nếu bạn loại bỏ độ trễ 4 giây, bạn sẽ bắt đầu thấy các hiệu ứng của Serial.print () rõ ràng hơn nhiều. Lưu ý, ở đây 2 lần chạy được so sánh. Tôi chỉ bao gồm 4 mẫu gần nhau từ nhật ký tương ứng của họ.
Chạy 1:
5000604 5000 80009664 :: 2516 2 40256
6001424 6001 96022784 :: 2520 3 40320
7002184 7002 112034944 :: 2600 3 41600
8001292 8001 128020672 :: 2600 3 41600
Chạy 2:
5002460 5002 80039360 :: 2524 3 40384
6000728 6000 96011648 :: 2520 2 40320
7001452 7001 112023232 :: 2600 3 41600
8000552 8000 128008832 :: 2604 3 41664
Thời gian trôi qua tăng trên tổng thời gian chạy. Sau một giây trôi qua, đồng hồ tăng trung bình từ 40k lên 44k. Điều này xảy ra liên tục vài mili giây sau 1 giây và đồng hồ đã trôi qua vẫn còn khoảng 44k trong ít nhất 10 giây tiếp theo (tôi chưa thử nghiệm thêm). Đây là lý do tại sao giám sát là hữu ích hoặc cần thiết. Có lẽ hiệu quả giảm có liên quan đến cấu hình hoặc lỗi nối tiếp? Hoặc có lẽ mã không sử dụng đúng bộ nhớ và bị rò rỉ ảnh hưởng đến hiệu suất, v.v.