zoukankan      html  css  js  c++  java
  • 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次
    ",task1_num);
            if(task1_num==5) 
            {
                OSTaskDel((OS_TCB*)&Task2_TaskTCB,&err);    //任务1执行5此后删除掉任务2
                printf("任务1删除了任务2!
    ");
            }
    /*时,分,秒,毫秒*/
            OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
            
        }
    }

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

  • 相关阅读:
    开发进度01
    eclipse 调用cmd运行DataX
    kettle 新建DB连接双击打不开
    用户体验评价
    找水王课堂练习
    人月神话阅读笔记01
    用户模板和用户场景
    大道至简阅读笔记03
    第九周
    第八周总结
  • 原文地址:https://www.cnblogs.com/luxiaoguogege/p/10159843.html
Copyright © 2011-2022 走看看