UCOSIII时间片轮转调度

OS_RATE_HZ const  OSCfg_TickRate_Hz = (OS_RATE_HZ  )OS_CFG_TICK_RATE_HZ;
#define  OS_CFG_TICK_RATE_HZ 200u   /* Tick rate in Hertz (10 to 1000 Hz) */

时间片长度200Hz,也就是一个系统时钟节拍5ms

串口实验
为Task1和Task2分配2个时间片,分别做串口打印

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     )2,  //2个时间片,2*5=10ms                 
                 (void      * )0,                   
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR    * )&err);

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,                   
                 (OS_TICK     )2,   //2个时间片,2*5=10ms                
                 (void      * )0,               
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, 
                 (OS_ERR    * )&err);

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++;
        LCD_ShowxNum(110,130,task1_num,3,16,0x80);
        for(i=0;i<5;i++) printf("Task1:01234
");
        LED0 = ~LED0;
        LED2 = ~LED2;
        OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err);
    }
}

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++;
        LCD_ShowxNum(110,150,task2_num,3,16,0x80);
        for(i=0;i<5;i++) printf("Task2:56789
");
        LED1 = ~LED1;
        OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err);
    }
}

实验现象
1

重新调整时间片个数
分配3个时间片,任务切换时间延长至15ms

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     )3,  //3个时间片,3*5=15ms                 
                 (void      * )0,                   
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR    * )&err);

实验现象
2

原文地址:https://www.cnblogs.com/zhangxuechao/p/11709501.html