해결된 질문
작성
·
448
1
문맥전환-커널소스코드로 본 문맥전환 방법 2가지 1:10부분 내용에서
vTaskDelay() à portYIELD_WITH_API()à portYIELD()à portNVIC_INT_CTRL_REG 값 변경하면 인터럽트를 유발시킨다고 하셨는데
portNVIC_INT_CTRL_REG 값 변경한다고해서 어떻게 인터럽트 핸들러까지 호출하게 되는 과정을 모르겠습니다.
같이 설명하신 부분이 startup 코드쪽에
.weak PendSV_Handler
.thumb_set PendSV_Handler, Default_Handler 내용을 언급하셧는데 이 handler 함수(xPortPendSVHandler, PendSV_Handler) 가 어디서 호출이 되는지 잘 모르겠습니다.
답변 2
0
0
안녕하세요. 김영선님!
인터넷에서 CORTEX-M4 기술문서(DUI0553A_cortex_m4_dgug.pdf) 을 찾아보시면 다음처럼 230페이지에 ICSR 에 대한 설명이 있습니다.
이 레지스터 28번 비트를 세트('1') 하게 되면 소프트웨어적으로 PENDSV 익셉션이 발생하게됩니다.
PENDSV 는 애초부터 OS에서의 문맥전환을 지원하기 위한 수단으로써 설계된 CORTEX-M 의 기술입니다.
portmacro.h 내용 발췌
/* Scheduler utilities. */
#define portYIELD() \
{ \
/* Set a PendSV to request a context switch. */ \
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \
\
/* Barriers are normally not required but do ensure the code is completely \
within the specified behaviour for the architecture. */ \
__asm volatile( "dsb" ::: "memory" ); \
__asm volatile( "isb" ); \
}
#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
익셉션이 발생되면 벡터 테이블 참조에 의해 결국 port.c 에 있는 void xPortPendSVHandler( void ) 함수가 호출되겠죠.
FreeRTOSConfig_base.h 내용 발췌
/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
standard names. */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
혹시 CORTEX-M 에 대하여 관심이 많으시다면 지난 6월 론칭한 제 강좌 ARM Cortex-M 프로세서 프로그래밍 이 도움이 되실 것 같네요 :)