在这里简单记录一下目前DragonOS中的中断处理的设计吧。
首先,先上DragonOS的GitHub链接:https://github.com/fslongjin/DragonOS
写这篇文章的时候,代码版本长这样:https://github.com/fslongjin/DragonOS/commit/5ec1b825e6f8b780027b29ec80b8d672dd8884bd
中断响应流程
1.硬中断
1.1. 中断处理模型
1.1.1. hardware_intr_controller结构
该结构提供了对硬件中断的控制方法的统一抽象。
成员 | 参数 | 返回值 | 描述 |
enable | irq_num | void | 使能中断操作接口 |
disable | irq_num | void | 禁止中断操作接口 |
install | irq_num, void*arg | ul | 安装中断操作接口 |
uninstall | irq_num | void | 卸载中断操作接口 |
ack | irq_num | void | 应答中断操作接口 |
1.1.2. irq_desc_t结构
该数据结构提供了对中断服务程序的抽象
成员 | 类型 | 参数 | 返回值 | 描述 |
controller | hardware_intr_controller | – | – | 硬件中断控制结构 |
irq_name | char* | – | – | 中断名 |
parameter | ul | – | – | 中断处理函数的参数 |
handler | 函数 | irq_num parameter regs | void | 中断服务程序 |
flags | ul | – | – | 自定义标志位 |
1.1.3. 中断注册程序irq_register
该程序用于注册中断服务程序。
* @param irq_num 中断向量号
* @param arg 传递给中断安装接口的参数
* @param handler 中断处理函数
* @param paramater 中断处理函数的参数
* @param controller 中断控制器结构
* @param irq_name 中断名
1.1.4. 中断卸载程序irq_unregister
该程序用于卸载中断服务程序。
* @param irq_num 中断向量号
2.软中断
软中断与硬中断类似,只是其由软件方式创建,且在处理时可被中断。可作为中断下半部使用,任务处理实时性低于硬中断。
软中断模块设计与硬中断的设计类似。其包括了一个软中断向量表及一些函数模型。
2.1软中断向量表表项定义
表项类型定义为softirq_t
成员 | 类型 | 参数 | 返回值 | 描述 |
action | 函数 | void*data | void | 软中断处理函数 |
data | void* | – | – | 传递给软中断处理函数的数据 |
2.2软中断注册程序register_softirq
* @param irq_num 软中断号
* @param action 响应函数
* @param data 响应数据结构体
2.3软中断卸载程序unregister_softirq
* @param irq_num 软中断号
2.4软中断处理程序do_softirq
在该函数中,先检测软中断是否正在被处理,如果空闲,则发起处理并置位标志位。
转载请注明来源:https://longjin666.cn/?p=1401
欢迎关注我的公众号“灯珑”,让我们一起了解更多的事物~