작성
·
319
답변 1
0
안녕하세요, 인프런 AI 인턴이에요. FreeRTOS에서 EIRQ가 작동하지 않는 것은 당연한 것은 아니에요. FreeRTOS는 실시간 운영체제로, 외부 인터럽트를 처리하기 위한 다양한 기능과 API를 제공합니다. FreeRTOS를 사용할 때 EIRQ가 동작하지 않는 이유는 다른 요인에 의해 발생할 수 있어요.
먼저, spc5studio를 사용하는 것이 stm32IDE와 다른 점일 수 있습니다. spc5studio 환경에서는 FreeRTOS와 호환되지 않거나, 특정 설정이 필요한 경우가 있을 수 있어요. 이 경우에는 spc5studio에서 어떤 설정을 바꿔야 하는지, 혹은 어떤 함수를 사용해야 하는지에 대해 더 자세한 정보가 필요합니다.
또한, 외부 인터럽트가 작동하지 않는 경우 다른 요인도 고려해야 합니다. 예를 들면, 인터럽트 우선순위나 인터럽트 핸들러 함수 등에 문제가 있는 경우도 있을 수 있어요. 따라서 문제를 해결하기 위해서는 코드를 더 자세히 살펴보고, 인터럽트 설정과 관련된 API를 확인해봐야 합니다.
FreeRTOS에서 외부 인터럽트를 처리하기 위한 함수는 portYIELD_FROM_ISR()
와 같은 API를 사용할 수 있습니다. 하지만 각 운영체제와 하드웨어 환경에 따라서 다를 수 있기 때문에, spc5studio에서 어떤 함수를 사용해야 하는지에 대해서는 상세한 문서나 커뮤니티를 참고하는 것이 좋습니다.
결론적으로, FreeRTOS에서 외부 인터럽트를 사용하기 위해서는 올바른 설정과 함수를 사용해야 합니다. spc5studio에서의 동작 문제는 환경에 따라 다르므로, 스펙과 동작 방법에 대한 문서나 커뮤니티를 참고하여 문제를 해결해보세요. 감사합니다.
void EIRQ_15(void){
// 상승 엣지
if(1)//pal_readpad(PORT_F, PIN_EIRQ15) == PAL_HIGH)
{
fticks = (float)osalThreadGetMicroseconds();
osalSysTimeReset();
pal_togglepad(PORT_F, PF_LED1);
}
// 하강 엣지
else if(pal_readpad(PORT_F, PIN_EIRQ15) == PAL_LOW)
{
wticks = (float)osalThreadGetMicroseconds();
wrate = wticks / fticks;
//pal_togglepad(PORT_F, PF_LED2);
FREQUENCY1 = pwm_config_CH1.period;
width1 = (pwmcnt_t)(FREQUENCY1 * wrate);
pwm_lld_enable_single_channel(&PWMD2, width1);
}
else{
pal_togglepad(PORT_F, PF_LED3);
}
pal_togglepad(PORT_F, PF_LED2);
portYIELD_FROM_ISR();
}
보드1에서 PWM신호를 만들고있고 보드2에서 위와 같은 외부인터럽트를 통해서 신호를 캡쳐하고 있습니다.
그런데.. 선을 통해서 보드1과 보드2를 연결만하면 보드가 멈춰버립니다..
제 예상에는 외부인터럽트가 너무 폭발적으로 들어와서일까라고 생각이되는데..
외부인터럽트가 폭발적으로 들어오면 보드가 멈추기도하는걸까요??
감사합니다..
더 정확히는 저 인터럽트 내부를 모두 주석 처리해도 멈춥니다.
그런데 매번 멈추는 것도 아니고 10번 실행 했을 때 두세 번 정도 멈추고 나머지는 작동합니다..
이유를 도저히 모르겠어서 질문 드립니다..
인터럽트와 관련한 현상들은 많은 경우가 문제가 드러난 곳과는 관계없는 다른 곳이 원인일 가능성이 높습니다.
예를들어 hwISR1, hwISR2, hwISR3, main 쓰레드 시스템을 가정해보죠
hwISR2 에서 이상한 현상이 발생하면 다른 hwISR1 과 hwISR3 을 살펴보아야 합니다.
이와 관련한 내용을 DFI(deferred interrupt) 강의에서 충분히 다루었으므로 기억이 잘 안나시면 영상을 다시 한번 보시기를 추천드립니다.
안녕하세요. wjdtjr123님!
질문하신 부분에 대하여 chatGPT 가 위처럼 답변을 잘 달아주었네요. 저는 다음과 같이 보충 글 올립니다.
EIRQ(GPIO 인터럽트와 같은 외부 인터럽트)는 당연 지원되고요. FreeRTOS 라고 예외가 될 수는 없어요. 다만 FreeRTOS 에서의 인터럽트 핸들러는 인터럽트 처리가 끝나는 부분에서 선점 동작을 일으킬 수 있는 처리를 요구한다는 점에서 일반적인 인터럽트 핸들러와 차이를 두고 있습니다. 이때 선점을 위해 사용되는 FreeRTOS 함수가 portYIELD_FROM_ISR 이고요. 이 함수에 의해 선점 동작이 가능하게 됩니다.
이 영상 00:51 초 구간에서 portYIELD_FROM_ISR 함수가 사용된 예를 보실 수 있어요.
이와 관련 추가 정보가 필요하시면 댓글 남겨주세요.