【裸机程序】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--;	/* 中断执行完成,中断嵌套寄存器减一 */

}
相关推荐
cu1431 小时前
细谈GM8229的具体功能与其应用
c语言·c++·人工智能·单片机
HRTOS2 小时前
HRTOS 任务优先级与调度模式说明
单片机·嵌入式硬件·系统架构·51单片机
cu1432 小时前
细谈GM7123C的具体功能与其应用
c语言·c++·人工智能·嵌入式硬件
嵌入式分享3 小时前
驱动之路#44:硬件 I2C 和软件 I2C 谁更坑?
linux·嵌入式硬件
嵌入式分享4 小时前
嵌入式分享#19:《嵌入式外设调试思路》--I2C设备篇
单片机·嵌入式硬件
WD137298015574 小时前
WD5030K输入工作电压 7.5‑30V,适合12A 及以内量产项目
stm32·单片机·嵌入式硬件·51单片机
千秋岁rr5 小时前
12.IIC
单片机·嵌入式硬件
光子物联单片机5 小时前
STM32传感器模块编程实践(二十二)DIY智能WIFI视频控制小车
c语言·stm32·单片机·嵌入式硬件·音视频
jucat6 小时前
拆个烟雾报警器
嵌入式硬件