免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 894 | 回复: 0
打印 上一主题 下一主题

内核共享中断与计时 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-28 22:26 |只看该作者 |倒序浏览

共享中断
共享中断的方法:
1多个设备都硬使用SA_SHIRQ标志。
2尽管内核模块可访问的全局地址都可以作为最后一个参数dev_id
但设备结构指针是可传入的最佳参数
3中断到来shirt所有共享此中断的处理程序都将被执行,在中断处理的顶半部,应速度根据硬件
寄存器中的信息比照传入的DEV_ID参数盘顿是否是本设备的中断,若不是,应该速度返回
编程模板
/*中断处理顶半部分*/
irqreturn_t  xxx_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
...
int status= read_int_status();
if(!is_myint(dev_id, status))
    return IRQ_NONE;
....
return IRQ_HANDLED;
}
int xxx_init(void)
{
...
result= request_irq(sh_irq, xxx_interrupt, SA_SHIRQ,"XXX", xxx_dev);
...
}
void xxx_exit(void)
{
...
/*释放中断*、
free_irq(xxx_irq, xxx_interrupt);
....
}
==内核定时器=======================================================================
struct timer_list
{ struct list_head entry;
  unsigned long expires;
  void (*function)(unsigned long);
  unsigned long data;
  stuct timer_base_s *base;
}
stuct timer_list my_timer;
void init_timer(struct timer_list *timer);
TIMER_INITIALIZER(_function, _expires,_data);
DEFINE_TIMER(_name,_function, _expires, _data);
set_up_timer(&my_timer,func,data);
增加定时器
void add_timer(struct timer_list *timer);
int del_timer(struct timer_list *timer); del_timer_sync()
int mod_timer(struct timer_list *timer,unsigned longs expires);
内核定时器使用模板
struct xxx_dev
{
struct cdev cdev;
...
timer_list xxx_timer;
}
xxx_func1(...)
{
struct xxx_dev *dev = filp->private_data;
....
init_timer(&dev->xxx_timer);
dev->xxx_timer.function = &xxx_do_timer;
dev->xxx_timer.data=(unsigned long)dev;
dev->xxx_timer.expires=jiffies +delay;
add_timer(&dev->xxx_timer);
....
}
xxx_func2(...)
{
...
del_timer(&dev->xxx_timer);
}
static void xxx_do_timer(unsigned long arg)
{
struct xxx_device *dev= (struct xxx_device *)arg;
...
dev->xxx_timer.expires=jiffies +delay;
add_timer(&dev->xxx_timer);
....
}
===内核延迟=========================================================
void ndelay(unsigned long nsecs);
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);
对于毫秒级以上的时延
void msleep(unsingned int millisecs);
unsigned long msleep_interruptible(unsingned int millisecs);
void ssleep(unsigned int seconds);
忙等待延时
unsigned long delay=jiffies+100;
while(timer_before(jiffies,delay));
#define timer_after(a,b) \
(typecheck(unsigned long, a)&& \
  typecheck(unsigned long, b)&& \
   ((long)(b)-long(a))

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/69624/showart_1019231.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP