前一篇文章创建了一个工程模板,这篇文章在原来的基础上进行修改,创建两个任务。
创建任务有两个函数:OSTaskCreate()和更高级的OSTaskCreateExt(),这里我使用第二个函数。
MyTask1打印一句”MyTask1 running...“后调用OSTimeDly(200)延时
MyTask2打印一句”MyTask2 running...“后调用OSTimeDly(300)延时
首先,修改app_cfg.h文件
1. 删除默认任务优先级的宏定义,添加MyTask1和MyTask2的优先级宏定义
//#define APP_TASK_START_PRIO 4u
#define TASK1_PRIO 5
#define TASK2_PRIO 6
2. 删除默认任务堆栈大小,添加自定义堆栈大小
//#define APP_TASK_START_STK_SIZE 256u
#define TASK_STK_SIZE<span style="white-space:pre"> </span><span style="font-family: Arial, Helvetica, sans-serif;">256u</span>
接着,修改app.c文件
1. 定义自己的任务堆栈
//static CPU_STK AppTaskStartStk[APP_TASK_START_STK_SIZE];
static CPU_STK TaskStks[OS_MAX_TASKS][TASK_STK_SIZE];
说明:这里的OS_MAX_TASKS在os_cfg.h中定义,表示最大任务数量,默认是20
2. MyTask1和MyTask2的定义和实现
//static void AppTaskStart(void *p_arg);
static void MyTask1(void *p_arg);
static void MyTask2(void *p_arg);
static void MyTask1(void *p_arg)
{
OS_ERR err;
(void)p_arg;
while (1) {
printf("Time:%d, MyTask1 running...\n", OSTimeGet());
OSTimeDly(200);
}
}
static void MyTask2(void *p_arg)
{
OS_ERR err;
(void)p_arg;
while (1) {
printf("Time:%d, MyTask2 running...\n", OSTimeGet());
OSTimeDly(300);
}
}
3. 在main函数中调用MyTask1和MyTask2
int main (void)
{
OSInit(); /* Init uC/OS-II. */
OSTaskCreateExt((void(*)(void *))MyTask1, /* Create the start task */
(void *) 0,
(OS_STK *)&TaskStks[TASK1_PRIO][TASK_STK_SIZE - 1],
(INT8U ) TASK1_PRIO,
(INT16U ) TASK1_PRIO,
(OS_STK *)&TaskStks[TASK1_PRIO][0],
(INT32U )TASK_STK_SIZE,
(void *) 0,
(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
OSTaskCreateExt((void(*)(void *))MyTask2, /* Create the start task */
(void *)0,
(OS_STK *)&TaskStks[TASK2_PRIO][TASK_STK_SIZE - 1],
(INT8U)TASK2_PRIO,
(INT16U)TASK2_PRIO,
(OS_STK *)&TaskStks[TASK2_PRIO][0],
(INT32U)TASK_STK_SIZE,
(void *)0,
(INT16U)(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
OSStart(); /* Start multitasking (i.e. give control to uC/OS-II). */
}
说明:
1. OSTimeGet()用于获取系统当前时间
2. OSTimeDly()用于延时,同时还有OSTimeDlyHMSM()
为了让我们的输出结果更加简洁,可以将os_cpu_c.c中的系统信息跟踪宏定义(OS_MSG_TRACE)注释掉
运行结果如下:
结果说明:200和300的公倍数是600、1200等,所以在这些时间两个printf函数都会被调用。