📄 sched.c
字号:
/*============================================================================TASK CREATION AND SCHEDULINGEXPORTS:extern task_t *_curr_task;void schedule(void);void init_tasks(void);============================================================================*/#include <setjmp.h> /* setjmp(), longjmp() */#include "_krnl.h" /* console_t *//* IMPORTSfrom MAIN.C */void kprintf(const char *fmt, ...);/* from VIDEO.C */extern console_t _vc[];/* from TASKS.C */void task1(void);void task2(void);void task3(void);void task4(void);#define MAX_TASK 16#define USER_STACK_SIZE 512/* jmp_buf (E)IP and (E)SP register names for various environments: Tinylib TurboC DJGPP Linux (glibc5) */#define JMPBUF_IP eip /* j_ip __eip __pc */#define JMPBUF_SP esp /* j_sp __esp __sp */#define JMPBUF_FLAGS eflags /* j_flag __eflags ? */task_t *_curr_task;static task_t _tasks[MAX_TASK];/**********************************************************************************************************************************************************/void schedule(void){ static unsigned current;/**//* setjmp() returning nonzero means we came here through hyperspacefrom the longjmp() below -- just return */ if(setjmp(_curr_task->state) != 0) return;/* find next runnable task */ do { current++; if(current >= MAX_TASK) current = 0; _curr_task = _tasks + current; } while(_curr_task->status != TS_RUNNABLE);/* jump to new task */ longjmp(_curr_task->state, 1);}/**********************************************************************************************************************************************************/#define NUM_TASKS 5void init_tasks(void){ static unsigned char stacks[NUM_TASKS][USER_STACK_SIZE]; static unsigned entry[NUM_TASKS] = { 0, (unsigned)task1, (unsigned)task2, (unsigned)task3, (unsigned)task4 };/**/ unsigned adr, i; kprintf("init_tasks:\n");/* for the user tasks, initialize saved state... */ for(i = 1; i < NUM_TASKS; i++) { (void)setjmp(_tasks[i].state);/* ...especially the stack pointer */ adr = (unsigned)(stacks[i] + USER_STACK_SIZE); _tasks[i].state[0].JMPBUF_SP = adr;/* ...and program counter */ _tasks[i].state[0].JMPBUF_IP = entry[i];/* set EFLAGS value to enable interrupts */ _tasks[i].state[0].JMPBUF_FLAGS = 0x200;/* allocate a virtual console to this task */ _tasks[i].vc = _vc + i;/* mark it runnable */ _tasks[i].status = TS_RUNNABLE; }/* mark task #0 (idle task) runnable */ _tasks[0].status = TS_RUNNABLE;/* set _curr_task so schedule() will save state of task #0 */ _curr_task = _tasks + 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -