이것은 clockCyclesPerMicrosecond () 함수를 사용하여 통과 한 클럭을 계산하는 Arduino의 예입니다. 이 코드는 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);
}
주석 : 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
경과 시간은 총 실행 시간에 따라 증가합니다. 1 초가 지난 후 클럭은 평균 40k에서 44k로 증가합니다. 이것은 1 초 후에 몇 밀리 초 동안 일관되게 발생하며 경과 된 시계는 최소한 다음 10 초 동안 44k 정도 남아 있습니다 (추가 테스트는하지 않았습니다). 이것이 모니터링이 유용하거나 필요한 이유입니다. 아마도 효율성 감소는 구성이나 버그의 직렬화와 관련이 있습니까? 또는 코드가 메모리를 올바르게 사용하지 않고 성능에 영향을 미치는 누수가 있습니다.