1.什么是时间片,他的作用是什么

在UCOSII下,同一优先级下只能有一个任务。在UCOSIII下,同一优先级下可以有多个任务。所以在UCOSIII下引入时间片轮转调度解决相同优先级任务都可以执行的问题。还需要注意的事,我们只需要配置时间片功能,系统即可自动完成调度,不需要用户手动调用函数。配置过程在下面。

2.基本配置过程 。文件os_core.c

void  OSSchedRoundRobinCfg (CPU_BOOLEAN   en,
                            OS_TICK       dflt_time_quanta,
                            OS_ERR       *p_err)

这个是配置时间片的函数,第一个参数 打开or关闭,第二个参数是分配给每个任务的时间片时间,第三个参数是保存返回值,记录了错误类型。这个函数在程序中一般都在一个宏定义中:

#if    OS_CFG_SCHED_ROUND_ROBIN_EN  //当使用时间片轮转的时候
     //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
    OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
#endif
OS_CFG_SCHED_ROUND_ROBIN_EN  这个宏在os_cfg.h中
#define OS_CFG_SCHED_ROUND_ROBIN_EN     1u   /* Include code for Round-Robin scheduling 

当我们在os_cfg.h文件中把这个宏定义为1时,UCOSIII会自动把所有和时间片有关的代码包括到所需要的地方去。这个也符合系统可裁剪的规则,其他模块也是这样做的。需要哪个模块则把该模块的宏定义打开。看一下其他模块的宏定义:

#define OS_CFG_APP_HOOKS_EN             1u   /* Enable (1) or Disable (0) application specific hooks                  */
#define OS_CFG_ARG_CHK_EN               1u   /* Enable (1) or Disable (0) argument checking                           */
#define OS_CFG_CALLED_FROM_ISR_CHK_EN   1u   /* Enable (1) or Disable (0) check for called from ISR                   */
#define OS_CFG_DBG_EN                   1u   /* Enable (1) debug code/variables                                       */
#define OS_CFG_ISR_POST_DEFERRED_EN     1u   /* Enable (1) or Disable (0) Deferred ISR posts 通过调度器上锁来访问临界段*/
#define OS_CFG_OBJ_TYPE_CHK_EN          1u   /* Enable (1) or Disable (0) object type checking                        */
#define OS_CFG_TS_EN                    1u   /* Enable (1) or Disable (0) time stamping                               */

到目前为止,时间片已经打开了。只要有相同优先级的任务即可完成自动切换。那么每个任务的执行时间或者说时间片的大小怎么设置?

一个时间片的大小为一个系统节拍时间。如果写0的话则  0 means assumes OSCfg_TickRate_Hz / 10. 其中OSCfg_TickRate_Hz=200(可配置)

在哪里给每个任务分配时间片?

在创建任务的时候,OSTaskCreate()函数的OS_TICK参数就是为任务分配时间片的

ucosIII_时间片轮转调度-风君雪科技博客

3.任务1和任务2通过串口发送数据

两个优先级相同的任务通过串口发送数据,任务1发送0123456789,任务2发送9876543210,时间片设置为1

//task1任务函数
void task1_task(void *p_arg)
{
    u8 i,task1_num=0;
    OS_ERR err;
    p_arg = p_arg;
    while(1)
    {
        
        for(i=0;i<5;i++) {
        printf("Task1:0123456789 ");
   }
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;
    while(1)
    {
        
        for(i=0;i<5;i++){
      printf("Task2:9876543210 ");
}
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s } }

使用时间片时:任务1和任务2会轮换执行,看到现象,互相打断。以后设计任务的时间片时要设置合理点。

ucosIII_时间片轮转调度-风君雪科技博客

 不使用时间片时:两个优先级相同的任务也能被执行,任务1执行完了才会执行任务2,不会互相打断

ucosIII_时间片轮转调度-风君雪科技博客

相同优先级的任务按照时间片时间执行,不同优先级的任务不用时间片。

2个相同优先级的任务如果不使用时间片,也能被执行,先被创建的任务先被执行 https://www.firebbs.cn/thread-13154-1-1.html

ucosIII_时间片轮转调度-风君雪科技博客