代码拉取完成,页面将自动刷新
#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
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。