linux中断与定时器



linux中断分为顶半部与低半部,顶半部主要用来处理紧急的功能,如硬件中断;不能花太长的时间在处理,所以这里引入低半部,顶半部产生的中断进行登记,然后又低半部进行处理。

1. linux中断编程
 1.1 申请中断
  int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void * dev_id);
  注解:
   irq:是中断申请号
   handler: 低半部中断处理函数
   irqflags:中断处理属性,IRQF_TRIGGER_RAISING, IRQF_TRIGGER_FALLING, IRQF_TRIGGER_HIGH, IRQF_TRIGGER_LOW,
    在处理方面若设置了IRQF_DISABLED, 表明是快速中断,处理程序在调用时会屏蔽所有中断,慢速处理程序就不会;若
    设置了IRQF_SHARD,则表示多个设备中断共享;
 
 1.2 释放中断
  void free_irq(unsigned int irq, void *dev_id);
 
 1.3低半部机制
  低半部机制主要有tasklet、工作队列和软中断;
  
  1.3.1 tasklet
   void my_tasklet_func(unsigned long); //定义一个处理函数
   DECLARE_TASKLET(my_tasklet, my_tasklet_func, data); //定义一个my_tasklet结构体,并将它与my_tasklet_func函数绑定;
   当以上两步完成之后,在中断处理函数handler中调用tasklet_schedule(&my_tasklet)处理中断;
   
  1.3.2 工作队列
   struct work_struct my_wq; //定义一个工作队列
   void my_wq_func(unsigned long);  //定义一个处理函数
   INIT_WORK(&my_wq, (void (*)(void*)) my_wq_func, NULL); //初始化等待队列
   当以上两步完成之后,在中断处理函数handler中调用schedule_work(&my_wq)处理中断;
   
  1.3.3 软中断
   open_softirq(); //注册软中断对应的处理函数
   raise_sftirq(); //触发一个软中断
   
  *NOTE* 软中断和tasklet运行于软中断上下文,仍然属于原子上下文的一种,而工作队列则运行于进程上下文,因此前者不能休眠,后 者允许休眠
  
 2. Linux定时器编程
  2.1 定时器结构体 struct timer_list my_timer_list;
  2.2 初始化定时器 void init_timer(struct timer_list *timer);
  2.3 增加定时器 void add_timer(struct timer_list *timer);
  2.4 删除定时器 int del_timer(struct timer_list *timer);
  2.5 修改定时器 int mod_timer(struct timer_list *timer, unsigned long experise);
 
 3. 内核延时
  3.1 短延迟
  void ndelay(unsigned long nsecs);
  void udelay(unsigned long usecs);
  void mdelay(unsigned long msecs);
  这个几个函数是忙等待,耗CPU资源,mdelay建议用下面的
  void msleep(unsigned int millisecs);
  unsigned long msleep_interrupt(unsigned int millisecs);
  void ssleep(unsigned int seconds);
  3.2 长延迟
  time_before();
  time_afer();
  3.3 睡着延迟
  schedule_timeout()

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值