• 카테고리

    질문 & 답변
  • 세부 분야

    임베디드 · IoT

  • 해결 여부

    해결됨

portNVIC_INT_CTRL_REG 값 변경이 인터럽트를 유발시키는 이유가 궁금합니다.

22.08.21 20:26 작성 조회수 342

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

김영선님의 프로필

김영선

질문자

2022.08.22

빠른답변 감사드립니다. 

안그래도 염두해두고 있었습니다. 

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 프로세서 프로그래밍 이 도움이 되실 것 같네요 :)