【linux-IMX6ULL中断配置流程】

2024-05-07 22:36

本文主要是介绍【linux-IMX6ULL中断配置流程】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1. Cortex-A7和GIC中断概述
    • 1. 1 Cortex-A7中断系统:
    • 1. 2 GIC中断控制器简介:
  • 2. 中断配置概述
  • 3. 底层中断文件配置
    • 3.1 对启动文件.s的配置思路
    • 3.2 对中断函数配置思路
  • 4. 上层中断配置流程

1. Cortex-A7和GIC中断概述

  学习IMX6UL的中断处理系统,可以参考STM32的中断系统,并把知识点迁移过来:如下图,IMX6ULL与STM32最大的不同的就是IMX6ULL的中断控制器GIC( general interrupt controller),其他总体思路都是类似的:

  但是对于裸机编程而言,没有标准库可以直接调用,因此对于裸机而言,配置中断可分为底层配置,把相关的函数封装完毕,另外一个就是对这些封装好的函数进行调用,这里就和STM32使用标准库类似了

1. 1 Cortex-A7中断系统:

  对于Cortex-A7而言,有8个中断系统,但是我们常用的就是复位中断IRQ中断,因此主要了解就是IRQ中断;属于IRQ的中断有很多,我们怎么确定是哪一个类型的的呢?这个判断就是交给下面的GIC中断控制器。

1. 2 GIC中断控制器简介:

  GIC控制器负责确定发生了那个中断并报给arm内核,由于目前只关注IRQ中断类型,因此GIC上报给ARM内核的只有IRQ中断类型:GIC中比较重要的点就是中断ID号和SPI中断类型。

  重点关注的点1:就是我们使用的中断ID号是32-1019,但是在IM6ULL中我们使用的只有160个中断,其中前32个我们用不到,因此我实际用到的中断ID号就是32-159
  重点关注的点2:SPI(Shared Peripheral Interrupt)中断类型,所有核共享的中断,比如按键中断、串口中断等等,这些中断所有的 Core 都可以处理,不限定特定 Core。

2. 中断配置概述

  配置中断,拿IRQ中断类型来说,分两种情况,第一种情况是底层中断配置,因为是裸机编程,所以底层中断配置有两大类,一类就是启动文件的编写,和系统中断函数的编写;启动文件的编写主要有包含现场保护、CP15协处理器的中断功能编写、GIC中断控制器的编写、系统中断服务函数的调用、恢复现场这几大块;这个系统中断函数不是中断服务函数,中断服务函数属于上层编写,编写完毕并进行注册一就可以的。而对于系统中断函数则牵扯的就更多,其中就有中断初始化(包括GIC、中断偏移量、中断向量表的初始化)、中断向量表的编写、中断注册函数的编写;

  第二种情况就是上层的中断初始化编写,类似于STM32的标准库的中断的处理流程,拿外部输入触发的中断来举例,主要编写的内容就是中断初始化函数和中断服务函数的编写两大块,其中中断初始化函数包括:引脚的模式要配置成中断触发(例如上升沿触发中断)、其次就是使能GIC中断控制器,(底层已经初始化了GIC控制器,但是初始化不等于使能),然后就是调用中断注册函数,对中断服务函数进行注册(实际就是把中断服务函数的地址传到中断向量表中);另外中断服务函数编写我们要处理的程序。
在这里插入图片描述

3. 底层中断文件配置

  由于这些内容比较复杂,因此这里对整体的思路做一个抽象的概括,相当于掌握大纲,即首先对整个配置流程有一个理解,具体细节的配置要根据代码详细揣摩

3.1 对启动文件.s的配置思路

  由于是裸机编程,因此首先就是在启动文件中对各个中断模式进行设置,而对于IMX6ULL而言有7种中断模式,但是我们最关注的是reset_Handler和IRQ_Handler,这里拿IRQ的中断模式进行说明,其他都是类似的,首先就是触发中断,进入到IRQ_Handler函数中:如下伪代码

.global _start
_start:1. 第一步:配置IRQ中断处理函数:ldr pc,=IRQ_Handler      /*IRQ中断 */.......
IRQ_Handler:......./*处理过程*/2. 第二步:保护现场3. 第三步:处理CP15协处理器4. 第四步:处理GIC中断控制器5. 第五步:进入到中断服务函数6. 第六步:恢复现场
  1. 第一步:配置IRQ中断处理函数:
  2. 第二步:保护现场
  3. 第三步:处理CP15协处理器
  4. 第四步:处理GIC中断控制器
  5. 第五步:进入到中断服务函数
  6. 第六步:恢复现场

对于启动文件中的编写就是大体如此,其次就是对中断函数的编写:

3.2 对中断函数配置思路

  注意,这里的中断函数不是中断服务函数,中断服务函数是最终的处理函数,我们要先配置好中断函数,这样才能正确进入到中断服务函数;
  我们在中断函数中要做的工作主要是包括以下部分:中断初始化(包含初始化GIC中断控制器金设置中断偏移量),中断偏移量的设置,然后就是中断向量表的建立及初始化,其次就是对注册中断服务函数的编写,以便于对中断服务函数进注册;总体思路如下:

  1. 中断初始化:包括:GIC中的初始化,系统中断向量表的初始化,以及中断向量偏移的设置:
  2. 建立系统中断向量表:对于IMX6ULL是包含160个中断,可以用一个结构体数组来表示:这个结构体数组包含两部分,第一部分是用来存储中断服务函数的地址,另外一个就是用户参数
  3. 注册中断服务函数:编写中断服务注册函数,方便对中断服务函数进行注册,也就是负责给中断向量表写入中断服务函数的地址;
  4. 中断处理函数: 系统中断函数是放入启动文件中的函数,这个函数通过中断号直接读取结构体数组中对应的元素,这个元素的第一个参数就是中断服务函数的地址,所以要对中断服务函数进行编写完成后要进行注册,注意的是中断是可以嵌套的:

在这里插入图片描述

4. 上层中断配置流程

  对于上层而言,中断触发的方式很多,包括GPIO中断出触发、IIC中断触发、UART中断触发等等,这里拿GPIO的外部输入中断配置而言就是分为两步:中断初始化函数的编写和中断分服务函数的编写,其中中断初始化包括:GPIO初始化、GIC使能、对中断服务函数进行注册、GPIO中断使能;对于中断服务函数的编写就是处理中断程序,具体代码如下,比较简单:

/*初始化外部中断————GPIO_18*/void exit_init(void)
{gpio_pin_config_t key_config;IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18,0);IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18,0xF080);key_config.direction=kGPIO_DigitalInput;key_config.interruptMode=kGPIO_IntFallingEdge;  //注意这里错误//错误设置成低电平触发:导致按键按下去频繁进入中断//key_config.interruptMode=kGPIO_IntLowLevelkey_config.outputLogic = 1;gpio_init(GPIO1,18,&key_config);GIC_EnableIRQ(GPIO1_Combined_16_31_IRQn);system_register_irqhandler(GPIO1_Combined_16_31_IRQn,gpio1_io18_irqhandler,NULL);gpio_enable_int(GPIO1,18);}
/*中断处理函数*/
void gpio1_io18_irqhandler(unsigned int gicciar,void *param)
{static int status = 0 ;delay(20);if(gpio_pinread(GPIO1,18)==0){status=!status;led_switch(LED0,status);// beep_switch(status);}/* 清除中断标志位*/gpio_clearintflags(GPIO1,18);}

这篇关于【linux-IMX6ULL中断配置流程】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968580

相关文章

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

mysql-8.0.30压缩包版安装和配置MySQL环境过程

《mysql-8.0.30压缩包版安装和配置MySQL环境过程》该文章介绍了如何在Windows系统中下载、安装和配置MySQL数据库,包括下载地址、解压文件、创建和配置my.ini文件、设置环境变量... 目录压缩包安装配置下载配置环境变量下载和初始化总结压缩包安装配置下载下载地址:https://d

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio