代码拉取完成,页面将自动刷新
#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;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。