2 Star 5 Fork 4

稀风 / KOS

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
task1.h 3.41 KB
一键复制 编辑 原始数据 按行查看 历史
稀风 提交于 2023-01-28 10:58 . 代码优化
#ifndef __TASK_H_
#define __TASK_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <common.h>
#include <list.h>
// 任务状态(寄存器)
typedef struct REG
{
U32 gs;
U32 fs;
U32 es;
U32 ds;
U32 edi;
U32 esi;
U32 ebp;
U32 kesp;
U32 ebx;
U32 edx;
U32 ecx;
U32 eax;
U32 eip;
U32 cs;
U32 eflags;
U32 esp;
U32 ss;
} REG;
// 任务
typedef struct TASK
{
U32 id; // 任务 id
U08* name; // 任务名称
U08* stack_addr; // 任务栈基址
U16 stack_size; // 任务栈大小
REG reg; // 任务上下文,即任务执行状态下所有寄存器的值
} TASK;
typedef struct TASK_LIST_NODE
{
LIST_NODE listNode;
TASK* task;
} TASK_LIST_NODE;
typedef void (*TASK_FUNC)(void);
extern volatile TASK* current_task; // 当前任务指针,永远指向当前任务
extern volatile U32 current_reg; // 当前任务的上下文起始位置
extern LIST TASK_LIST; // 任务链表头
/******************************************************************************
* 函数名称: SwitchTo(TASK* task)
* 功能说明: 切换到任务 task 执行
* 输入参数: TASK* task --任务指针
* 输出参数: 无
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 无
******************************************************************************/
E_RET SwitchTo(TASK* task);
// 切换任务宏,其作用等同于 SwitchTo 函数
#define SWITCH_TO(t) (void)({ \
U32* pBase = (U32*)(&(t)->reg); \
asm volatile( \
"movl %0, %%esp\n" \
"popl %%gs\n" \
"popl %%fs\n" \
"popl %%es\n" \
"popl %%ds\n" \
"popal\n" \
"iret\n" \
: \
: "r"(pBase) \
);})
/******************************************************************************
* 函数名称: E_RET TaskCreat(TASK* task, TASK_FUNC pFunc, U08 stackAddr, U16 stackSize, U08* name)
* 功能说明: 创建任务
* 输入参数: TASK_FUNC pFunc --任务函数
    U08* stackAddr --任务栈基址
    U16 stackSize --任务栈大小
    U08* name --任务名称
* 输出参数: TASK* task --任务指针
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 无
******************************************************************************/
E_RET TaskCreat(TASK* task, TASK_FUNC pFunc, U08* stackAddr, U16 stackSize, U08* name);
/******************************************************************************
* 函数名称: TaskStart(TASK* task)
* 功能说明: 启动第一个任务
* 输入参数: TASK* task0 --任务指针
* 输出参数: 无
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 想要启动所有任务,只要启动第一个任务就可以了,其它任务将由任务调度启动
******************************************************************************/
E_RET TaskStart(TASK* task0);
#ifdef __cplusplus
}
#endif
#endif
1
https://gitee.com/thin-wind/KOS.git
git@gitee.com:thin-wind/KOS.git
thin-wind
KOS
KOS
main

搜索帮助