【裸机程序】IMX 6ULL的中断机制的理解

1、 创作灵感

在学习imx 6ull裸机程序的时候,遇到的第一个难点就是中断。主要是因为使用了稍微复杂的数据结构,中断处理的机制相比stm32更加复杂,写一篇博客,浅浅的记录下。

2、中断的初始化

21.定义数据结构

1、首先定义了一个指针system_irq_handler_t指向中断处理的函数

/* 中断服务函数形式 */

typedef void (*system_irq_handler_t) (unsigned int giccIar, void *param);

2、定义中断服务函数的结构体

结构体sys_irq_handle_t包含了一个函数指针,还包含了一个参数

/* 中断服务函数结构体*/

typedef struct _sys_irq_handle

{

system_irq_handler_t irqHandler; /* 中断服务函数 */

void *userParam; /* 中断服务函数参数 */

} sys_irq_handle_t;

3、定义函数表

因为有多个中断源,所以定义结构体数组存储这些中断源的中断服务函数,数组的每个元素都是sys_irq_handle_t类型的结构体。

/* 中断服务函数表 */

static sys_irq_handle_t irqTableNUMBER_OF_INT_VECTORS;

3、中断处理的流程

中断发生以后会调用汇编写的 IRQ Hander函数读取GICC IAR获取具体中断号,然后调用C函数处理中断

具体代码如下:

1、首先初始化中断控制器GIC

cpp 复制代码
void int_init(void)
{
	GIC_Init(); 						/* 初始化GIC 							*/
	system_irqtable_init();				/* 初始化中断表 							*/
	__set_VBAR((uint32_t)0x87800000); 	/* 中断向量表偏移,偏移到起始地址   				*/
}

2、初始化中断函数表

cpp 复制代码
void system_irqtable_init(void)
{
	unsigned int i = 0;
	irqNesting = 0;
	
	/* 先将所有的中断服务函数设置为默认值 */
	for(i = 0; i < NUMBER_OF_INT_VECTORS; i++)
	{
		system_register_irqhandler((IRQn_Type)i,default_irqhandler, NULL);
	}
}

3、编写和注册中断服务函数

中断服务子函数就是发生中断以后要做的事情,通过system_register_irqhandler函数将中断服务子函数的指针填进中断函数表,发生中断以后根据中断号找到中断函数表中对应的函数执行。

以后如果要使用其他的中断,编写其他中断函数,完成注册即可。

cpp 复制代码
void system_register_irqhandler(IRQn_Type irq, system_irq_handler_t handler, void *userParam) 
{
	irqTable[irq].irqHandler = handler;
  	irqTable[irq].userParam = userParam;
}

/*
 * @description			: C语言中断服务函数,irq汇编中断服务函数会
 						  调用此函数,此函数通过在中断服务列表中查
 						  找指定中断号所对应的中断处理函数并执行。
 * @param - giccIar		: 中断号
 * @return 				: 无
 */
void system_irqhandler(unsigned int giccIar) 
{

   uint32_t intNum = giccIar & 0x3FFUL;
   
   /* 检查中断号是否符合要求 */
   if ((intNum == 1023) || (intNum >= NUMBER_OF_INT_VECTORS))
   {
	 	return;
   }
 
   irqNesting++;	/* 中断嵌套计数器加一 */

   /* 根据传递进来的中断号,在irqTable中调用确定的中断服务函数*/
   irqTable[intNum].irqHandler(intNum, irqTable[intNum].userParam);
 
   irqNesting--;	/* 中断执行完成,中断嵌套寄存器减一 */

}
相关推荐
安妮细水长流3 小时前
ad7124
c语言·单片机
花月mmc5 小时前
【FPGA】神经网络内容简介预告
嵌入式硬件·深度学习·神经网络·fpga开发
en.en..6 小时前
STM32 HAL 库 | 核心知识点整理
单片机·嵌入式硬件
无敌贵点大王6 小时前
从寄存器层面重学STM32(9)——DMA理论
stm32·单片机·嵌入式硬件
希和20277 小时前
51 单片机入门笔记:江科大课程代码逐行讲解(按键控制 LED 流水灯)
笔记·单片机·mongodb
希和20277 小时前
51 单片机按键控制 LED:江科大课程代码小白笔记
笔记·单片机·嵌入式硬件
希和20277 小时前
51 单片机 LED 流水灯:从直接法到循环法(江科大课程笔记)
笔记·单片机·mongodb
Zwawa20 小时前
用两个按键做一个OLED菜单:先把选择和执行分开
c语言·单片机·嵌入式
Dev_XH1 天前
【成品设计】基于CH32H417的CH32H417AIOT家庭微电网
单片机·嵌入式硬件·物联网·ai
国科安芯1 天前
人在回路中的总线:商业空间站环境控制与生命保障系统CANFD网络的可靠性与功能安全
网络·嵌入式硬件·安全·架构·php·抗辐射