⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sched.c

📁 gerneral os development
💻 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 + -