本文基于 RockPI 4A 单板Linux4.4内核介绍中断申请的常用接口函数。
1、文件
2、定义
说明:
1)、 irq :要申请的中断号,可通过 platform_get_irq() 获取,见“Linux内核中断之获取中断号”。
2)、 handler :中断处理函数,发生中断时,先处理中断处理函数,然后返回 IRQ_WAKE_THREAD 唤醒中断处理线程。中断处理函数尽可能简单。
中断处理函数定义: typedef irqreturn_t (*irq_handler_t)(int, void *)
中断返回值如下:
3)、 thread_fn :中断处理线程,该参数可为NULL。类似于中断处理函数的下半部分。
4)、 irqflags :中断类型标志。
定义文件: include/linux/interrupt.h ,内容如下:
5)、 devname :中断名称,可使用 cat /proc/interrupts 命令查看。
6)、 dev_id :设备ID,该值唯一。
在使用共享中断时(即设置 IRQF_SHARED ),必须传入 dev_id ,在中断处理和释放函数中都会使用该参数。
注:
1、 request_threaded_irq() 函数可替代 request_irq 加 tasklet 或 workqueue 的方式。
2、对应的中断释放函数为: void free_irq(unsigned int, void *) ,需要和中断申请函数成对出现。
1、文件
2、定义
说明:
1)、 __must_check :指调用函数一定要处理函数的返回值,否则编译器会给出警告。
2)、 request_irq() 函数本质上是中断处理线程 thread_fn 为空的 request_threaded_irq() 函数。
注 :
对应的中断释放函数为: void free_irq(unsigned int, void *) ,需要和中断申请函数成对出现。
1、文件
2、定义
说明 :
devm_request_threaded_irq() 本质上还是使用 request_threaded_irq() 函数实现中断申请。
两者区别:
1)多了一个 dev 参数;
2)在设备驱动卸载时,中断会自动释放;
3)如果想单独释放中断,可使用 void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id) 函数。
1、文件
2、定义
devm_request_irq() 函数本质上是中断处理线程 thread_fn 为空的 devm_request_threaded_irq() 函数。
1、获取中断号
2、申请中断
3、中断处理函数
4、中断处理线程
5、查看中断
int 80h 是 unix/linux 类 *** 作系统内核在 Intel 类CPU架构上作为 系统调用 使用的中断号。常用的系统调用如 write, exit 之类的, 在 glibc中都有对应的接口函数可以直接使用。具体有哪些系统调用,用途,调用号的,楼主自己去找一下相关资料即可。在
int 80h
调用系统调用前,应该将 系统调用号 存入 eax, 参数存入其他寄存器中,然后再 int 80h,比如下面的例子,用 int 80h 调用 第4号 系统调用 (即 write), 将 "hello world" 打印到标准输出
(我用的是 at&t 风格的汇编,这是 gcc 默认使用的格式)
.data
hello:
.string "Hello world\n"
.globl main
main:
movl $4, %eax
movl $1, %ebx
movl $hello, %ecx
movl $12, %edx
int $0x80
ret
把上面的内容存入 xxx.s ,然后用 gcc xxx.s -o xxx 即可编译出可执行文件。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)