发 帖  
原厂入驻New
怎么让任务1工作时间长一些,任务二工作时间短一些
13 UCOSIII
分享
在使用UcosIII时,想使任务1工作时间比任务2的时间长
现有疑问如下:
1、我对OSTaskCreate()函数中的参数 (OS_tiCK     )    20, 理解是,控制任务1工作的时间是200个时间片
2,我对OSSchedRoundRobinCfg(DEF_ENABLED,1,&err)中的参数"1"的理解是,设置一个时间片长度(比如5ms)
我这样理解应该是正确的吧?
,我在OSTaskCreate()函数里把任务1与任务2分别设置为20   4  但是发现运行结果和都是3  3的结果一样,都是分别打印5次
我认为,结果应该是:任务1打印次数应该远远多于任务2
请问,这该怎么解释?
//创建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,                          //任务内部消息队列能够接收
                                                                                                       //的最大消息数目,为0时禁止接收消息
                                                         
                                                         
                                                         (OS_TICK     )    20,                          //当使能时间片轮转时的时间片长度,为0时为默认长度
                                                         (void *      )    0,                          //用户补充的存储
                                                                 
                                                         (OS_OPT      )    OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,   //任务选项
                                                         (OS_ERR*     )    &err    );                   //存放该函数错误时的返回值
        
        
                                                         
                                                         //创建TASK2任务
        OSTaskCreate((OS_TCB*    )      &Task2_TaskTCB,             //任务控制块
                     (CPU_CHAR*  )     "task2 task",               //任务名字
                     (OS_TASK_PTR)     task2_task,                 //任务函数
                     (void *     )     0,                          //传递给任务函数的参数
                                                         (OS_PRIO    )     TASK2_TASK_PRIO,            //任务优先级
                                                         (CPU_STK*   )     &TASK2_TASK_STK[0],         //任务堆栈基地址
                                                         (CPU_STK_SIZE)    TASK2_STK_SIZE/10,          //任务堆栈深度限位
                                                         (CPU_STK_SIZE)    TASK2_STK_SIZE,             //任务堆栈大小
                                                         (OS_MSG_QTY  )    0,                          //任务内部消息队列能够接收
                                                                                                       //的最大消息数目,为0时禁止接收消息
                                                         
                                                         
                                                         (OS_TICK     )    4,                          //当使能时间片轮转时的时间片长度,为0时为默认长度
                                                         (void *      )    0,                          //用户补充的存储区
                                                                 
                                                         (OS_OPT      )    OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,   //任务选项
                                                         (OS_ERR*     )    &err    );                   //存放该函数错误时的返回值
//task1任务函数
void task1_task(void *p_arg)
{
        u8 i,task1_num=0;
        OS_ERR err;
        p_arg = p_arg;
         
        POINT_COLOR = RED;
        LCD_ShowString(30,130,110,16,16,"Task1 Run:000");
        POINT_COLOR = BLUE;
        while(1)
        {
                task1_num++;        //任务1执行次数加1 注意task1_num1加到255的时候会清零!!
                LCD_ShowxNum(110,130,task1_num,3,16,0x80);        //显示任务执行次数
                for(i=0;i<5;i++) printf("Task1:01234\r\n");
                LED0 = ~LED0;
                OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
               
        }
}
//task2任务函数
void task2_task(void *p_arg)
{
        u8 i,task2_num=0;
        OS_ERR err;
        p_arg = p_arg;
        
        POINT_COLOR = RED;
        LCD_ShowString(30,150,110,16,16,"Task2 Run:000");
        POINT_COLOR = BLUE;
        while(1)
        {
                task2_num++;        //任务2执行次数加1 注意task1_num2加到255的时候会清零!!
                LCD_ShowxNum(110,150,task2_num,3,16,0x80);  //显示任务执行次数
                for(i=0;i<5;i++) printf("Task2:56789\r\n");
                LED1 = ~LED1;
                OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
        }
}
                                                
                                                         
0
5 天前   评论 分享淘帖 邀请回答
6个回答
你没理解时间片的意思。时间片主要是给两个相同优先级的任务设计的,当一个任务要执行的内容多,超过了时间片设定的时间,则会切换到另一个任务执行。如果一个任务执行完主动放弃 CPU(并且没有超过时间片),则与时间片没什么关系。
两个任务里面都有打印五次的语句呀。。。
for(i=0;i<5;i++) printf("Task1:01234\r\n");
for(i=0;i<5;i++) printf("Task2:56789\r\n");
在while(1)里面不是应该无限循环的吗?
5 天前 评论

举报

把任务1里的OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s   延时时间改小,比如改成50ms
谢谢a!  改变 函数OSTaskCreate(   )  中 时间片数大小,或时间片大小  怎么不行呢?

只有小组成员才能发言,加入小组>>

239个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表