本文是 IMX6ULL 裸机篇---中断实验。旨在用 C 语言编写一套简单的中断驱动框架代码。
本实验会认识中断控制器: GIC控制器。
下面介绍一下大体工作如下:
1. 移植 SDK 包中断相关文件 。
主要是文件 core_ca7.h 的更改以及移植。因为core_ca7.h文件中定义了 GIC 结构体以及GIC控制器的操作接口。涉及主要接口如下:
2. 中断初始化。
其中包括GIC初始化,初始化中断向量表,设置中断向量偏移。
3. 初始化中断向量表。
4. 默认中断服务函数。
5. IRQ中断服务函数。
bsp_int.h头文件需要创建一个函数指针和结构体。bsp_int.h文件代码实现如下:
#ifndef __BSP_INT_H_
#define __BSP_INT_H_
#include "imx6ull.h"
/* 定义中断函数指针 */
typedef void (*system_irq_handle_t)(unsigned int gicciar, void* param);
/* 中断处理函数结构体 */
typedef struct _sys_irq_handle {
system_irq_handle_t irq_handle;
void* user_param;
}sys_irq_handle_t;
void int_init(void);
void default_irqhandler(unsigned int gicciar, void* user_param);
void system_register_irqhandler(IRQn_Type irq, system_irq_handle_t handler_func, void* param);
#endif
bsp_int.c 文件代码实现如下:
#include "bsp_int.h"
//中断嵌套计数器
static int irqNesting;
//中断处理函数表
static sys_irq_handle_t irq_table[NUMBER_OF_INT_VECTORS];
/* 中断初始化函数 */
void int_init(void)
{
GIC_Init(); //GIC初始化
system_irqtable_init(); //中断向量表初始化
//中断向量偏移设置
__set_VBAR(0x87800000);
}
/* 初始化中断处理函数表 */
void system_irqtable_init(void)
{
int i = 0;
irqNesting = 0;
for(i =0; i= NUMBER_OF_INT_VECTORS) //检查中断ID值
{
return;
}
irqNesting++;
//根据中断ID号,选择中断函数-->执行
irq_table[index].irq_handle(index, irq_table[index].user_param);
irqNesting--;
}
在上述代码实现中,启动文件 start.S 文件中的中断服务函数 IRQ_Handler 中,调用了上面的 C 函数 system_irqhandler。start.S汇编中提供了函数参数(即中断ID号)。