首页 > 技术文章 > ucosiii多任务之使用3个LED

lzd626 2018-08-08 21:10 原文

  昨天说到了移植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开始,一步步仔细挖掘,总能得到你想要的答案,那么今天就到这里!!!

推荐阅读