Chinaunix首页 | 论坛 | 博客
  • 博客访问: 294499
  • 博文数量: 78
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 572
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-26 09:59
文章分类

全部博文(78)

文章存档

2015年(8)

2014年(70)

我的朋友

分类: 嵌入式

2014-08-28 22:10:54

linux中断编程:
转载自:http://blog.csdn.net/marz07101/article/details/7694829


1.中断申请和释放

int request_irq( unsigned int irq,  irq_handler_t handler, unsigned long irqflags, const char * devname, void *dev_id )

irq---中断号

handler---中断处理函数

irqflags---中断属性

devname---中断名称

dev_id---传给中断的数据结构

void irq_free(unsigned int irq, void *dev_id)

irq---中断号

dev_id---传给中断的数据结构


2. 使能和屏蔽中断

void disable_irq(int irq);//立刻屏蔽中断,不能在顶半部调用该函数

void disable_irq_nosync(int irq);//等待处理完当前中断服务,然后屏蔽中断,顶半部只能调用disable_irq_nosync(int irq),不能调用disable_irq(int irq);

void enable_irq(int irq);//重开中断

local_irq_save(flags);//保存本cpu中断状态并屏蔽中断

local_irq_restore(flags);//用flags恢复被cpu中断状态

void local_irq_disable(void);//禁止本cpu中断

local_irq_enable;//恢复本cpu中断


3. tasklet

void xx_tasklet_func(unsigned long); //声明一个tasklet处理函数

DECLARE_TASKLET(xx_tasklet,xx_tasklet_func,data); //声明一个名字为xx_tasklet的tasklet,并将xx_tasklet_func作为处理函数,data为传给xx_tasklet_func的参数

tasklet_schedule(&xx_tasklet); //启动xx_tasklet调度


4.工作队列

struct work_struct my_wq; //声明一个工作队列

void my_wq_func(unsigned long); //定义一个工作队列处理函数

INIT_WORK(&my_wq, (void (*)(void *)) my_wq_func,NULL ); //将工作队列和处理函数绑定

schedule_work(&my_wq); //启动工作队列调度


5. 内核定时器

struct timer_list {
    struct list_head entry;
    unsigned long expires;//定时时间,jiffies+delayn

    void (*function)(unsigned long);//处理函数
    unsigned long data;

    struct tvec_base *base;
    ...
};//内核定时器结构体

struct timer_list my_timer; //声明一个定时器

void init_timer(struct timer_list *timer); //初始化定时器,在该定时器成员赋值前,先执行初始化

void add_timer(struct timer_list *timer); //向内核添加一个定时器,启动该定时器

int mod_timer(struct timer_list *timer,unsigned long expires);//修改定时的expire

int del_timer(struct timer_list *timer); //删除一个定时器

内核定时使用简介:声明一个定时器,然后初始化,然后添加定时器到内核,定时器开始启动,时间到后,定时器处理程序会自动执行,在中断程序里需要重新设置定时值,并重新使用add_timer来开启定时器。


6. 短延时

void ndelay(unsigned long nsecs); //忙等待延时nsecs纳秒

void udelay(unsigned long usecs); //忙等待延时usecs微秒

void mdelay(unsigned long msecs); //忙等待延时msecs毫秒


7. 长延时

例子1:延时100个jiffies

unsigned long delay = jiffes+100;

while(time_before( jiffes,delay) );


例子2:延时2秒

unsigned long delay = jiffes+2*Hz;

while(time_before( jiffes,delay) );

此外还有time_after(a,b),用法类似。


8. 睡着延时

void msleep( unsigned int millisecs ); //睡眠millisecs个毫秒的延时

void ssleep( unsigned int seconds ); //睡眠seconds秒的延时

unsigned long msleep_interruptible( unsigned int millisecs );//睡眠millisecs个毫秒的延时,并且睡眠期间可被中断


阅读(1235) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~