STM32 질문/답변

인터럽트 서비스 루틴에서 다른 함수 호출할때..

james 1 3,482 2017.11.25 00:33
일반적으로
인터럽트 한수 내에선  코드를 최소화 하고
루틴을 빠져나가잖아요?

UART 수신 인터럽트  함수를 예로 들자면
인터럽트가  발생하면 
인터럽트  팬딩비트 클리어 하고
버퍼에 저장하고  카운터 증가 하고
Tail  체크 하고
만약 tail이 도착 하면  플래그 발생하고
이정도 코드로  작성 하는데요

여기에서
Tail이  도착 하면  플래그  발생하고
미리  등록해둔 콜백 함수를 call 하게 되면(여전히 uart인터럽트 함수내에 있죠)
다음 인터럽트가  발생하지 않나요?

이미 팬딩 비트는 클리어 돼있으니 인터 럽트는 발생 할거 같은데요
의문점은
인터럽트 함수를 빠져 나간 상태가 아니기 때문에  다음  uart 인터 럽트 발생시 이 함수는 call되지 않을 까  라는 생각이 드네요?

혹시나  “그냥 처음 처럼 플래그 발생하고  빠져 나가면 안돼? “
라고 할 수도 있는데요
왜 이런 식으로  처리 하고 싶냐면요

처리 해야 할  이벤트가 여러개 일때요
여러가지 인터럽트 마다  플래그 처리만 하고 빠져 나가면
어디선간 그 플래그를 감지 해서  또 처리 해 주야 하잖아요?

궁극적으로 콜백 함수를 사용 하고 싶은데 
메인 함수 내에서  wile문 돌리면서  플래그 들을 감지 하지 않고

이벤트 시점에  맞춰서  미리 등록 해둔 콜백  함수를 그때 그때 call하고 싶거든요?

그래서 생각한것이  인터 럽트 서비스 함수 내에서  팬딩비트를  클리어 하고 다른 콜백 한수를  call하면  안되나 하는 의문이 생겨서요

말이 엄청 길어 졌네요...

Comments

plainy 2017.11.30 00:41
몇가지 질문을 해주셨는데요.
먼저 인터럽트 핸들러 내에서 pending bit를 clear한 후 바로 똑같은 인터럽트가 들어오면 해당 인터럽트를 모두 수행한 후 바로 인터럽트가 발생됩니다.
심한경우 인터럽트 핸들러만 계속 수행되어 빠져나가지 못하는 경우도 있습니다.

일반적으로 핸들러내에서 처리를 하는것이 맞으나 수행 시간이 길어지는 경우 말씀하신것과 같이 플래그만 세워놓고 인터럽트 핸들러 밖에서 처리하게 됩니다.
핸들러 내에서 다른 함수를 사용 하여도 말씀하신것과 같이 핸들러내에있기 때문에 의미가 없습니다.

플래그를 설정하고 처리하시는것이 가장 일반적인 방법입니다.

아니면 RTOS를 사용하여 각 thread별로 동작을 처리하는 것도 고려해 보시기 바랍니다.
Category
글이 없습니다.
글이 없습니다.
Facebook Twitter GooglePlus KakaoStory NaverBand