IMX6ULL裸机篇之中断实验-通用中断驱动说明二

news2024/9/30 11:26:13

一.   通用中断驱动

本文是 IMX6ULL 裸机篇---中断实验。旨在用 C 语言编写一套简单的中断驱动框架代码。

start.S 文件中,我们在中断服务函数 IRQ_Handler 中调用了 C 函数 system_irqhandler 来处
理具体的中断。

本实验会认识中断控制器: GIC控制器。

I.MX6U(Cortex-A)的中断控制器,关于 GIC 的详细内容请参考开发板光盘中的文档《ARM Generic Interrupt Controller(ARM GIC 控制器)V2.0.pdf》
GIC 是 ARM 公司给 Cortex-A/R 内核提供的一个中断控制器,类似 Cortex-M 内核中的
NVIC。GIC V2 是给 ARMv7-A 架构使用的,比如 Cortex-A7、Cortex-A9、Cortex-A15 等,
V3 和 V4 是给 ARMv8-A/R 架构使用的,也就是 64 位芯片使用的。
I.MX6U 是 Cortex-A 内核 的,因此我们主要讲解 GIC V2。

下面介绍一下大体工作如下:

1.  SDK 包中断相关文件 。

主要是文件 core_ca7.h 的更改以及移植。因为core_ca7.h文件中定义了 GIC 结构体以及GIC控制器的操作接口。涉及主要接口如下:

 

2.   中断初始化。

其中包括GIC初始化,初始化中断向量表,设置中断向量偏移。

3.  初始化中断向量表。

4.  默认中断服务函数。

这是一个空函数,主要用来给初始化中断函数处理表。

 

5.  IRQ中断服务函数。

在 start.S 中调用的 system_irqhandler 函数,此函数根据中断号在中断处理函数表 irqTable 中取出对应的中断处理函数并执行。

二.  代码实现

1.  bsp.int.h 头文件

bsp 目录下新建名为 "int" 的文件夹,在 bsp/int 文件夹里面创建 bsp_int.c 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号)。

system_irqhandler() 函数 来处理具体的中断。但是函数 system_irqhandler 的具体内容还
没有实现,所以需要实现函数 system_irqhandler 的具体内容。
不同的中断源对应不同的中断处理函数,I.MX6U 有 160 个中断源,所以需要 160 个中断处理函数。
我们可以将这些中断处理函数放到一个数组里面,中断处理函数在数组中的标号,就是其对应的中断号。
当中断发生以后,system_irqhandler函数 根据中断号从中断处理函数数组中找到对应的中断处理函数并执行即可。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/438024.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RT-DETR论文学习笔记(DETRs Beat YOLOs on Real-time Object Detection)

论文地址&#xff1a;https://arxiv.org/abs/2304.08069 代码地址&#xff1a;GitHub - PaddlePaddle/PaddleDetection: Object Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time mult…

完美解决丨ValueError: time data ‘2018/12/24‘ does not match format ‘%Y/%m/%d‘

这里我选择的是&#xff1a; python from datetime import datetime date datetime.strptime(2018/12/24, %Y/%m/%d) 如果你可以执行这段代码&#xff0c;那么你可能会收到这样的报错&#xff1a; python Traceback (most recent call last): File "C:\Users\Administra…

机器学习中最基本的概念之一:数据集、样本、特征和标签

本文重点 数据集、样本、特征和标签是机器学习中的重要概念,这些概念在机器学习算法的设计和实现过程中起着至关重要的作用。在本文中,我们将对这些概念进行详细的讲解,以便更好地理解机器学习算法的基本原理和应用。 一、数据集 数据集是机器学习中最基本的概念之一,它…

VUE3 取Slot元素方法

VUE3 取Slot元素方法 话说前面,这方法诡异的很…尽量不要用. 我这里要实现一个对slot元素进行方法拓展的事情 就比如说我要给一个元素添加自定义拖放事件,正常来说大概是这样的 //vue3 <template><div class"custom" ref"el"><slot> …

Visual Instruction Tuning: 用LLaVA近似多模态GPT-4

©Paperweekly 原创 作者 | Chunyuan Li 使用 GPT-4 进行视觉指令学习&#xff01;Visual Instruction Tuning with GPT-4! ▲ Generated by GLIGEN (https://gligen.github.io/): A cute lava llama and glasses 我们分享了 LLaVA (Language-and-Vision Assistant)&#…

linux工具gcc/g++/gdb/git的使用

目录 gcc/g 基本概念 指令集 函数库 &#xff08;重要&#xff09; gdb使用 基本概念 指令集 项目自动化构建工具make/makefile 进度条小程序 ​编辑 git三板斧 创建仓库 git add git commit git push git status git log gcc/g 基本概念 gcc/g称为编译器…

集合详解之(五)Map集合

文章目录 &#x1f412;个人主页&#x1f3c5;JavaSE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;Map集合的介绍&#x1fa85;如何保证键的不重复性&#xff1f;&#xff08;equals()与hashCode()方法的联用&#xff09;&#x1f380;HashMap集合及常用方法&#x1f38…

电能计量自动化系统在用电管理上的应用

【摘要】&#xff1a;电能计量自动化系统在用电管理上的应用&#xff0c;不仅能够实现远程自动抄表&#xff0c;减少企业在人力资源成本上的投入&#xff0c;切实地维护企业的核心利益&#xff0c;创造出更多的经济效益。还能够通过装置在线监测与配网防窥电功能实现对电能计量…

D. Tokitsukaze, CSL and Stone Game(博弈)

Problem - D - Codeforces 时津风和CSL正在玩一个石头的小游戏。 一开始&#xff0c;有n个石子堆&#xff0c;其中第ii堆有aiai石子。两位玩家轮流走棋。时津风先走。每一回合&#xff0c;棋手选择一个非空的棋堆&#xff0c;并从该棋堆中准确地取出一块石头。如果在轮到他之前…

2 路 500MSPS/1GSPS/1.25GSPS 14 位直流耦合 AD 采集 FMC 子卡模块

板卡概述 FMC155 是一款基于 VITA57.1 标准的&#xff0c;实现 2 路 14-bit、 500MSPS/1GSPS/1.25GSPS 直流耦合 ADC 同步采集 FMC 子卡模 块。该模块遵循 VITA57.1 规范&#xff0c;可直接与 FPGA 载卡配合使用&#xff0c;板 卡 ADC 器件采用 ADI 的 AD9680 芯片&#xf…

Python每日一练(20230420)

目录 1. 数组逐位判断 &#x1f31f; 2. 交错字符串 &#x1f31f;&#x1f31f; 3. 二进制求和 &#x1f31f; 4. 四舍六入五成双规则 &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 J…

12、HOOK原理下

一、去符号和恢复符号 1.1 Stip和 Strip Type解释 strip在iOS中的作用是 剥掉目标文件中一些符号信息和调试信息&#xff0c;使文件变小。dead code strip &#xff1a; 死代码剥离、然后再去链接。那么strip在哪些地方不能起作用呢&#xff1f; 动态库 不能strip全局符号、因…

Windows下使用SSH密钥实现免密登陆Linux服务器

工具&#xff1a; win10、WinSCP 生成ssh密钥&#xff1a; 打开终端&#xff0c;使账号密码登录&#xff0c;输入命令 ssh-keygen -t rsa 会提示密钥存放路径&#xff0c;一般存放在默认路径&#xff0c;直接回车即可&#xff0c;中间会提示输入密码&#xff0c;这里需要注…

工作流自动化和RPA自动化,哪个更适合你?

2018年&#xff0c;一款名为《Overcooked!2》&#xff08;又名“胡闹厨房”、“分手厨房”&#xff09;的多人合作模拟类游戏风靡全球&#xff0c;在游戏中&#xff0c;玩家扮演厨师在充满各种障碍和危险的厨房里准备食材、烹饪、上菜和清理&#xff0c;需要在尽可能短的时间内…

window11开启wsl2

前言 以前玩linux&#xff0c;总是习惯装双系统&#xff0c;其实双系统特别麻烦。wsl现在的功能其实挺强大的&#xff0c;完全可以代替双系统&#xff0c;去完成一些在linux上的环境搭建。这篇文章记录下window11如何开启wsl2功能&#xff0c;并且安装ubuntu系统。 开启wsl2功…

2023自助洗车店系统解决方案共享洗车无人洗车风口

2021年中国汽车保有量预计超6.3亿辆,洗车市场需求巨大,传统洗车投资大、费用贵、成本高耗水大、占地面积大,而自助洗车机占据传统洗车耗水量1/4 ,占地面积1/70 ;节能环保得到政府的大力支持,且结合信息物联技术,实现智能化管理,高效能运营,灵活便捷服务,符合智慧城市发展原则,成…

开放式耳机有什么好处,列举几款性能高的开放式蓝牙耳机

骨传导耳机也称为“不入耳式”耳机&#xff0c;是一种通过颅骨、骨迷路、内耳淋巴液和听神经之间的信号传导&#xff0c;来达到听力保护目的的一种技术。由于它可以开放双耳&#xff0c;所以在跑步、骑行等运动时使用十分安全&#xff0c;可以避免外界的干扰。这种耳机在佩戴时…

AAAI 2023 | 基于Conductance的高效率和高质量的图聚类算法

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; ╱ 作者简介╱ 林隆龙 博士、副教授 目前任职于西南大学计算机与信息科学学院 软件学院。2022年6月于华中科技大学计算机科学与技术学院获博士学位。目前主要研究兴趣包括(时序)社区挖掘、局部聚类、Personaliz…

Altium Designer 20 导出 Gerber 制造文件流程及注意事项

一、导出 Gerber 流程 设置原点&#xff1a;在Edit菜单中选择Origin&#xff0d;Set &#xff08;快捷键E-O-S&#xff09;定好原点&#xff0c;一般放在左下角附近即可。 放置分孔图表&#xff1a;在Place菜单中选择String放置“.Legend”&#xff08;快捷键P-S&#xff09;…

C++多线程编程(一) thread类初窥

多线程编程使我们的程序能够同时执行多项任务。 在C11以前&#xff0c;C没有标准的多线程库&#xff0c;只能使用C语言中的pthread&#xff0c;在C11之后&#xff0c;C标准库中增加了thread类用于多线程编程。thread类其实是对pthread的封装&#xff0c;不过更加好用&#xff…