嵌入式系统驱动初级【10】——中断处理下_下半部机制

# 一、上半部与下半部

起源:

1. 中断处理程序执行时间过长引起的问题

2. 有些设备的中断处理程序必须要处理一些耗时操作

# 二、下半部机制之tasklet ---- 基于软中断

## 6.1 结构体

struct tasklet_struct

{

​   struct tasklet_struct *next;

​   unsigned long state;

​   atomic_t count;

​   void (*func)(unsigned long);

​   unsigned long data;

};

## 6.2 定义tasklet的中断底半部处理函数

void tasklet_func(unsigned long data);

## 6.3 初始化tasklet

```c

DECLARE_TASKLET(name, func, data);

/*

定义变量并初始化

参数:name:中断底半部tasklet的名称

     Func:中断底半部处理函数的名字

     data:给中断底半部处理函数传递的参数

*/

```

```c

void tasklet_init(struct tasklet_struct *t,void (*func)(unsigned long), unsigned long data)

```

## 6.4 调度tasklet

```c

void tasklet_schedule(struct tasklet_struct *t)

//参数:t:tasklet的结构体

```

# 三、按键驱动之tasklet版

# 四、下半部机制之workqueue  ----- 基于内核线程

## 8.1 工作队列结构体:

typedef void (*work_func_t)(struct work_struct  *work)

struct work_struct {

​       atomic_long_t data;

​       struct list_head entry;

​       work_func_t func;

\#ifdef CONFIG_LOCKDEP

​           struct lockdep_map lockdep_map;

\#endif

};

## 8.2 定义工作队列底半部处理函数

 void work_queue_func(struct work_struct  *work);

## 8.3 初始化工作队列

struct work_struct  work_queue;

初始化:绑定工作队列及工作队列的底半部处理函数

 INIT_WORK(struct work_struct * pwork, _func)   ;

参数:pwork:工作队列

​       func:工作队列的底半部处理函数

## 8.4 工作队列的调度函数

bool schedule_work(struct work_struct *work);

# 五、按键驱动之workqueue版



 

# 六、下半部机制比较

任务机制

​   workqueue  ----- 内核线程  能睡眠  运行时间无限制

异常机制  -------  不能睡眠  下半部执行时间不宜太长( < 1s)

​   软中断  ----  接口不方便

​   tasklet  ----- 无具体延后时间要求时

​   定时器  -----有具体延后时间要求时




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值