นี่คือตัวอย่างสำหรับ Arduino ที่ใช้ฟังก์ชั่น clockCyclesPerMicrosecond () เพื่อคำนวณนาฬิกาที่ผ่านไปแล้ว รหัสนี้จะรอ 4 วินาทีจากนั้นพิมพ์เวลาที่ผ่านไปตั้งแต่เริ่มต้นโปรแกรม ค่าที่เหลือ 3 คือเวลาทั้งหมด (ไมโครวินาที, มิลลิวินาที, รอบนาฬิกาทั้งหมด) และเวลาส่วนใหญ่ที่ถูกต้อง 3 ครั้งคือ:
เอาท์พุท:
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
ฉันแน่ใจว่ามีคำอธิบายที่สมเหตุสมผลว่าทำไมลูปแรกเกินไปมีวงจรนาฬิกาที่ผ่านไปสั้นกว่าส่วนใหญ่และทำไมลูปอื่น ๆ ทั้งหมดสลับระหว่างความยาวสองรอบของนาฬิกา
รหัส:
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: หากคุณลบการหน่วงเวลา 4 วินาทีคุณจะเริ่มเห็นผลกระทบของ Serial.print () ชัดเจนยิ่งขึ้น หมายเหตุ: ที่นี่ 2 วิ่งจะถูกเปรียบเทียบ ฉันได้รวม 4 ตัวอย่างใกล้ ๆ กันจากบันทึกที่เกี่ยวข้อง
เรียกใช้ 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
เรียกใช้ 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
เวลาที่ผ่านไปจะเพิ่มขึ้นตามเวลาดำเนินการทั้งหมด หลังจากผ่านไปหนึ่งวินาทีนาฬิกาจะเพิ่มโดยเฉลี่ยจาก 40k เป็น 44k สิ่งนี้เกิดขึ้นอย่างสม่ำเสมอไม่กี่มิลลิวินาทีหลังจาก 1 วินาทีและนาฬิกาที่ผ่านไปยังคงอยู่ประมาณ 44k เป็นเวลาอย่างน้อย 10 วินาทีถัดไป (ฉันไม่ได้ทดสอบเพิ่มเติม) นี่คือเหตุผลที่การตรวจสอบมีประโยชน์หรือจำเป็น บางทีประสิทธิภาพที่ลดลงเกี่ยวข้องกับการกำหนดค่าหรือข้อบกพร่องในอนุกรมหรือไม่ หรือบางทีรหัสไม่ได้ใช้หน่วยความจำอย่างเหมาะสมและมีการรั่วไหลที่มีผลต่อประสิทธิภาพ ฯลฯ