嵌入式linux之按键驱动程序
2015-07-15 18:02
330 查看
步骤
1.写出框架2.硬件操作(操作虚拟地址ioremap
linux中断处理体系架构
1.重要函数 trap_init() init_IRQ();asm_do_IRQ中断总入口: 分辨中断,处理中断,清中断。
1)发生中断时,CPU执行异常向量vector_irq的代码。
2)在vector_irq里面,最终会调用中断处理的总入口函数asm_do_IRQ。
3)asm_do_IRQ根据中断号调用irq_desc数组项中的handle_irq。
4)handle_irq会使用chip成员中的函数来设置硬件,比如清楚中断,禁止中断,重新使能中断等。
5)handle_irq逐个调用用户在action链表中注册的处理函数。
6)request_irq(irq,handler,flags,name,dev_id)请求注册中断 free_irq(irq,dev_id)卸载中断
1. 关于 wait_event_interruptible() 和 wake_up()的使用
读一下wait_event_interruptible()的源码,不难发现这个函数先将当前进程的状态设置成TASK_INTERRUPTIBLE,然后调用schedule(),
而schedule()会将位于TASK_INTERRUPTIBLE状态的当前进程从runqueue
队列中删除。从runqueue队列中删除的结果是,当前这个进程将不再参
与调度,除非通过其他函数将这个进程重新放入这个runqueue队列中,
这就是wake_up()的作用了。
由于这一段代码位于一个由condition控制的for(;;)循环中,所以当由
shedule()返回时(当然是被wake_up之后,通过其他进程的schedule()而
再次调度本进程),如果条件condition不满足,本进程将自动再次被设
置为TASK_INTERRUPTIBLE状态,接下来执行schedule()的结果是再次被
从runqueue队列中删除。这时候就需要再次通过wake_up重新添加到
runqueue队列中。
如此反复,直到condition为真的时候被wake_up.
可见,成功地唤醒一个被wait_event_interruptible()的进程,需要满足:
在 1)condition为真的前提下,2) 调用wake_up()。
所以,如果你仅仅修改condition,那么只是满足其中一个条件,这个时候,
被wait_event_interruptible()起来的进程尚未位于runqueue队列中,因
此不会被 schedule。这个时候只要wake_up一下就立刻会重新进入运行调度。
关于wait_event_interruptible的返回值
根据 wait_event_interruptible 的宏定义知:
1) 条件condition为真时调用这个函数将直接返回0,而当前进程不会
被 wait_event_interruptible和从runqueue队列中删除。
2) 如果要被wait_event_interruptible的当前进程有nonblocked pending
signals, 那么会直接返回-ERESTARTSYS(i.e. -512),当前进程不会
被wait_event_interruptible 和从runqueue队列中删除。
3) 其他情况下,当前进程会被正常的wait_event_interruptible,并从
runqueue队列中删除,进入TASK_INTERRUPTIBLE状态退出运行调度,
直到再次被唤醒加入runqueue队列中后而参与调度,将正常返回0。
附1:wait_event_interruptible 宏
define wait_event_interruptible(wq, condition) \
({ \int __ret = 0; \
if (!(condition)) \
__wait_event_interruptible(wq, condition, __ret); \
__ret; \
})
注: C语言中{a,b, …, x}的的值等于最后一项,即x,因此上述
宏的值是 __ret。
相关文章推荐
- Linux ls命令参数详解 <转>
- Linux 服务器安全技巧
- linux中时间设置date、hwclock、clock
- centos中mysql远程连接失败解决方案
- Linux下的passwd和shadow文件
- Linux 服务器安全技巧
- 查看linux发行版本
- Linux TOP命令各参数详解
- 每天进步一点点——linux——awk
- 【Linux系统】嵌入式系统中文环境设置
- Linux内核中双向链表的经典实现
- CentOS yum 命令出现 [Errno 14] curl#6 - "Couldn't resolve host ..." 的解决方法
- open()函数 linux中open函数使用
- linux 嵌入式 自启动 系统自动登录-自动启动程序或脚本
- linux系统编程:进程间通信-pipe
- linux下配置git版本控制工具
- linux下uart应用编程
- 在linux上使用yum安装JDK
- Linux常见服务端口
- linux vim常用快捷键