zoukankan      html  css  js  c++  java
  • ucosIII_时间片轮转调度

    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参数就是为任务分配时间片的

    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会轮换执行,看到现象,互相打断。以后设计任务的时间片时要设置合理点。

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

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

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

  • 相关阅读:
    非静态成员的sizeof
    Android中java.lang.ClassNotFoundException: ***.**** in loader dalvik.system.PathClassLoader[/data/app
    手机 SIM卡的EF
    android 获取手机ip的三种方式
    获取图片倒影效果
    python基础
    Python学习_数据处理split方法
    Python学习_从文件读取数据和保存数据
    Python学习_列表推导和Lambda表达式
    python学习_数据处理编程实例(一)
  • 原文地址:https://www.cnblogs.com/1024E/p/13417096.html
Copyright © 2011-2022 走看看