다음 스 니펫은 TimerOne 라이브러리 소스 코드 에서 가져온 것입니다 .
// TimerOne.h:
void (*isrCallback)();
// TimerOne.cpp:
ISR(TIMER1_OVF_vect) // interrupt service routine that wraps a user defined function supplied by attachInterrupt
{
Timer1.isrCallback();
}
// TimerOne.cpp:
void TimerOne::attachInterrupt(void (*isr)(), long microseconds)
{
if(microseconds > 0) setPeriod(microseconds);
isrCallback = isr; // register the user's callback with the real ISR
TIMSK1 = _BV(TOIE1); // sets the timer overflow interrupt enable bit
resume();
}
질문 : 타이머가 이미 실행 중이고 주 프로그램이 호출 하면 함수 포인터 할당 중에attachInterrupt()
타이머 인터럽트가 발생할 수 있습니까? 그런 다음 운이 좋은 타이밍에서 함수 포인터는 이전 주소와 새 주소의 일부로 구성되어 ISR이 가짜 위치로 이동합니까?isrCallback = isr;
Timer1.isrCallback();
함수 포인터가 확실히 1 바이트보다 넓고> 1 바이트 데이터에 액세스하는 것이 원자 적이 지 않기 때문에 이것이 사실이라고 생각합니다. 가능한 해결 방법은 다음과 같습니다.
- 를 호출
detachInterrupt()
하기 전에 타이머가 실행되고 있지 않은지 확인하려면 항상 호출 하십시오 (attachInterrupt()
예 : Timer1 문서를 명확하게 함). - 또는 Timer1을 수정하여 직전에 타이머 오버플로 인터럽트를 비활성화합니다.
isrCallback = isr;
이것이 의미가 있습니까, 아니면 Timer1
내가 놓친 소스 또는 함수 포인터 할당에 뭔가가 있습니까?