代码适用于X86与X86_64架构。
不支持抢占,任务只能自己让出CPU。
下面是代码,将代码全部复制到一个.c文件中,即可编译运行。
/*
* 本软件为免费、开源软件。
* 本软件的版权(包括源码及二进制发布版本)归一切公众所有。
* 您可以自由使用、传播本软件。
* 您也可以以任何形式、任何目的使用本软件(包括源码及二进制发布版本),而不受任何版权限制。
* =====================
* 作者: 孙明保
* 邮箱: sunmingbao@126.com
*/
/*
* 本程序实现了用户态的任务调度。
* 适用于X86及X86_64架构。
* 编译运行方法:
* [root@localhost ~]# gcc sched.c
* [root@localhost ~]# ./a.out
*/
#include <stdio.h>
#include <string.h>
#define MAX_TASK_NUM (10)
#define TASK_STACK_SIZE (4096)
#define DBG_PRINT(fmt, args...) \
do \
{ \
printf("DBG:%s(%d)-%s:\n"fmt"\n", __FILE__,__LINE__,__FUNCTION__,##args); \
} while (0)
typedef void * (*task_entry_ptr) (void *);
typedef struct
{
char name[64];
unsigned long state;
task_entry_ptr entry;
unsigned long ret;
unsigned long sp;
unsigned long pc;
unsigned long stack[TASK_STACK_SIZE/sizeof(unsigned long)];
} __attribute__((packed)) t_task;
#define STATE_INVALID (0)
#define STATE_SLEEPING (1)
#define STATE_RUNNING (2)
#define STATE_FINISHED (3)
t_task g_at_tasks[MAX_TASK_NUM];
int g_task_cnt = 0;
#define task_ptr2idx(ptr) ((t_task *)(ptr)-g_at_tasks)
unsigned long process_main_thread_sp;
t_task *pt_cur_running_task;
unsigned long prev_task_sp, prev_task_pc;
unsigned long next_task_sp, next_task_pc;
#if defined( __i386)
#define save_context(mem_var_to_save_sp) \
do \
{ \
asm volatile("pushfl\n\t" /* save flags */ \
"pushl %%eax\n\t" \
"pushl %%edi\n\t" \
"pushl %%esi\n\t" \
"pushl %%edx\n\t" \
"pushl %%ecx\n\t" \
"pushl %%ebx\n\t" \
"pushl %%ebp\n\t" \
"movl %%esp,%[mem_var_to_store_sp]\n\t" \
: [mem_var_to_store_sp] "=m" (mem_var_to_save_sp)\
); \
} while (0)
#define restore_context(mem_var_saved_sp) \
do \
{ \
asm volatile("movl %[mem_var_contain_sp],%%esp\n\t" \
"popl %%ebp\n\t" \
"popl %%ebx\n\t" \
"popl %%ecx\n\t" \
"popl %%edx\n\t" \
"popl %%esi\n\t" \
"popl %%edi\n\t" \