昨天说到了移植ucos,并且完成了移植过程,其实都是依葫芦画瓢,今天我们来尝试尝试它的多任务,目标是创建三个led任务,还是按照手册上的教程一步一步来敲一下代码,先熟悉以下步骤,然后再思考为什么要这么做?
1.在app_cfg.h里,定义三个led任务的优先级和栈空间大小
*********************************************************************************************************
* TASK PRIORITIES
*********************************************************************************************************
*/
#define APP_TASK_START_PRIO 2
#define APP_TASK_LED1_PRIO 3 //iii允许任务有相同优先级(ii不行),与mcu的中断优先级可以做个小对比思考,之后在讨论这个问题
#define APP_TASK_LED2_PRIO 3
#define APP_TASK_LED3_PRIO 3
/*
*********************************************************************************************************
* TASK STACK SIZES
* Size of the task stacks (# of OS_STK entries)
*********************************************************************************************************
*/
#define APP_TASK_START_STK_SIZE 128
//我们知道,栈的作用就是存储一些指针,变量,中断现场等,每个任务运行情况不一样,所以每个任务
//声明一个栈来使用,直至任务销毁。
#define APP_TASK_LED1_STK_SIZE 512
#define APP_TASK_LED2_STK_SIZE 512
#define APP_TASK_LED3_STK_SIZE 512
2.在app.c里声明三个任务控制块,声明任务的栈数组,声明任务函数的原型
static OS_TCB AppTaskStartTCB; static OS_TCB APPTaskLed1TCB;//任务控制块存放在RAM中,里面是任务的各种信息,比如CPU的使用权被剥夺了,他就会保存当前状态。 static OS_TCB APPTaskLed2TCB; static OS_TCB APPTaskLed3TCB; /* ********************************************************************************************************* * STACKS ********************************************************************************************************* */ static CPU_STK AppTaskStartStk[APP_TASK_START_STK_SIZE]; static CPU_STK AppTaskLed1Stk[APP_TASK_LED1_STK_SIZE];//声明任务的栈数组,之后再讨论它的具体内容 static CPU_STK AppTaskLed2Stk[APP_TASK_LED2_STK_SIZE]; static CPU_STK AppTaskLed3Stk[APP_TASK_LED3_STK_SIZE]; /* ********************************************************************************************************* * FUNCTION PROTOTYPES ********************************************************************************************************* */ static void AppTaskStart (void *p_arg); static void AppTaskLed1 (void *p_arg);//声明任务函数 static void AppTaskLed2 (void *p_arg); static void AppTaskLed3 (void *p_arg);
3.在app.c里定义任务函数
static void AppTaskLed1 (void *p_arg)//任务的工作内容 { OS_ERR err; (void)p_arg; while(DEF_TRUE) { macLED1_TOGGLE(); OSTimeDly ( 1000, OS_OPT_TIME_DLY, & err ); } } static void AppTaskLed2 (void *p_arg) { OS_ERR err; (void)p_arg; while(DEF_TRUE) { macLED2_TOGGLE(); OSTimeDly ( 2000, OS_OPT_TIME_DLY, & err ); } } static void AppTaskLed3 (void *p_arg) { OS_ERR err; (void)p_arg; while(DEF_TRUE) { macLED3_TOGGLE(); OSTimeDly ( 3000, OS_OPT_TIME_DLY, & err ); } }
4.创建三个led任务,并删除起始任务本身。
OSTaskCreate((OS_TCB *)&AppTaskStartTCB, /* Create the led1 task */ (CPU_CHAR *)"App Task led1", (OS_TASK_PTR ) AppTaskLed1, (void *) 0, (OS_PRIO ) APP_TASK_LED1_PRIO, (CPU_STK *)&AppTaskLed1Stk[0], (CPU_STK_SIZE) APP_TASK_LED1_STK_SIZE / 10, (CPU_STK_SIZE) APP_TASK_LED1_STK_SIZE, (OS_MSG_QTY ) 5u, (OS_TICK ) 0u, (void *) 0, (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), (OS_ERR *)&err); OSTaskCreate((OS_TCB *)&AppTaskStartTCB, /* Create the led2 task */ (CPU_CHAR *)"App Task led2", (OS_TASK_PTR ) AppTaskLed2, (void *) 0, (OS_PRIO ) APP_TASK_LED2_PRIO, (CPU_STK *)&AppTaskLed2Stk[0], (CPU_STK_SIZE) APP_TASK_LED2_STK_SIZE / 10, (CPU_STK_SIZE) APP_TASK_LED2_STK_SIZE, (OS_MSG_QTY ) 5u, (OS_TICK ) 0u, (void *) 0, (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), (OS_ERR *)&err); OSTaskCreate((OS_TCB *)&AppTaskStartTCB, /* Create the led3 task */ (CPU_CHAR *)"App Task led3", (OS_TASK_PTR ) AppTaskLed3, (void *) 0, (OS_PRIO ) APP_TASK_LED3_PRIO, (CPU_STK *)&AppTaskLed3Stk[0], (CPU_STK_SIZE) APP_TASK_LED3_STK_SIZE / 10, (CPU_STK_SIZE) APP_TASK_LED3_STK_SIZE, (OS_MSG_QTY ) 5u, (OS_TICK ) 0u, (void *) 0, (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), (OS_ERR *)&err); OSTaskDel( & AppTaskStartTCB, & err); }
5.以上就是多任务的关键代码,其实啊看似简简单单的一行行代码,都能提出很多问题,只要从main开始,一步步仔细挖掘,总能得到你想要的答案,那么今天就到这里!!!