【裸机开发】IRQ 中断服务函数(二)—— 全局中断初始化

news/2024/11/29 22:34:37/

实现了 IRQ 中断服务函数的汇编部分以后,接下来我们要使用C代码实现IRQ中断服务函数的具体逻辑,主要包含初始化和中断处理两部分。

  • 全局中断初始化(全局中断使能、IRQ中断使能)
  • 具体中断处理逻辑实现

目录

一、全局中断初始化(理论流程)

二、IRQ 中断使能

1、认识中断ID

2、IRQ 中断使能实现

三、初始化 IRQ 中断服务函数表

1、中断服务函数指针

2、中断服务函数表声明

3、中断服务函数表初始化

四、总结:中断服务函数接口

1、通用中断服务函数(system_irqhandler)

2、中断服务函数注册接口

3、中断初始化接口


一、全局中断初始化(理论流程)

全局中断初始化的基本流程如下:

① GIC全局中断使能:相当于打开中断控制器

② IRQ中断使能:IRQ目前用于用户日常使用的有128种,我们需要手动指定具体哪一种中断使能

③ 初始化服务函数表:IRQ 一共160 种中断,我们需要为每一种中断分配一个默认的中断服务函数

④ 设置中断向量表:中断向量表默认保存在 0x00000000 的位置,但是 0x00000000 保存了boot rom 相关内容,所以我们有时需要把中断向量表换个地方保存。

二、IRQ 中断使能

IRQ 中断使能需要具体到某种具体的外设中断,即你要打开哪一种类型的中断,GPIO 的中断还是SPI 的中断。因此,在实现IRQ中断使能之前需要先了解中断ID

1、认识中断ID

IRQ 中断是我们最常用的一种中断,包含了所有外设可能产生的中断,如按键、I2C、SPI 等。为了区分这些外设产生的中断,IRQ 中断为这些外设产生的中断分配了中断号。

0~15号:这 16 个 ID 分配给 SGI(软件中断)。由软件触发引起的中断,通过向寄存器 GICD_SGIR 写入数据来触发,系统会使用 SGI 中断来完成多核之间的通信。

16~31号:这16个ID分配给 PPI(私有中断)。一个CPU可能包含多核,每个核有自己独有的中断,这些独有中断只能在指定的核中处理,我们称这种中断为“ 私有中断 ”。

32~1019号:剩余的分配给 SPI(共享中断)。一个CPU可能包含多核,共享中断在所有的核中都可以得到处理,不仅限于某个特定的核。(目前只用了 128 个)

2、IRQ 中断使能实现

IRQ 中断使能使用的是SDK中的接口。下面的 99 是中断ID,比如你要使用 GPIO1 的 0 -15 引脚,对应的中断ID就是66 + 32 = 98;如果要使用 GPIO1 的 16 - 31 引脚,对应的中断 ID 就是 67 + 32 = 99

注意:这里的 32 表示SGI 和 PPI 对应的32种中断,用户无法干涉。

#include "core_ca7.h"/* 使能GIC 中 IRQ 的某个外设对应的中断 */
GIC_EnableIRQ(99);    

三、初始化 IRQ 中断服务函数表

为了区分IRQ中断具体来自于哪个外设,定义了 160 种中断(前32种中断有特殊用途),我们要做的第一件事就是给这些中断配上默认的中断函数。

1、中断服务函数指针

为了管理前面说到了的 160 种中断,我们要定义一个函数指针数组,数组中保存的是函数指针(也就是函数地址),因此我们需要确定函数指针的类型。

/* 中断服务函数的格式 */
typedef void (*irqhandler_t)(void* userParams);
  • 函数指针类型名:irqhandler_t
  • 函数格式:
    • 形参:void*,后续可能需要给中断服务函数传递参数
    • 返回值:void

2、中断服务函数表声明

为了管理每一种中断对应的中断服务函数,我们要创建一个数组,数组的下标就代表中断ID,下标对应的就是中断服务函数指针。

#define MAX_INT 160/* 管理着所有的irq中断服务函数 */
irqhandler_t irqTable[MAX_INT];

3、中断服务函数表初始化

接下来我们要给这 160 个中断服务函数表逐一赋予默认中断服务函数,所以我们先简单定义一个默认中断服务函数。函数格式必须按照最开始的中断服务函数指针的格式来。

/* 默认中断服务函数 */
void default_irqhandler(void* userParams)
{return;
}

然后我们为中断服务函数表中的每一个元素进行初始化

/* 初始化 irq 中断服务函数表 */
void irqtable_init()
{unsigned int i = 0;for (; i < MAX_INT; i++){irqTable[i] = default_irqhandler;}
}

四、总结:中断服务函数接口

1、通用中断服务函数(system_irqhandler)

在汇编部分,我们已经获取到了中断ID,在通用中断服务函数中,我们要根据这个中断ID执行对应的中断服务函数。

代码中 giccIar 就是中断ID,我们根据中断ID可以在中断服务函数表中找到对应的函数地址(函数指针),直接调用即可。

/* 通用中断服务函数 */
void system_irqhandler(unsigned int giccIar)
{// GICC_IAR 寄存器低10位用于存储中断IDunsigned int intID = giccIar & 0x3ff;            if (giccIar > MAX_INT){return;}// 如果没有要传递的内容,那就传递 (void*)0irqTable[giccIar]((void *)0);
}

2、中断服务函数注册接口

方才我们只是给中断服务函数表中每一个中断ID赋予了默认中断服务函数指针,后续可能会在其他地方要修改中断ID对应的中断服务函数,因此我们这里定义一个“注册中断服务函数”

/* 注册中断服务函数 */
void register_irqhandler(unsigned int intID, irqhandler_t handler)
{irqTable[intID] = handler;
}

 

3、中断初始化接口

GIC 全局中断使能 和 IRQ 中断使能用的都是 SDK 中的接口。

#include "core_ca7.h"/* 中断初始化 */
void interrupt_init()
{/* GIC 全局中断使能初始化 */GIC_Init();/* irq 中断服务函数表初始化 */irqtable_init();/* 设置中断向量表偏移 */__set_VBAR((uint32_t)0x87800000);/* 使能GIC 中 IRQ 的某个外设对应的中断 */GIC_EnableIRQ(99);    
}

http://www.ppmy.cn/news/537182.html

相关文章

为什么要写这个带点玄幻气息的英语单词记忆博客

&#x1f31f;博主&#xff1a;命运之光 ☀️专栏&#xff1a;英之剑法&#x1f5e1; ❤️‍&#x1f525;专栏&#xff1a;英之试炼&#x1f525; ☀️博主的其他文章&#xff1a;点击进入博主的主页 &#x1f433; 开篇想说的话&#xff1a;开学就大三了&#xff0c;命运之光…

局域网聊天连接全集

布谷鸟2008 局域网聊天工具2008 5.01 下载- 华军软件园- 网络工具 ... 《布谷鸟2008 第二版》局域网聊天通讯办公软件&#xff0c;免费使用&#xff0c;无须注册。可实现局域网络间跨网段的聊天、群聊、和传送文件外&#xff0c;还包括&#xff1a;“日程安排”“通讯录”“个人…

公司禁用QQ之旅

公司要求上班时间禁止使用QQ等聊天工具&#xff0c;刚开始时想着直接把QQ使用的端口禁用掉&#xff0c;真正去实施时就发现问题来了&#xff0c;BT的腾讯&#xff0c;居然使用的是4000&#xff0c;8000&#xff0c;80端口&#xff0c;晕死&#xff0c;这些端口还真的关不得&…

公司禁用U盘的方法总结

U盘虽好&#xff0c;未必被公司管理者待见。因为员工乱插U盘会带来潜在病毒风险&#xff0c;最关键的是担心员工把重要文件通过优盘拷走了。公司禁用U盘是绕不过去的一道坎。 总结下常见的禁用U盘的方法&#xff1a; 方法一&#xff0c;物理封堵法&#xff1a; 把机箱所有US…

CoreMark 跑个分:OrangePi5 RK3588S

一、 Orange Pi 5 简介 Orange Pi 5 采用了瑞芯微 RK3588S 新一代八核 64 位处理器&#xff0c;具体为四核A76四核A55&#xff0c;采用了 8nm 工艺设计&#xff0c;主频最高可达 2.4GHz&#xff0c;集成 ARM Mali-G610 MP4 GPU&#xff0c;内嵌高性能 3D 和 2D 图像加速模块&am…

高校学生考勤系统

摘 要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括高校学生考勤系统的网络应用&#xff0c;在外国高校学生考勤系统已经是很普遍的方式&#xff0c;不过国内的高校学生考勤可能还处于起步阶段。高校学生考勤系统具有管理…

光纤的分类

光纤分为单模光纤和多模光纤。 单模光纤&#xff08;Single Mode Fiber)采用激光二极管作为光源&#xff0c;波长分为1310nm和1550mn两种。单模光纤的纤芯直径为8.3μm&#xff0c;包层外径为125μm,可表示为8.3/125μm。单模光纤色散很小&#xff0c;适用于远程通信。如果希望…

【计算机网络】物理媒介-双绞铜线、同轴电缆、光纤、陆地无线电信道和卫星无线电信道

计算机网络物理媒介 图解传输与物理媒介简介-一个比特的简短历程1、双绞铜线2、同轴电缆3、光纤4、陆地无线电信道5、卫星无线电信道 图解传输与物理媒介 简介-一个比特的简短历程 一个比特从一个端系统开始传输&#xff0c;经过一系列链路和路由器&#xff0c;到达另一个端系…