分类: 嵌入式
2014-08-28 22:10:54
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个毫秒的延时,并且睡眠期间可被中断