• 카테고리

    질문 & 답변
  • 세부 분야

    임베디드 · IoT

  • 해결 여부

    미해결

지연 인터럽트 관련 질문입니다.

22.08.23 00:50 작성 조회수 242

1

강의 잘 듣고 있습니다. 

HAL_GPIO_EXTI_Callback(EXTI15_10_IRQHandler)함수(이하 gpio call back isr)안에서 heavy 한 작업을 한다면 SYSTICK event가 상대적으로 적게 발생하는 이유에 대해서 정리했습니다. 이해 한게 맞는지와 질문들 확인 부탁드립니다. 

gpio call back isr 진행 도중 context switching이 이루어 지는 어떤 freertos kernel함수가 호출 될때 systick 이벤트가 발생한 상태이고 이 이벤트가 nested되어 있으면 systick 카운트를 증가하게 된다. 하지만, gpio call back 함수 내의 memset 함수 내부 진행을 보면 context switching 이벤트 발생하는 부분이 없음으로 이 memset함수 처리하는 동안에 발생하는 systick 이벤트는 사라지게 된다.  인터럽트 우선순위가 gpio call back isr 보다도 높은 systick 이벤트(systick isr)가 발생하더라도 카운터가 증가되지 않아 uart switch log 뒤에 따라오는 systick count값이 전 값과 크게 다르지 않게 된다. 

반면에 gpio call back 함수 진행 시 동작이 오래 걸리는 부분은 별도의 task1로 만들어 빼버리고 gpio call back isr은 종료를 하게 된다.실제로는 종료하기 전 Task1을 깨우게 되고 

가장 높은 우선순위 task로 context switching까지 해주고 나서 gpio call back 함수가 종료가 된다. 

추가 질문으로

1. context switching을 발생시키는 어떤 freertos kernel 함수는 gpio call back isr 함수안에서 portYIELD_FROM_ISR() 뿐인가요?

2.portYIELD_FROM_ISR 함수가 gpio call back 마지막에 있던데 목적은 context switching 하는거같은데

모든 isr 함수 마지막에는 portYIELD_FROM_ISR 함수가 오게 되는건가요? 아니면 어떠한 함수든 context switching 이 이루어 지는 함수가 오게 되나요?

3. gpio call back 마지막에 있는 함수 대신 vTaskSwitchContext()함수를 넣어주게 된다면

시간이 좀더 오래 걸리긴 하겠지만 vTaskSwitchContext()안의{.....taskSELECT_HIGHEST_PRIORITY_TASK()..} 함수가 진행이 되어 동일한 효과를 얻게 되나요? (systick 이벤트가 nested된 상태라면 context switching 발생 후 systick isr로 들어가서 counter 값이 증가하게 되고 systick isr 종료)

 

 

답변 1

답변을 작성해보세요.

0

안녕하세요. 김영선님!

궁금하신 점에 대해서 아래와 같이 답변을 답니다:)

1. context switching을 발생시키는 어떤 freertos kernel 함수는 gpio call back isr 함수안에서 portYIELD_FROM_ISR() 뿐인가요?

[ANS] 인터럽트 핸들러가 종료된 이후 즉시 HPT(highest prio task) 태스크 선점이 처리될 수 있도록 하고 있는 코드가 portYIELD_FROM_ISR() 함수 입니다. 관련 강좌는 인터럽트와 선점과의 관계[1:11]

2.portYIELD_FROM_ISR 함수가 gpio call back 마지막에 있던데 목적은 context switching 하는거같은데

모든 isr 함수 마지막에는 portYIELD_FROM_ISR 함수가 오게 되는건가요? 아니면 어떠한 함수든 context switching 이 이루어 지는 함수가 오게 되나요?

[ANS] 컨텍스트 스위치 맞습니다. isr 처리 후 선점이 즉각적으로 처리될 필요가 없다면 생략할 수도 있겠습니다. 선점 동작은 xPortSysTickHandler(주기적) 또는 xPortPendSVHandler(비주기적) 함수에 의해서 일어날 수 있다는 것도 참고하시면 좋을 것 같습니다.

3. gpio call back 마지막에 있는 함수 대신 vTaskSwitchContext()함수를 넣어주게 된다면

시간이 좀더 오래 걸리긴 하겠지만 vTaskSwitchContext()안의{.....taskSELECT_HIGHEST_PRIORITY_TASK()..} 함수가 진행이 되어 동일한 효과를 얻게 되나요? (systick 이벤트가 nested된 상태라면 context switching 발생 후 systick isr로 들어가서 counter 값이 증가하게 되고 systick isr 종료)

[ANS] callback 함수도 일종의 익셉션 핸들러(인터럽트 핸들러)로 보아야 하기 때문에 vTaskSwitchContext() 함수는 핸들러 모드(callback) 내에서 사용할 수 없습니다