인용 된 문구는 없습니다 그것은 단지 사물이 작동하는 방법에 대한 성명, 경고.
올바르게 작성된 인터럽트 루틴 을 사용 millis()
하거나 사용하는 데 본질적으로 아무런 문제가 없습니다 micros()
.
반면에, 잘못 작성된 인터럽트 루틴 내에서 아무것도하지 않는 것은 정의상 잘못입니다.
작업을 수행하는 데 몇 마이크로 초 이상 걸리는 인터럽트 루틴은 잘못 작성되었습니다.
한마디로 : 제대로 작성된 인터럽트 루틴은 발생하지 않습니다 또는에서 발생할 문제 millis()
나 micros()
.
편집 : " Arduino 마이크로 기능 검사 "웹 페이지에 설명 된 "micros ()가 비정상적으로 작동하는 이유"와 관련 micros()
하여 일반 Uno의 코드는 기능적으로
unsigned long micros() {
return((timer0_overflow_count << 8) + TCNT0)*(64/16);
}
timer0_overflow_count
timer-0 카운트 레지스터 에서 3 개의 가장 낮은 바이트 와 1 바이트 로 구성된 4 바이트의 부호없는 long을 반환합니다 .
는 timer0_overflow_count
바이 밀리 초마다 한번씩 증가 TIMER0_OVF_vect
인터럽트 핸들러로 설명 아두 이노 밀리 기능 검사 웹 페이지.
인터럽트 핸들러가 시작되기 전에 AVR 하드웨어는 인터럽트를 비활성화합니다. (예를 들어, 인터럽트 핸들러가 여전히 인터럽트가 비활성화 된 상태에서 5 밀리 초 동안 실행 된 경우, 최소 4 개의 타이머 0 오버 플로우가 누락됩니다. [Arduino 시스템에서 C 코드로 작성된 인터럽트는 재진입 할 수 없지만 (동일한 핸들러 내에서 여러 개의 겹치는 실행을 올바르게 처리 할 수는 없지만) 시간이 걸리는 프로세스를 시작하기 전에 인터럽트를 재 활성화 할 수있는 재진입 자 어셈블리 언어 핸들러를 작성할 수 있습니다.]
다시 말해 타이머 오버플로는 "스택"되지 않습니다. 이전 오버 플로우의 인터럽트가 처리되기 전에 오버 플로우가 발생할 때마다 millis()
카운터는 밀리 초를 잃어 버리고 timer0_overflow_count
차례로 불일치 micros()
도 밀리 초만큼 잘못됩니다.
"너무 긴 시간 동안 타이머 인터럽트 차단을 방지하기 위해"인터럽트 처리의 상한으로 "500 μs 미만"을 고려하면 1024 μs 미만 (예 : 1020 μs)까지 올라갈 수 있습니다 millis()
. 시각. 그러나 나는 5μs 이상을 sluggard로, 10μs 이상을 느리게, 20μs를 달팽이 모양으로 취하는 인터럽트 핸들러를 생각합니다.