代码适用于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

本文展示了一个在用户态实现的简单线程调度代码,不支持抢占,线程需自行让出CPU。通过示例代码,可以看到不同任务的执行流程,如usr_task1、usr_task2和usr_task3的执行和退出情况。
最低0.47元/天 解锁文章
3002

被折叠的 条评论
为什么被折叠?



