작성
·
144
·
수정됨
0
안녕하세요! s524 테일체이닝 강의를 보면서 궁금한 점이 생겨 질문 드립니다!
강의에 보면 systick ISR에 delay함수와, 버튼 인터럽 ISR에 printf(".")을 쓰지 않으면 테일 체이닝을 관측하기 어렵다 하셨는데, 제가 생각하기에는 delay함수는 테일체이닝 관측에 영향을 끼치지 않고 선점현상 관측에만 영향을 끼칠 것 같습니다.
systick ISR의 런타임이 짧아도 버튼 ISR 런타임 동안에만 발생하면 pend되기 때문에 버튼 ISR이후에 테일체이닝 된다고 생각하는데 제 생각이 틀린걸까요??
제가 이해 못한 것이 있는지 다시 한번 설명 부탁 드립니다ㅠㅠ
그리고 인터럽의 priority 선정은 어떤 기준으로 하는 것이지도 궁금합니다!! 이전 강의들을 보면 systick priority를 15와 같이 낮은 우선순위를 할당해 주시던데 이유가 있을까요?
답변 1
1
안녕하세요. 규철님!
#define TICK_INT_PRIORITY 15U /*!< tick interrupt priority */
stm32cubeide 에서 신규 프로젝트 생성시 자동으로 systick 의 우선 순위는 위의 값으로 설정됩니다. 즉, 디폴트 값입니다. 만약 다른 하드웨어 인터럽트가 활성화되어 있고 이보다 더 높은 우선순위를 가지고 있다면, 그 인터럽트의 서비스 루틴이 실행되는 동안 SysTick 인터럽트는 기다려야 하며, 이로 인해 tick
변수의 카운트가 지연될 수 있습니다. 이러한 지연은 시스템의 타이밍 정확도에 영향을 미칠 수 있으며, 이를 고려하여 시스템 설계 시 적절한 우선순위 할당이 중요합니다.
...
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
printf("\n\n\nHELLO, STM32\n");
printf("[PRIO] ButtonIRQ > SYSTICK\n");
HAL_NVIC_SetPriority(SysTick_IRQn, 14, 0); // lower
HAL_NVIC_SetPriority(EXTI0_IRQn, 13, 0); // higher
프로그램 예(00_CORTEX_10_NESTED_INTERRUPT_f429)에서는
인터럽트 선점과 테일체인 동작이 어떤 것인지 보여주기 위하여 의도적으로 우선순위를 바꾸어 본 것입니다.
printf(".");fflush(stdout); 은 테일체인 현상이 확률적으로 더 잘 발생되도록 추가한 코드입니다.
테일체인은 systick 인터럽트가 버튼 인터럽트 핸들러의 수행이 끝나기 전에 발생되도록 하는 것이 중요한데요. printf 사용은 그 점에 도움이 될 것입니다.
delay함수는 테일체이닝 관측에 영향을 끼치지 않고 선점현상 관측에만 영향을 끼치는 것이란 말씀 옳습니다.
답변 감사합니다! 덕분에 이해되었습니다!