Title
#zephyr
u

권경환

08/29/2021, 5:22 AM
스케줄링 쪽 살펴보다가 의문점이 하나 생겼습니다: 동일한 우선순위를 갖는 스레들 간에는 time slice 주기로 스케쥴러가 문맥전환한다고 이해하고 있습니다(
CONFIG_TIMESLICING
). 그렇다면 시스템 틱이 발생할 때 slice 를 체크하고 할당된 slice를 다 쓴 경우 문맥전환을 해야 할 것 같은데, slice를 체크하고 리셋하는 코드는 있는데 문맥전환을 위한 코드가(pendsv) 보이지 않습니다. 이러면 현재 스레드가 스스로 yield하지 않는 이상(또는 blocking 함수를 호출하지 않는 이상) 문맥전환이 발생하지 않을 것 같습니다. 제가 뭘 놓치고 있는걸까요? https://github.com/zephyrproject-rtos/zephyr/blob/fcfe597e5dadb96ecef5d6e8c82ffc99b5f4d59c/kernel/timeout.c#L236
👍 1
Stephanos Ioannidis

Stephanos Ioannidis

08/29/2021, 5:47 AM
저 코드는 타이머 인터럽트 내에서 실행되기 때문에 PendSV와는 무관합니다 (PendSV는 ISR 컨텍스트가 아닌 곳에서 swap을 해야할 때, 즉 z_swap_*이 호출될 때 사용됩니다)
👍 1
5:47 AM
Cortex-M 포트는 실제 스왑을 그 어떠한 ISR(타이머 ISR 포함)에서도 인터럽트 exit할때 하게 구현되어 있습니다
👍 2
5:51 AM
current != ready_q이면 Cortex-M의 경우 PendSV를 통해 최저 우선권에서 z_arm_pendsv로 넘어가고 Cortex-A/-R은 네스팅 레벨이 0이면 바로 z_arm_pendsv로 넘어갑니다.
u

권경환

08/29/2021, 6:09 AM
z_arm_exc_exit
와 같은 인터럽트 wrapper 가 있는지 몰랐습니다. 그런데 인터럽트와 어떻게 연결되지는 파악하기가 쉽지 않네요. 예컨대, 제가 본 코드흐름은 vector_table.S에서 바로
sys_clock_isr
타고 분기한다고 봤거든요.
Stephanos Ioannidis

Stephanos Ioannidis

08/29/2021, 6:11 AM
sys_clock_isr
(SysTick) ->
z_arm_int_exit
-> PENDSV ->
z_arm_pendsv
u

권경환

08/29/2021, 6:13 AM
아, 하하;; 인터럽트 핸들러에서 직접 호출하는군요(왜 못봤지;😉 감사합니다.
6:13 AM
🙇‍♂️