4.时间管理、定时器管理

  • 时间管理:
    • 概述:
      • uCOS通过周期性时间中断来作为系统时序坐标,此即时钟节拍;
      • OS_CFG_TICK_RATE_HZos_cfg_app.h中配置时钟节拍频率的,常在10~1000Hz之间;
      • 时钟节拍频率越大,精度越高,然而系统负担亦越大(上下文切换等)
      • uCOSIII不一定必须要时钟节拍(如低功耗时),但此时不可进行延时和超时判断而已;
    • 相关函数:
      • 函数OSTimeDly(OS_TICK dly, OS_OPT opt, OS_ERR *p_err);
        • 函数调用此任务时会触发任务调度,停止执行直到延时结束;
        • 该函数有三种模式,取决于第二个参数:
          • 相对模式(OS_OPT_TIME_DLY)
            • 第一个参数为延时的节拍的个数,下一个节拍算作第一个,此种有较大误差:

  • 如图,该任务设置两个节拍的延时(假设一个节拍5ms),即10ms
  • 但事实上这个任务的优先级未知,其可能在这个节拍内处理次序很靠后;
  • 其调用该延时函数后可能马上就进入了下一个节拍,所以误差较大(0~5ms)
  • 周期模式(OS_OPT_TIME_PERIODIC)
    • 功能是每隔若干个节拍任务被唤醒一次(很多不常用的任务就会每个一段时间唤醒一次)
    • 虽然周期模式还是会有相对模式的误差弊端,但整体上每隔若干个节拍,其必会完成相关功能,可以考虑用来作为周期性延时;
  • 绝对模式(OS_OPT_TIME_MATCH)
    • 此时第一个参数的值时时钟节拍计数器OSTickCtr的值,而非一个对于当前节拍的相对值;
  • 函数OSTimeDlyHMSM(CPU_INT16U hours, CPU_INT16U minutes, CPU_INT16U   seconds, CPU_INT32U milli, OS_OPT opt, OS_ERR *p_err);
    • 前四个参数是需要延时时间长度(///毫秒),由于此函数只在相对模式下工作,故而定时进度取决于时钟频率;
    • 当参数设为OS_OPT_TIME_HMSM_STRICT,前四个依次参数范围为0~99,0~59,0~59,0~999;当为OS_OPT_TIME_HMSM_NON_STRICT,依次为0~999, 0~9999, 0~65535, 0~2^32
  • 函数OSTimeDlyResume();
    • 用来恢复其他调用了前两个函数的任务;
    • 但延时的任务并不会知道其是被恢复的,还是以为自己是延时结束得到恢复的;
  • 函数OSTimeGet();
    • 获取系统自系统运行起来以后经历的时钟节拍计数器的值;
  • 函数OSTimeSet();
    • 设置系统自系统运行起来以后经历的时钟节拍计数器的值;
  • 函数OSTimeTick();
    • 是时钟节拍中断时必定会提供的操作;
    • 该函数内一进入就是一个钩子函数(hook),用于用户对于节拍作额外操作,放在函数确保每次钩子函数之间接个均匀;
    • 延迟发布时,系统读取当前时间戳信息,在中断缓冲队列放入信息,中断结束后中断缓冲队列向时钟节拍任务发信息;
    • 直接模式时则直接向时钟节拍任务发信息,后者进行延时处理和超时判断;

 

 

  • 定时器管理
    • 基本介绍:
      • 文件os_cfg.h中的OS_CFG_TMR_EN1时启用定时器任务;
      • 此处指的是软件定时器(一种内核对象),其频率由OS_CFG_TMR_TASK_RATE_HZ决定,此处定时器时基是时钟节拍,即每若干个时钟节拍定时器值-1,其定时精度不会很高;
      • 每次定时器值减到0时,触发回调函数;
      • 回调函数不可使用阻塞调用;

 

  • 定时器相关函数:

 

  • 定时器模式:
    • 单次定时器:
      • 创建后调用OSTmrStart(),启动定时器从延时值(dly)倒计数到0,调用回调函数后即停止;
      • 计时中途(类似于喂狗)或者停止后再次调用OSTmrStart()函数,定时器又从初始值(dly)递减计数;
      • OSTmrStop()函数可以在定时器值未到0时终止计时,用户可自行决定是否调用回调函数;
    • 无延迟周期定时器:
      • 创建后调用OSTmrStart()定时器从周期值(period)开始计数,计数完成后,定时器调用回调函数,之后重新递减计数;
      • 此过程中可随时使用OSTmrStart()重置定时器;
    • 有初始延迟周期定时器:
      • 创建后调用OSTmrStart()定时器从延迟值(dly)开始计数,计数完成后,定时器调用回调函数,之后则从周期值(period)重新递减计数,重复;
      • 此过程中可随时使用OSTmrStart()重置定时器,从头开始上一过程;

 

  • 定时器状态:

  • OSTmrStateGet()函数可以用来查看定时器状态;
  • OSTmrRemainGet()返回定时器到定时结束所剩的定时器节拍数;若定时器为停止状态,则为延迟值(dly,单次或延迟周期)或周期值(period)
  • 周期模式可被OSTmrStop()变为停止态;未使用即系统不识别此状态;完成即定时器过期后状态;

 

  • 定时器结构体及定时器任务:
    • 结构体:
      • 该结构体中第一个元素即为内核对象类型标志,定时器为OS_TMR(os.h)
      • 结构体内表示时间的相关元素计算单位基本都是定时器时间基元;
    • 定时器任务(OSTmrTask()系统任务)
      • 该周期任务每个若干个时钟节拍(软件分频后)触发一次;
      • 当该次时钟节拍ISROSTmrTask()发信号后,OSTmrTickCtr1,定时器任务更新所有定时器;
      • 所有定时器回调函数均在该任务内完成,占用该任务的时空资源(堆栈,时间片),故而不可触发等待事件;
      • 回调函数执行顺序取决于其在定时器列表内的位置,且此时调度器都是上锁的;

 

  • 定时器列表:
    • 是一个构造思想和时钟节拍列表很像的循环数组,数组每一项都是一个链表的表头;
    • 数组最大项数即由OS_CFG_TMR_WHEEL_SIZE
    • 具体看中文书P152页;

 

你可能感兴趣的:(嵌入式)