Win32下UCOSII创建多任务

前一篇文章创建了一个工程模板,这篇文章在原来的基础上进行修改,创建两个任务。

创建任务有两个函数: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函数都会被调用。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值