2 Star 6 Fork 3

稀风/KOS

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
irq.c 2.50 KB
一键复制 编辑 原始数据 按行查看 历史
稀风 提交于 2023-01-28 10:58 . 代码优化
#include <irq.h>
#include <share.h>
#include <desc.h>
/******************************************************************************
* 函数名称: IrqRegister(E_IRQ_NUM irqNmu, F_ISR ifunc)
* 功能说明: 注册中断服务程序
* 输入参数: E_IRQ_NUM irqNmu --中断号
    F_ISR ifunc --中断服务程序
* 输出参数: 无
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 无
******************************************************************************/
E_RET IrqRegister(E_IRQ_NUM irqNmu, F_ISR ifunc);
{
// 检查参数合法性
if(irqNmu >= IRQ_TOTAL || NULL == ifunc)
return E_ERR;
// 从共享内存中获取中段描述符表 IDT 地址 和大小
GATE* gate = (GATE*)(*(U32*)IDT_ENTRY_ADDR);
U32 idtSize = *((U32*)(IDT_SIZE_ADDR));
// 合法性检查
if(NULL == gate || 0 == idtSize || irqNmu >= idtSize)
return E_ERR;
// 函数名就相当于函数入口地址
// 由于使用平坦模式,段基址为 0,那么函数名 ifunc 地址就等同于段内偏移
(gate+irqNmu)->offset1 = (U16)((U32)ifunc);
(gate+irqNmu)->offset2 = (U16)(((U32)ifunc)>>16);
return E_OK;
}
/******************************************************************************
* 函数名称: static void DefaultHander(void)
* 功能说明: 默认中断服务程序
* 输入参数: 无
* 输出参数: 无
* 函数返回: 无
* 其它说明: 由于在创建 IDT 时未绑定默认中断服务程序
    如果此时触发中断会发生未知的错误
    所以必须给所有中断绑定一个默认中断服务程序
******************************************************************************/
static void DefaultHander(void)
{
asm volatile("leave;iret"); // 中断返回
}
/******************************************************************************
* 函数名称: IrqInit(void)
* 功能说明: 绑定默认中断服务程序
* 输入参数: 无
* 输出参数: 无
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 由于在创建 IDT 时未绑定默认中断服务程序
    如果此时触发中断会发生未知的错误
    所以必须给所有中断绑定一个默认中断服务程序
******************************************************************************/
E_RET IrqInit(void)
{
E_IRQ_NUM irqNum = IRQ0;
E_RET ret = E_ERR;
for(irqNum = IRQ0; irqNum < IRQ_TOTAL; irqNum)
{
ret |= IrqRegister(irqNum, DefaultHander);
}
return ret;
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/thin-wind/KOS.git
git@gitee.com:thin-wind/KOS.git
thin-wind
KOS
KOS
main

搜索帮助