创建任务
1、定义任务栈
在UCOS中,每个任务都是独立的,它们的运行环境都单独的保存在各个栈空间,任务使用的栈和任务控制块都使用的是静态变量,也就是全局变量。
#define APP_STK_SIZE 128
static CPU_STK APPTaskStartStk[APP_STK_SIZE];
2、定义任务控制块
任务控制块就是一个结构体,其中的成员共同描述了任务的全部信息。
static OS_TCB APPTaskTCB;
3、定义任务主体函数
任务实际上就是一个无限循环且不带返回值的C函数。
任务里面的延时函数必须使用UCOS提供的阻塞延时函数,当调用OSTimeDly函数的时候,当前任务会被挂起,调度器会切换到其他就绪的任务中,从而实现多任务运行。
4、创建任务
一个任务的三要素:任务主体,任务栈,任务控制块。
由OSTaskCreate()函数将三者联系在一起,任务创建后可随时被系统启动与调度。
5、启动任务
当任务创建好是处于就绪态。启动任务调度器OSStart()函数即可。
伪代码
#define APP_TASK_STK_SIZE 128
static CPU_STK APPTaskStk[APP_TASK_STK_SIZE];
static OS_TCB APPTaskTCB;
int main(void)
{
OS_ERR err;
OSInit(&err);
OSTaskCreate((OS_TCB*) &APPTaskTCB,
(CPU_CHAR*) "APP Task Start",
(OS_TASK_PTR) APPTaskStart,
(void *) 0,
(OS_PRIO) APP_Task_PRIO,
(CPU_STK*) &APPTaskStk[0],
(CPU_STK_SIZE) APP_TASK_STK_SIZE/10,
(CPU_STK_SIZE) APP_TASK_STK_SIZE,
(OS_MSG_QTY) 5u,
(OS_TICK) 0u,
(void *) 0,
(OS_OPT) "太长了,不想写了",
(OS_ERR*) &err);
OSStart(&err);
}