一. 通用中断驱动
本文是 IMX6ULL 裸机篇---中断实验。旨在用 C 语言编写一套简单的中断驱动框架代码。
本实验会认识中断控制器: GIC控制器。
下面介绍一下大体工作如下:
1. 移植 SDK 包中断相关文件 。
主要是文件 core_ca7.h 的更改以及移植。因为core_ca7.h文件中定义了 GIC 结构体以及GIC控制器的操作接口。涉及主要接口如下:
2. 中断初始化。
其中包括GIC初始化,初始化中断向量表,设置中断向量偏移。
3. 初始化中断向量表。
4. 默认中断服务函数。
5. IRQ中断服务函数。
二. 代码实现
1. bsp.int.h 头文件
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
2. 中断函数实现:
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; i++)
{
irq_table[i].irq_handle = default_irqhandler;
irq_table[i].user_param = NULL;
}
}
/* 默认中断处理函数 */
void default_irqhandler(unsigned int gicciar, void* user_param)
{
while(1)
{
}
}
/* 注册中断处理函数*/
void system_register_irqhandler(IRQn_Type irq, system_irq_handle_t handler_func, void* param)
{
irq_table[irq].irq_handle = handler_func;
irq_table[irq].user_param = param;
}
/* 具体的中断处理函数, IRQ_handler会调用此函数*/
//gicciar: 触发IRQ中断的中断ID
void system_irqhandler(unsigned int gicciar)
{
uint32_t index = gicciar & 0x3ff;
if(index >= 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号)。文章来源:https://www.toymoban.com/news/detail-423253.html
文章来源地址https://www.toymoban.com/news/detail-423253.html
到了这里,关于IMX6ULL裸机篇之中断实验-通用中断驱动说明二的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!