Linux 嵌入式驱动开发内核定时器

本文介绍了Linux内核定时器的概念、原理,详细讲解了如何使用内核定时器,包括timer_list结构体、相关API函数如timer_setup、add_timer、del_timer等,并给出了测试APP使用自定义CMD进行周期定时的实现过程。
摘要由CSDN通过智能技术生成

1. 概念
  • 系统频率:节拍率 tick rate

  • 系统节拍数:jiffies 系统运行以来的节拍数

  • 绕回:jiffies 溢出后置零,32 位的系统需考虑使用几个 API 处理绕回

    time_after(unkown, known);
    time_before(unkown, known);
    ...
    
  • jiffiesms us ns 之间的转换 API 函数

    /* 将 jiffies 转换为 时间 */
    int jiffies_to_msecs(const unsigned long j);
    int jiffies_to_usecs(const unsigned long j);
    /* 将 时间 转换为 jiffies */
    long msecs_to_jiffies(const unsigned int m);
    long usecs_to_jiffies(const unsigned int u);    
    
2. 原理
  • 内核定时器 硬件定时器

  • 机制

    • 首先,提供 超时时间定时处理函数

    • 然后,到了超时时间 自动执行 定时处理函数

    • note:内核定时器不是周期性的,超时后需要手动重启定时器,以实现周期定时器

    • timer_list 结构体表示内核定时器

      struct timer_list {
             
      
      	struct 			hlist_node entry;
      	unsigned long 	expires; 							/* 定时器超时时间,单位是节拍数 */
      	void 			(*function)(struct timer_list *);	/* 定时处理函数*/
      	u32 			flags; 								/* 标志位 */
      
      #ifdef CONFIG_LOCKDEP
      	struct lockdep_map lockdep_map;
      #endif
      };
      
  • 一些定时器操作 API

    • timer_setup 函数

      定义了一个 timer_list 变量以后一定要先用 timer_setup 初始化。

      /*
       * timer:	要初始化定时器
       * func:	定时器的回调函数,此函数的形参是当前定时器的变量
       * flags: 	标志位,直接给 0 就行
       */
      void timer_setup(struct timer_list *timer, void (*func)(struct timer_list *), unsigned int flags);
      
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值