OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3042|回复: 6

如何使任务1工作时间长一些,任务二工作时间短一些

[复制链接]

33

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2015-11-20
在线时间
76 小时
发表于 2017-9-11 17:43:30 | 显示全部楼层 |阅读模式
3金钱
在使用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
        }
}





                                                 
                                                         

最佳答案

查看完整内容[请看2#楼]

你没理解时间片的意思。时间片主要是给两个相同优先级的任务设计的,当一个任务要执行的内容多,超过了时间片设定的时间,则会切换到另一个任务执行。如果一个任务执行完主动放弃 CPU(并且没有超过时间片),则与时间片没什么关系。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
11409
金钱
11409
注册时间
2013-3-8
在线时间
1221 小时
发表于 2017-9-11 17:43:31 | 显示全部楼层
图南 发表于 2017-9-11 21:54
谢谢a!  改变 函数OSTaskCreate(   )  中 时间片数大小,或时间片大小  怎么不行呢?

你没理解时间片的意思。时间片主要是给两个相同优先级的任务设计的,当一个任务要执行的内容多,超过了时间片设定的时间,则会切换到另一个任务执行。如果一个任务执行完主动放弃 CPU(并且没有超过时间片),则与时间片没什么关系。
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2017-9-11 17:49:53 | 显示全部楼层
两个任务里面都有打印五次的语句呀。。。
for(i=0;i<5;i++) printf("Task1:01234\r\n");
for(i=0;i<5;i++) printf("Task2:56789\r\n");
回复

使用道具 举报

33

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2015-11-20
在线时间
76 小时
 楼主| 发表于 2017-9-11 19:56:57 | 显示全部楼层
在while(1)里面不是应该无限循环的吗?
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
11409
金钱
11409
注册时间
2013-3-8
在线时间
1221 小时
发表于 2017-9-11 20:17:03 | 显示全部楼层
把任务1里的OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s   延时时间改小,比如改成50ms
回复

使用道具 举报

33

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2015-11-20
在线时间
76 小时
 楼主| 发表于 2017-9-11 21:54:16 | 显示全部楼层
augustedward 发表于 2017-9-11 20:17
把任务1里的OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s   延时时间改小,比如改成50m ...

谢谢a!  改变 函数OSTaskCreate(   )  中 时间片数大小,或时间片大小  怎么不行呢?
回复

使用道具 举报

33

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2015-11-20
在线时间
76 小时
 楼主| 发表于 2017-9-13 00:20:26 | 显示全部楼层
augustedward 发表于 2017-9-12 10:10
你没理解时间片的意思。时间片主要是给两个相同优先级的任务设计的,当一个任务要执行的内容多,超过了时 ...

哦 谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-2 04:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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