- RTOS中任务的表现形式:
- 功能独立
- 无限循环
- 例程:
void Task(void *parg) { for(;;) { //add user code } }
- 创建任务的关键参数:
- 定义任务堆栈
- 任务控制块OS_TCB
- 创建任务
- 定义任务堆栈:
- 多任务系统中,每个任务相互独立,互不干扰;
- 因此要给每个任务分配独立的栈空间,存放于RAM中;
- 栈的大小由设计人员决定,最低不小于128;最大取决于RAM空间;
- 例程,定义两个任务堆栈大小:
/* ************************************************************************************************************************ * TCB & STACK & 任务声明 ************************************************************************************************************************ */ #define TASK1_STK_SIZE 20 //任务栈大小 #define TASK2_STK_SIZE 20 static CPU_STK Task1Stk[TASK1_STK_SIZE]; //栈存储在数组里,地址自增/减 static CPU_STK Task2Stk[TASK2_STK_SIZE];
- 任务控制块OS_TCB
- 本质上是个任务结构体
- 暂时只包含:堆栈指针、堆栈大小
- 例程:
/* ************************************************************************************************************************ * OS_TCB 任务控制块 ************************************************************************************************************************ */ struct os_tcb { CPU_STK *StkPtr; CPU_STK_SIZE StkSize; }; typedef struct os_tcb OS_TCB;
- 实现任务创建函数
/********************************************************* * 函数名: void OSTaskCreate ( OS_TCB *p_tcb, //任务控制块指针 OS_TASK_PTR p_task, //任务函数名 void *parg, //形参,用于传递参数 CPU_STK *p_stk_base, //指向任务堆栈的起始地址 CPU_STK_SIZE stk_size, //任务堆栈的大小 OS_ERR *p_err //错误码 ); * 描述 :创建任务 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **********************************************************/ void OSTaskCreate ( OS_TCB *p_tcb, //任务控制块指针 OS_TASK_PTR p_task, //任务函数名 void *p_arg, //形参,用于传递参数 CPU_STK *p_stk_base, //指向任务堆栈的起始地址 CPU_STK_SIZE stk_size, //任务堆栈的大小 OS_ERR *p_err //错误码 ) { CPU_STK *p_sp; p_sp = OSTashkStkInit( p_task, //任务堆栈初始化 p_arg, p_stk_base, stk_size ); p_tcb ->StkPtr = p_sp; //将剩余栈的栈顶指针p_sp保存到任务控制块TCB的第一个成员StkPtr中; p_tcb ->StkSize = stk_size; //任务堆栈大小保存到任务控制块TCB成员的StkSize中; *p_err = OS_ERR_NONE; //函数执行到此表示无错误,返回OS_ERR_NONE; }
-
总结:
-
任务的形式:无限循环且无返回值
-
用任务块进行管理
-
创建任务时,必须进行堆栈初始化;
-
【4】从0到1教你写uC/OS-III————>任务定义与创建
最新推荐文章于 2022-11-08 00:09:57 发布