15天入门-第十四次-定时器的使用

2018-5-31 17:00 [复制链接] 2 625

本次课程主要讲软件定时器,主要包括:

1、使用软件定时器需要的配置宏
#define RT_USING_SOFT_TIMER

2、例程源码解读及软件定时器相关操作介绍:

需要设置定时周期   启动 中断处理函数
static rt_timer_t timer2;
初始化/创建   
    /* 创建定时器1 */

timer1 = rt_timer_create("timer1", /* 定时器名字是 timer1 */
  
                           timeout1, /* 超时时回调的处理函数 */
  
                           RT_NULL, /* 超时函数的入口参数 */

                            10, /* 定时长度,以OS Tick为单位,即10个OS Tick */

                            RT_TIMER_FLAG_PERIODIC); /* 周期性定时器 */
void rt_timer_init(rt_timer_t  timer,
                   const char *name,
                   void (*timeout)(void *parameter),
                   void       *parameter,
                   rt_tick_t   time,
                   rt_uint8_t  flag)
启动/停止    超时处理函数
/* 启动定时器 */
  
  if (timer1 != RT_NULL) rt_timer_start(timer1);
/*停止定时器*/
  rt_err_t rt_timer_stop(rt_timer_t timer)
控制
rt_err_t rt_timer_control(rt_timer_t timer, int cmd, void *arg)
控制命令:
#define RT_TIMER_CTRL_SET_TIME          0x0             /**< set timer control command */
#define RT_TIMER_CTRL_GET_TIME          0x1             /**< get timer control command */
#define RT_TIMER_CTRL_SET_ONESHOT       0x2             /**< change timer to one shot */
#define RT_TIMER_CTRL_SET_PERIODIC      0x3             /**< change timer to periodic */
脱离/删除
rt_err_t rt_timer_detach(rt_timer_t timer)
rt_err_t rt_timer_delete(rt_timer_t timer)


3、软件定时器使用的两个注意点:

(1)定时时间都是系统滴答的整数倍。精度,最小为1个滴答时钟;
(2)超时处理函数, 尽可能短一点。
创建定时器时 硬件定时器  软件定时器FLAG  区别:超时函数执行上下文环境不一样。
RT_TIMER_FLAG_SOFT_TIMER    在定时器上下文环境中执行,软件TIMER的任务中执行。
                                 不是很精确,但可以调用等待资源的操作
RT_TIMER_FLAG_HARD_TIMER
HARD FLAG     system -- tick 在系统滴答时钟中断中执行  保证定时的精度度。
不要尝试获取IPC的操作,
用处比较多,比如扫描按键等。
作业:
1.使用控制函数修改定时器的超时时间。
  1. /*
  2. * 程序清单:定时器例程
  3. *
  4. * 这个例程会创建两个动态定时器对象,一个是单次定时,一个是周期性的定时
  5. * */
  6. #include <rtthread.h>

  7. /* 定时器的控制块 */
  8. static rt_timer_t timer1;
  9. static rt_timer_t timer2;
  10. static int cnt = 0;

  11. /* 定时器1超时函数 */
  12. static void timeout1(void *parameter)
  13. {
  14.     rt_tick_t timeout = 30;//300

  15.     rt_kprintf("periodic timer is timeout\n");

  16.     /* 运行10次 */
  17.     if (cnt++ >= 10)
  18.     {
  19.        // rt_timer_control(timer1, RT_TIMER_CTRL_SET_ONESHOT, (void *)&timeout);
  20.                          rt_timer_control(timer1, RT_TIMER_CTRL_SET_PERIODIC, (void *)&timeout);
  21.     }
  22. }

  23. /* 定时器2超时函数 */
  24. static void timeout2(void *parameter)
  25. {
  26.     rt_kprintf("one shot timer is timeout\n");
  27. }

  28. int timer_sample_init(void)
  29. {
  30.     /* 创建定时器1 */
  31.     timer1 = rt_timer_create("timer1", /* 定时器名字是 timer1 */
  32.                              timeout1, /* 超时时回调的处理函数 */
  33.                              RT_NULL, /* 超时函数的入口参数 */
  34.                              10, /* 定时长度,以OS Tick为单位,即10个OS Tick */
  35.                              RT_TIMER_FLAG_PERIODIC); /* 周期性定时器 */

  36.     /* 启动定时器 */
  37.     if (timer1 != RT_NULL) rt_timer_start(timer1);

  38.     /* 创建定时器2 */
  39.     timer2 = rt_timer_create("timer2", /* 定时器名字是 timer2 */
  40.                              timeout2, /* 超时时回调的处理函数 */
  41.                              RT_NULL, /* 超时函数的入口参数 */
  42.                              30, /* 定时长度为30个OS Tick */
  43.                              RT_TIMER_FLAG_ONE_SHOT); /* 单次定时器 */

  44.     /* 启动定时器 */
  45.     if (timer2 != RT_NULL) rt_timer_start(timer2);
  46.     return 0;
  47. }
  48. /* 如果设置了RT_SAMPLES_AUTORUN,则加入到初始化线程中自动运行 */
  49. #if defined (RT_SAMPLES_AUTORUN) && defined(RT_USING_COMPONENTS_INIT)
  50.     INIT_APP_EXPORT(timer_sample_init);
  51. #endif
  52. /* 导出到 msh 命令列表中 */
  53. MSH_CMD_EXPORT(timer_sample_init, timer sample);

复制代码

使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-1-8 15:20:11 | 显示全部楼层
设置回掉函数参数的话,  timer2 = rt_timer_create("timer2", /* 定时器名字是 timer2 */
                             timeout2, /* 超时时回调的处理函数 */
                             RT_NULL, /* 超时函数的入口参数 */
                             30, /* 定时长度为30个OS Tick */
                             RT_TIMER_FLAG_ONE_SHOT); /* 单次定时器 */
入口参数不能是局部变量。
使用道具 举报 回复
发表于 2019-1-10 13:51:40 | 显示全部楼层
嗯...格式有一点点乱哦
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|RT-Thread开发者社区  

© 2013-2017 上海睿赛德电子科技有限公司 沪ICP备13014002号-1

Powered by RT-Thread

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