스캐줄러
현재 태스크 다음에 어떤 태스크를 실행할지 결정하는 프로그램
대표적인 동작 알고리즘으로 라운드로빈 (인덱스를 올려가며 최대가 되면 0이되어 반복)
우선순위
라운드로빈 스캐줄러 구현
kernel/task.c
tcb 인덱스를 위한 sCurrent_tcb_index와
라운드 로빈 스캐줄러 함수 선언 + 구현
sCurrent_tcb_index %= sAllocated_tcb_index는 최대 tcb 인덱스를 넘기지 않기 위해 사용
#include <stdint.h>
#include <stdbool.h>
#include "ARMv7AR"
#include "task.h"
static KernelTcb_t sTask_list[MAX_TASK_NUM];
static uint32_t sAllocated_tcb_index;
static uint32_t sCurrent_tcb_index;
static KernelTcb_t* Scheduler_round_robin_algorithm(void);
void Kernel_task_init(void)
{
sAllocated_tcb_index = 0;
for(uint32_t i = 0; i < MAX_TASK_NUM ; i++)
{
sTask_list[i].stack_base = (uint8_t*)(TASK_STACK_START + (i * USR_TASK_STACK_SIZE));
sTask_list[i].sp = (uint32_t)sTask_list[i].stack_base + USR_TASK_STACK_SIZE - 4;
sTask_list[i].sp -= sizeof(KernelTaskContext_t);
KernelTaskContext_t* ctx = (KernelTaskContext_t*)sTask_list[i].sp;
ctx->pc = 0;
ctx->spsr = ARM_MOD_BIT_SYS;
}
}
uint32_t Kernel_task_create(KernelTaskFunc_t startFunc)
{
KernelTcb_t* new_tcb = &sTask_list[sAllocated_tcb_index++];
if(sAllocated_tcb_index > MAX_TASK_NUM)
{
return NOT_ENOUGH_TASK_NUM;
}
KernelTaskContext_t* ctx = (KernelTaskContext_t*)new_tcb->sp;
ctx -> pc = (uint32_t)startFunc;
return (sAllocated_tcb_index - 1);
}
static KernelTcb_t* Scheduler_round_robin_algorithm(void)
{
sCurrent_tcb_index++;
sCurrent_tcb_index %= sAllocated_tcb_index;
return &sTask_list[sCurrent_tcb_index];
}
'컴퓨터과학 > os' 카테고리의 다른 글
navilos - 15. 컨텍스트 스위칭 2 : yield로 비선점형 스케줄링 구현 (0) | 2022.08.24 |
---|---|
navilos - 14. 컨텍스트 스위칭 1 : 컨텍스트 저장, 복구 구현 하기 (0) | 2022.08.24 |
navilos - 12. 태스크 (0) | 2022.08.22 |
navilos - 11. 타이머로 delay 구현 (0) | 2022.08.21 |
navilos - 10. UART 키보드 입력 인터럽트 (0) | 2022.08.21 |