[读书笔记]中断处理(第十章)

综述

终于看到这一章了,中断在Android系统源码中太常见了,学好本章十分重要!

中断

1.中断的申请以及释放

#include <linux/sched.h>
int request_irq(unsigned int irq
                irqreturn_t (*handler)(int,void*,struct pt_regs *)),
                unsigned long flags,
                const char *dev_name,
                void *dev_id);
参数:
unsigned int irq:
要申请的中断号

irqreturn_t (*handler)(int,void*,struct pt_regs *))
中断处理函数

unsigned long flags
与中断管理有关的掩码选项
(1.SA_INTERRUPT 2.SA_SHIRQ 3.SA_SAMPLE_RANDOM).    
const char *dev_name
中断名称,在proc/interrupts中可以显示

void *dev_id
该指针用于共享的中断信号线。它是唯一的标识符,在中断信号线空闲的时候可以使用它。
驱动程序也可以使用执行驱动自己的私有数据区,用来识别是哪个设备产生的中断。
没有强制使用共享方式时,设置为NULL;
void free_irq(unsigned int irq,void *dev_id);

ps:中断处理函数不能向用户空间发送或者接收数据,因为它不是在任何进程的上下文中执行的,不能发生休眠的操作,如调用wait_event、使用不带GFP_ATOMIC分配内存的操作,或者锁住一个信号量。不能调用schdule函数。

中断处理函数的典型任务:如果中断来了,就唤醒相关休眠的进程。
启用和禁用中断
有时驱动程序必须在一个较短的时间内阻塞中断产生,例如必须在拥有自旋锁的时候阻塞中断,以避免系统死锁!
1.禁用单个中断

#include <asm/irq.h>
void disable_irq(int irq);
void disable_irq_nosync(int irq);
void enable_irq(int irq);

2.禁用和打开所有中断

void local_irq_save(unsigned long flags);
void local_irq_disable(void);

local_irq_save把当前中断状态保存在flags中,然后禁用当前处理器上的中断。
local_irq_disable不保存中断状态而直接关闭中断发送,只有我们知道中断没有在其他地方禁用时,才能使用这个版本。

void local_irq_restore(unsigned long flags);
void local_irq_enable(void);

中断的顶半部和底半部

中断处理的一个主要问题就是如何在中断处理函数中完成耗时任务。
响应一次设备中断需要完成一定数量的工作,但是中断处理函数需要尽快结束,不能阻塞时间过长。
因此,解决方案就是把中断处理函数分成两部分来解决,分别为顶半部和底半部。
“顶半部”是实际相应中断的例程,也就是request_irq注册的中断例程。
即-接收和响应中断请求。
“底半部”是一个被顶半部调用,并在稍后更安全的时间里执行的函数。
即-处理中断的业务逻辑

这样分工允许底半部工作期间,顶半部可以继续接受和响应新的中断!

2种实现底半部处理的方式
1.tasklet通常是底半部处理的优选机制,因为这种方式非常快,但是所有的tasklet的代码必须都是原子的。

1.声明
DECLARE_TASKLET(name,function,data);
name:tasklet的名称
function:执行tasklet时调用的函数
data:传递给tasklet函数的unsigned long 类型的值
2.调用
tasklet_schedule();

2.使用工作队列实现,可以具有更高的延迟和允许休眠。

1.声明并且初始化自己的工作队列
static struct work_struct short_wq;
INIT_WORK(&short_wq,short_do_tasklet,NULL);
2.调用
schedule_work(&short_wq);

共享中断

1.和普通的中断一样,通过irq_request申请。需要注意

1.请求中断时,必须指定flags为SA_SHIRQ.
2.dev_id参数必须是唯一的。任何指向模块地址空间的指针都可以使用,但不能设置为NULL。
3.不能使用enable_irq和disable_irq。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 说几句废fu之言,前几天没有接着写进程调度记录的文章,当然现在也不会写,如题,从现在开始记录linux内核基础知识...
    Gitlusen阅读 1,578评论 0 0
  • 中断上下文和进程上下文 设备的中断会打断内核中进程的正常调度和运行,系统对更高吞吐率的追求势必要求中断服务程序尽可...
    Joe_HUST阅读 1,709评论 0 1
  • 进程 创建 创建进程用fork()函数。fork()为子进程创建新的地址空间并且拷贝页表。子进程的虚拟地址空间...
    梅花怒阅读 1,878评论 0 7
  • 1 中断介绍 1.1 简介 中断控制是计算机发展中一种重要的技术。最初它是为克服对I/O接口控制采用程序查询所带来...
    疯狂小王子阅读 8,058评论 0 9
  • 1 临界区 1.1简介 在早期计算机系统中,只有一个任务进程在执行,并不存在资源的共享与竞争。随着技术和需求的飞速...
    Fly晴天里Fly阅读 9,012评论 2 13