002_UCOSIII任务创建于删除

(一)先创建一个启动任务来进行创建其它任务,创建任务的宏定义

#define START_TASK_PRIO        3            //任务优先级
#define START_STK_SIZE         128            //任务堆栈大小    
OS_TCB StartTaskTCB;                    //任务控制块
CPU_STK START_TASK_STK[START_STK_SIZE]; //任务堆栈    
void start_task(void *p_arg);            //任务函数

(一)  创建main函数,用于创建启动任务

int main(void)
{
    OS_ERR err;       /*初始化时候错误保存*/
    CPU_SR_ALLOC();   /*声明变量,这个是进入临界区那个代码用到*/

    /*硬件相关初始化*/
    delay_init(168);  //时钟初始化
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置
    uart_init(115200);   //串口初始化
    
    OSInit(&err);            //初始化UCOSIII
    OS_CRITICAL_ENTER();    //进入临界区             
    //创建开始任务
    OSTaskCreate((OS_TCB     * )&StartTaskTCB,        //任务控制块
                 (CPU_CHAR    * )"start task",     //任务名字
                 (OS_TASK_PTR )start_task,         //任务函数
                 (void        * )0,                //传递给任务函数的参数
                 (OS_PRIO      )START_TASK_PRIO,     //任务优先级
                 (CPU_STK   * )&START_TASK_STK[0],    //任务堆栈基地址
                 (CPU_STK_SIZE)START_STK_SIZE/10,    //任务堆栈深度限位
                 (CPU_STK_SIZE)START_STK_SIZE,        //任务堆栈大小
                 (OS_MSG_QTY  )0,    //内部消息队列能够接收最大消息数目,为0时禁止接收
                 (OS_TICK      )0,    //当使能时间片轮转时的时间片长度,为0时为默认                 (void       * )0,                //用户补充的存储区
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
                 (OS_ERR     * )&err);                //存放该函数错误时的返回值
    OS_CRITICAL_EXIT();    //退出临界区     
    OSStart(&err);      //开启UCOSIII
}

(一)  创建任务一宏定义

注意:在没有开启时间轮转调度时候优先级不要相同

#define TASK1_TASK_PRIO        4            //任务优先级
#define TASK1_STK_SIZE         128            //任务堆栈大小    
OS_TCB  Task1_TaskTCB;                    //任务控制块
CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];    //任务堆栈    
void task1_task(void *p_arg);           //任务函数

(一)  在启动任务函数中创建任务一

//开始任务任务函数
void start_task(void *p_arg)
{
    OS_ERR err;
    CPU_SR_ALLOC();
    p_arg = p_arg;
    CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0u
   OSStatTaskCPUUsageInit(&err);      //统计任务                
#endif

#ifdef CPU_CFG_INT_DIS_MEAS_EN        //如果使能了测量中断关闭时间
    CPU_IntDisMeasMaxCurReset();    
#endif
    
#if    OS_CFG_SCHED_ROUND_ROBIN_EN  //当使用时间片轮转的时候
     //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
    OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
#endif    
    
    OS_CRITICAL_ENTER();    //进入临界区
    //创建TASK1任务
    OSTaskCreate((OS_TCB     * )&Task1_TaskTCB,        
                 (CPU_CHAR    * )"Task1 task",         
                 (OS_TASK_PTR )task1_task,             
                 (void        * )0,                    
                 (OS_PRIO      )TASK1_TASK_PRIO,     
                 (CPU_STK   * )&TASK1_TASK_STK[0],    
                 (CPU_STK_SIZE)TASK1_STK_SIZE/10,    
                 (CPU_STK_SIZE)TASK1_STK_SIZE,        
                 (OS_MSG_QTY  )0,                    
                 (OS_TICK      )0,                    
                 (void       * )0,                    
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR     * )&err);                
                      
    //创建任务二执行第三点然后复制上面创建任务一的函数,修改红色字体部分。
    OS_CRITICAL_EXIT();    //退出临界区
    OSTaskDel((OS_TCB*)0,&err);    //删除start_task任务自身
}

(一)  创建任务一的任务函数

//task1任务函数
void task1_task(void *p_arg)
{
    u8 task1_num=0;
    OS_ERR err;
    CPU_SR_ALLOC();
    p_arg = p_arg;
        
/*初始化硬件相关进入临界区*/
    OS_CRITICAL_ENTER();
    //硬件相关初始化在这里
    OS_CRITICAL_EXIT();
    while(1)
    {
        task1_num++;    //任务执1行次数加1 注意task1_num1加到255的时候会清零!!
        printf("任务1已经执行:%d次\r\n",task1_num);
        if(task1_num==5) 
        {
            OSTaskDel((OS_TCB*)&Task2_TaskTCB,&err);    //任务1执行5此后删除掉任务2
            printf("任务1删除了任务2!\r\n");
        }
/*时,分,秒,毫秒*/
        OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
        
    }
}

(六)添加任务按点三四五点添加,上面程序不完整,只是示例,具体看历程创建任务与删除

猜你喜欢

转载自www.cnblogs.com/luxiaoguogege/p/10159843.html