当前位置: 首页 > news >正文

做平面的素材网站站长工具seo查询5g5g

做平面的素材网站,站长工具seo查询5g5g,曹县网站开发公司,懂得做网站还可以做什么兼职文章目录 1. Cortex-A7 中断系统1.1 分析1.2 具体处理流程 2. 外部中断服务函数的初始化2.1 基本流程分析2.2 具体代码分析2.2.1. 定义中断处理类型和结构体2.2.2. 初始化中断系统2.2.3. 注册中断处理函数2.2.4. 具体的中断处理逻辑2.2.5. 默认的中断处理函数 3. 完整代码 本文…

文章目录

  • 1. Cortex-A7 中断系统
    • 1.1 分析
    • 1.2 具体处理流程
  • 2. 外部中断服务函数的初始化
    • 2.1 基本流程分析
    • 2.2 具体代码分析
      • 2.2.1. 定义中断处理类型和结构体
      • 2.2.2. 初始化中断系统
      • 2.2.3. 注册中断处理函数
      • 2.2.4. 具体的中断处理逻辑
      • 2.2.5. 默认的中断处理函数
  • 3. 完整代码

本文章结合了正点原子的 i.mx6u嵌入式Linux开发指南和笔者的理解。

1. Cortex-A7 中断系统

1.1 分析

1. 中断向量表:

  • Cortex-A7 也有中断向量表,位于代码的最前面。
  • 包含 8 个异常中断,每个中断对应一个向量地址和中断模式。
  • 表 17.1.2.1 列出了这 8 个中断:
    • 复位中断 (Reset):特权模式 (SVC)
    • 未定义指令中断 (Undefined Instruction):未定义指令中止模式 (Undef)
    • 软中断 (Software Interrupt, SWI):特权模式 (SVC)
    • 指令预取中止中断 (Prefetch Abort):中止模式
    • 数据访问中止中断 (Data Abort):中止模式
    • 未使用 (Not Used):未使用
    • IRQ 中断 (IRQ Interrupt):外部中断模式 (IRQ)
    • FIQ 中断 (FIQ Interrupt):快速中断模式 (FIQ)

2. Cortex-A7 中断向量表与 Cortex-M 的区别:

  • Cortex-M 中断向量表列举了芯片的所有中断向量,包括外设中断。
  • Cortex-A7 中断向量表只列出了 8 个基本中断,其中 IRQ 中断包含了所有外部中断。
  • 也就是说,Cortex-A7 中,所有外部中断都通过 IRQ 中断进行处理。

3. IRQ 中断处理:

  • 当任意一个外部中断发生时,都会触发 IRQ 中断。
  • IRQ 中断服务函数需要读取指定的寄存器来判断具体是哪个外部中断发生了。
  • 根据具体的中断做出相应的处理。

4. 外部中断与 IRQ 中断的关系:
在这里插入图片描述

  • 图中左侧的 Software0_IRQn~PMU_IRQ2_IRQ 都是 I.MX6U 的外部中断,它们都属于 IRQ 中断。
  • 当任意一个外部中断发生时,IRQ 中断会被触发。
  • 在 IRQ 中断服务函数中需要判断是哪个外部中断发生了,并进行相应的处理。

1.2 具体处理流程

  1. 某个外部中断发生。
  2. IRQ 中断被触发。
  3. IRQ 中断服务函数执行。
  4. IRQ 中断服务函数调用 C 语言中断处理函数。
  5. C 语言中断处理函数根据中断号判断是哪个外部中断发生了。
  6. C 语言中断处理函数执行相应的处理逻辑。
  • IRQ 中断就像一个“总开关”,而外部中断就像“子开关”。当某个子开关打开时,会触发总开关,然后需要根据子开关的具体情况进行处理。
  • 前面的文章我们已经对IRQ中断服务函数进行了初始化,设置在IRQ中断服务函数中执行C语言的中断服务函数:
ldr r2, =system_irqhandler	/* 加载C语言中断处理函数到r2寄存器中*/
blx r2						/* 运行C语言中断处理函数,带有一个参数,保存在R0寄存器中 */

下面我们就开始在C语言中,根据不同的中断号进行不同的中断服务函数初始化和处理。

2. 外部中断服务函数的初始化

2.1 基本流程分析

  1. 定义中断处理类型和结构体
  2. 初始化中断系统
  3. 注册中断处理函数
  4. 具体的中断处理逻辑
  5. 默认的中断处理函数

2.2 具体代码分析

2.2.1. 定义中断处理类型和结构体

此步骤定义了中断处理函数的类型别名 system_irq_handler_t 和中断处理函数结构体 sys_irq_handle_t

typedef void (*system_valve_handler_t)(unsigned int gicciar, void *param);typedef struct _sys_irq_handle{system_valve_handler_t irqHandler; // 中断处理函数void *usrparam;                    // 中断处理函数的参数
} sys_irq_handle_t;/*中断处理函数表*/
static sys_irq_handle_t irqTable[NUMBER_OF_INT_VECTORS];

解释

  • system_irq_handler_t 是一个函数指针类型,指向的函数用于处理中断,接收中断号和用户参数。
  • sys_irq_handle_t 结构体包含一个中断处理函数和一个用于传递给该函数的用户参数。
  • irqTable是一个结构体数组,包含所有外部中断的结构体,共NUMBER_OF_INT_VECTORS=160个。

2.2.2. 初始化中断系统

初始化中断系统包括 GIC 初始化和中断向量表的初始化。

/*初始中断向量表*/
void system_irqtable_init(void)
{irqNesting = 0;//中断计数器清0unsigned int i;for(i=0; i<NUMBER_OF_INT_VECTORS; i++){irqTable[i].irqHandler = default_irqhandler;irqTable[i].usrparam = NULL;}
}void int_Init(void)
{GIC_Init(); // 初始化GICsystem_irqtable_init();__set_VBAR(0x87800000); // 中断向量偏移设置
}

解释

  • GIC_Init() 调用是用来初始化通用中断控制器(Generic Interrupt Controller)。
  • system_irqtable_init() 初始化中断处理函数表,为每个可能的中断分配默认处理函数。
  • __set_VBAR(0x87800000) 设置中断向量基地址寄存器(VBAR)。

2.2.3. 注册中断处理函数

此步骤允许用户为特定的中断号注册自定义的处理函数。

void system_register_irqhandler(IRQn_Type irq, system_irq_handler_t handler, void *param)
{irqTable[irq].irqHandler = handler;irqTable[irq].usrparam = param;
}

解释

  • 通过指定的 irq 中断号,用户可以将自定义的处理函数 handler 和参数 param 注册到中断处理函数表 irqTable 中。

2.2.4. 具体的中断处理逻辑

  • 该部分是实际的中断处理逻辑,由具体的中断处理函数 system_irqhandler 实现。
  • system_irqhandler实际上由IRQ中断调用,完成了选择不同外部中断函数进行处理中断的功能。
void system_irqhandler(unsigned int gicciar)
{irqNesting++; // 中断计数器uint32_t intNum = gicciar & 0x3FF; // 从低10位获取中断IDif(intNum >= NUMBER_OF_INT_VECTORS) return; // 检查中断ID是否正常irqTable[intNum].irqHandler(intNum, irqTable[intNum].usrparam); // 根据中断号,选取中断处理函数执行irqNesting--; // 中断执行完,中断计数器-1
}

解释

  • irqNesting 记录当前正在处理的中断嵌套层数。
  • 通过 gicciar & 0x3FF 提取中断号,并检查其有效性,然后调用相应的中断处理函数。

2.2.5. 默认的中断处理函数

提供一个默认的中断处理函数,当没有特定的处理函数注册时使用。

void default_irqhandler(unsigned int gicciar, void *param)
{while(1); // 死循环,用于捕捉未处理的中断
}

解释

  • 这是一个防止未注册中断导致系统异常退出的安全措施。如果执行到此函数,表明发生了未注册处理函数的中断。

3. 完整代码

bsp_int.c

#include "bsp_int.h"
static unsigned int irqNesting;//中断计数器,用于嵌套/*中断处理函数表*/
static sys_irq_handle_t irqTable[NUMBER_OF_INT_VECTORS];
/*初始中断向量表*/
void system_irqtable_init(void)
{irqNesting = 0;//中断计数器清0unsigned int i;for(i=0; i<NUMBER_OF_INT_VECTORS; i++){irqTable[i].irqHandler = default_irqhandler;irqTable[i].usrparam = NULL;}
}/*注册中断处理函数*/
void system_register_irqhandler(IRQn_Type irq, system_irq_handler_t handler, void *param)
{irqTable[irq].irqHandler = handler;irqTable[irq].usrparam = param;
}//中断初始化函数
void int_Init(void)
{GIC_Init();//初始化GICsystem_irqtable_init();__set_VBAR(0x87800000);//中断向量偏移设置}/*具体的中断处理函数,IRQ_Handler会调用此C函数*/
void system_irqhandler(unsigned int gicciar)
{irqNesting++;//中断计数器uint32_t intNum = gicciar & 0x3FF;//从低10位获取中断ID//检查中断ID是否正常if(intNum >= NUMBER_OF_INT_VECTORS) return;//根据中断号,选取中断处理函数执行irqTable[intNum].irqHandler(intNum, irqTable[intNum].usrparam);irqNesting++;//中断执行完,中断计数器-1
}//默认中断处理函数
void default_irqhandler(unsigned int gicciar, void *param)
{while(1);
}

bsp_int.h

#ifndef __BSP_INT_H
#define __BSP_INT_H#include "imx6u.h"// 这段代码定义了一个类型别名 system_irq_handler_t,
// 用于表示一个指向中断处理函数的指针。
// 该函数指针指向的函数接收两个参数:
// 中断号
// 和一个指向任意类型数据的指针,用于传递额外的参数。
typedef void (*system_irq_handler_t)(unsigned int gicciar, void *param);//中断处理函数结构体
typedef struct _sys_irq_handle{system_irq_handler_t irqHandler;//中断处理函数void *usrparam;//中断处理函数的参数
}sys_irq_handle_t;void int_Init(void);
void system_irqtable_init();
void default_irqhandler(unsigned int gicciar, void *param);
void system_register_irqhandler(IRQn_Type irq, system_irq_handler_t handler, void *param);#endif // !__BSP_INT_H
http://www.15wanjia.com/news/5007.html

相关文章:

  • 网站怎么增加代码宁波seo怎么做推广渠道
  • 网站开发安全维护真正免费的建站
  • 上海专业网站设计推广代理公司
  • 做旅游网站的目的是什么百度关键词排名神器
  • 武汉网站建设怎么样教你如何快速建站
  • 绥化市住房和城乡建设网网站外贸网站建设公司哪家好
  • 在线制作名片生成器叶涛网站推广优化
  • 张店易宝网站建设关键词排名哪里查
  • 厦门市网站建设app开发推广普通话手抄报内容大全资料
  • 免费建设独立域名网站免费网站建设哪个好
  • 网站建设运行情况微商怎么引流被加精准粉
  • 响应式网站微博视频linux网站入口
  • 走廊文化建设图片网站西安seo公司哪家好
  • 网站维护的注意事项九易建网站的建站模板
  • wordpress 4.9 站群网络销售的方法和技巧
  • 长春哪家网站做的好seo优化排名教程百度技术
  • valenti wordpress武汉网络推广优化
  • 网站建设需要多长时间北京seo推广系统
  • 做跳转链接到自己的网站宁波专业seo外包
  • 温州网站定制哪家好优化的意思
  • 网站的费用北京专业网站优化
  • 网站开发时如何设计英文版本怎样提高百度推广排名
  • 云计算 网站建设怎么让网站被百度收录
  • 鸡西网站建设文件外链
  • 网站的关键词搜索怎么做域名购买
  • 坪山附近公司做网站建设哪家技术好爱链在线
  • 携程网站用js怎么做百度怎样免费发布信息
  • 在哪里可以查公司注册信息杭州上城区抖音seo有多好
  • 宁波网络推广教程seo综合查询软件排名
  • 会议管理系统南阳网站优化公司