ARM Cortex-M0+中断机制与中断编程步骤

2023-05-16

中断基础知识

为什么需要使用中断?

如果通过查询接收标志查看一个字节是否收到,则需要时刻花费CPU等资源。但中断机制能够在收到一个字节后,通知CPU把收到的字节取走。

异常:CPU强行从正常运行的程序切换到由某些内部或外部条件所要求的处理任务(优先度高于正在运行的任务)。

引起异常的外部条件:来自外围硬件、硬件断点请求、访问错误和复位等。

引起异常的内部条件:指令、不对等错误、违反特权和跟踪等。

硬件复位(具有最高优先级)和硬件中断归类为异常;

 

中断:来自CPU外围设备的强行任务切换请求。软件上表现为将程序PC计数器指针强制转换到中断服务程序入口的地址运行。CPU对复位、中断异常具有相同的处理过程,可统一称为中断。

中断源:可以引起CPU产生中断的外部器件。一个CPU可以识别多个中断源。每个中断源产生中断后,分别要进行相应的中断服务例程ISR,ISR的起始地址为中断向量地址连续几存储在中断向量表。中断向量表是一个指针数组。明,内容是中断服务例程ISR的首地址。

中断向量号:每个CPU能够识别的中断源编号。

中断服务例程ISR:中断产生后转去运行的程序。

中断发生以后,中断硬件、软件机制通知所有正在运行的程序,并保存当前CPU状态,转而运行一个中断处理程序。处理程序完成以后,恢复CPU至运行中断之前的状态,使得中断前的程序得以继续运行。

中断处理过程

中断请求:当某一个中断源需要CPU为其服务时,它会向CPU发送中断请求信号。中断控制器获取其中断向量号,并对其相应寄存器的“中断请求位”置位,以便通知CPU是何种中断请求。

中断检测:CPU会在每条指令结束时检测有没有中断请求情况,若有中断确实允许中断,则响应该中断请求。

中断响应:CPU会查找中断源所对应的模块中断是否被允许,若被允许,则响应该中断请求。

中断处理:中断响应的过程要求CPU保存当前环境的上下文于堆栈中,通过中断向量号找到中断向量表中对应的中断服务例程ISR,转而运行中断处理服务ISR。由于CPU在中断服务例程要使用CPU内部寄存器,所以需要调用ISR之前,将CPU内部寄存器保存至指定的RAM地址中,即堆栈。

中断返回:中断结束后,再将该RAM地址(堆栈)中的数据恢复到CPU内部寄存器中,从而使中断前后程序运行现场没有任何变化。

ARM Cortex-M0+中断编程结构

中断过程

  1. 模块中断源向嵌套中断向量控制寄存器NVIC发出中断请求信号
  2. NVIC对发来的中断信号进行管理,判断该模块中断是否被使能。若使能,通过私有外设总线PPB发送给M0+内核,由内核进行中断处理。
  3. 如果同时有多个中断信号到来,NVIC根据设定好的中断优先级进行判断,优先级高的中断首先响应,优先级低的中断挂起,压入堆栈保存;
  4. 如果优先级相同的对个中断源同时请求,则先响应IRQ号较小的,其他的被挂起。

中断向量号&非内核中断请求号IRQ

串口接收中断编程步骤

 

  1. 在头文件uart.h中,设定UART_2的实际使用的引脚。

     

  2. 修改main.c文件,在初始化外设模块位置调用uart构件中的初始化函数。

  3. 在初始化外设模块位置调用uart构件中使能模块中断函数。

     

  4. 在开总中断位置调用common.h文件中的开总中断宏函数。

     

  5. 在中断向量表文件中根据中断向量号的顺序找到串口2接收中断服务例程的函数名。然后在中断处理程序文件中添加该函数名。

     

  6. 只要串口2接收到一个字节,这个中断处理程序就会被执行一次。

为规范管理,同一将各个中断服务程序放在工程框架中的isr.c文件中。

串口中断服务例程

当串口2有一个字节的数据到来时产生接收中断,将会执行串口2中断处理函数。

该程序先进入临界区关总中断,接收一个带来的字符。如果接收成功,则把该字符发送回去,退出临界区。

 

 

 

嵌入式技术基础与实践(第4版)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARM Cortex-M0+中断机制与中断编程步骤 的相关文章

  • ARM 汇编分支到寄存器或内存内部的地址

    我想知道在 ARM 汇编中我可以使用哪条指令分支到存储在某个内存地址中的地址或标签 例如 我们可以使用B LABEL来跳转到LABEL 但现在目的地只能在运行时知道 并且它存储在某个已知的内存位置 是否有类似 B 地址 的东西 Thanks
  • 在 ARM 处理器上执行存储在外部 SPI 闪存中的程序

    我有一个 ARM 处理器 能够与外部闪存芯片连接 写入芯片的是为 ARM 架构编译的程序 可供执行 我需要知道如何将这些数据从外部闪存获取到 ARM 处理器上以供执行 我可以提前运行某种复制例程 将数据复制到可执行内存空间吗 我想我可以 但
  • 手臂“版本”之间的差异? (仅限 ARMv7)

    基本上我想知道ARMv7l和ARMv7之间的区别hl 我有一个带有armv7l的arm处理器 并且有很多armv7的rpmhl 我完全不知道我必须搜索什么才能获得相关信息 这个 后缀 叫什么 还有其他类型吗 他们的做法有何不同 我假设它指示
  • 如何使用 gcc 编译代码和 ARM Cortex A8 目标进行调用图分析?

    我对这个已经咬牙切齿了 我需要在 ARM 板上进行分析并需要查看调用图 我尝试使用 OProfile Kernel perf 和 Google 性能工具 一切正常 但不输出任何调用图信息 这使我得出结论 我没有正确编译代码 我在编译 C 代
  • 读取和打印手臂组件中的字符串

    我正在使用 ARMSim 刚刚开始学习汇编 所以如果我看起来一无所知 请原谅我 但我正在尝试从输入文件中读取字符串 然后将其打印到输出屏幕 到目前为止我有 equ SWI Open 0x66 open a file equ SWI Clos
  • 为 ARM 交叉编译 zlib

    我尝试为arm poky linux gnueabi交叉编译zlib 但启动 make 时出现错误 zlib 1 2 11 AR HOST ar CC HOST gcc RANLIB HOST ranlib configure prefix
  • 使用 Android NDK 使用 -fsigned-char 进行构建安全吗?

    为了与其他平台保持一致 我需要使用signed char在我正在处理的一些本机代码中 但默认情况下在Android NDK上char类型是unsigned 我尝试明确使用signed char类型 但它生成太多警告differ in sig
  • 了解 ctags 文件格式

    我使用 Exhuberant ctags 来索引我的 c 项目中的所有标签 c project 是 Cortex M7 微控制器的嵌入式软件 结果是一个标签文件 我正在尝试阅读该文件并理解所写的内容 根据我找到的 ctags 和 Exhub
  • 在 Intel 机器上构建 Apple Silicon 二进制文件

    如何在 macOS 11 Intel 上编译 C 项目以在 Silicon 上运行 我当前的构建脚本很简单 configure make sudo make install 我尝试过使用 host and target标志与aarch64
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • ARM NEON 矢量化失败

    我想在 ARM cortex a9 上启用 NEON 矢量化 但在编译时得到以下输出 未矢量化 不支持相关 stmt D 14140 82 D 14143 77 D 14141 81 这是我的循环 void my mul float32 t
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • GCC:如何在 MCU 上完全禁用堆使用?

    我有一个在基于 ARM Cortex M 的 MCU 上运行并用 C 和 C 编写的应用程序 我用gcc and g 编译它并希望完全禁用任何堆使用 在 MCU 启动文件中 堆大小已设置为 0 除此之外 我还想禁止代码中意外使用堆 换句话说
  • 直接写入 ARM Cortex A8 分支预测器中的全局历史缓冲区 (GHB) 或 BTB?

    我有兴趣直接修改 Cortex A8 上的 BTB 分支目标缓冲区 和 GHB 的内容 ARM 手册上有这样的内容 要在指令端 GHB 数组中写入一项 例如 LDR R0 0x3333AAAA MCR p15 0 R0 c15 c1 0 M
  • ARM、VFP、浮点、惰性上下文切换

    我正在为 ARM 处理器 Cortex A9 编写操作系统 我正在尝试实现浮点寄存器的延迟上下文切换 这背后的想法是 浮点扩展最初对线程禁用 因此不需要在任务切换上保存浮点上下文 当线程尝试使用浮点指令时 会触发异常 然后 操作系统启用浮点
  • 当我尝试在 Armv8 程序集中分配数组时,执行冻结

    所以我正在用汇编语言进行编程 这只是一个简单的代码 这样我就可以学习如何分配数组 以便稍后在 NEON 编程中使用它们 ASM FUNC FPE data balign 8 array skip 80 array1 word 10 20 3

随机推荐

  • ZED摄像头的使用

    原链接 https community bwbot org topic 518 运行测试平台 小强ROS机器人 1 安装CUDA 1 1 禁用原有的驱动 如果你之前安装了nvidia的开源驱动 xff0c 即通过apt get 安装的驱动
  • 头文件包含顺序

    头文件包含顺序 原理 xff1a 当通过 include指令包含另一个头文件时 xff0c 编译预处理器用头文件的内容取代 include指令 xff0c 也就是说 xff0c 头文件的所有内容最终都会被合并到某一个或某几个源文件中 xff
  • 计算机网络(五): ros下socket编程示例

    ros下socket编程示例 服务器端 span class token macro property span class token directive keyword include span span class token str
  • 三种方式实现:进度条

    1 Bootstrap实现进度条 bootstrap min css下载地址 xff1a https cdn staticfile org twitter bootstrap 3 3 7 css bootstrap min css boot
  • 物理端口与逻辑端口

    若 1 端口 端口可分为物理端口与逻辑端口 所谓逻辑端口指的是计算机内部或交换机路由器内的端口 xff0c 看不见 xff0c 摸不着 所谓物理端口 xff0c 就是可见的端口 xff0c 像 xff1a 交换机路由器集线器 RJ11端口
  • RS485接收数据后发送乱码

    序 最近调块板子上面有几路485 xff0c 控制芯片STM32F407VE 转换芯片ADM2587 xff0c 使用485转换器连接电脑 xff0c 发现串口助手向板子发送数据后会收到乱码 xff0c 经软硬件联合调试排除bug 一 问题
  • python urllib.parse

    urlparse span class token keyword from span urllib span class token punctuation span parse span class token keyword impo
  • HTTP学习(5)--demo编写(1)

    一个基于Java的HTTP服务器demo 前面几篇博客 xff0c 大致介绍了几个方面的例子 xff0c 例如报文解析 报文组装等 现在打算将这些东西集合起来 xff0c 编写一个小HTTP服务器demo 期间遇到了很多问题 xff0c 也
  • 用Python写一个监督你刷李永乐考研题目的简单小程序

    import datetime import xlwings import math month 61 datetime datetime now strftime 39 m 39 date 61 datetime datetime now
  • 对于遗传算法,谈谈个人看法

    最近在学习遗传算法 xff0c 小有体会 这个用数学方法来模拟生物学过程的算法实在是有很多值得玩味的地方 遗传算法要干什么 xff1f 比如Z 61 f x y 我们要找到他在x 0 1 y 0 1 区间上的最大值 我们就先随机在x 0 1
  • AD(altium designer)软件的基础使用(硬件的一些总结,写的有些乱,高手请略过)

    1 快捷键 xff1a Ctrl 43 R 复制并重复粘贴 Shift 43 c 取消选择 Space 逆时针旋转对象 Shift 43 space 顺时针旋转对象 X 水平翻转对象 Y 垂直翻转对象 G切换捕捉栅格 V F View中的F
  • C++字节转换 (byte转int 互转)(BCD和HEX转换)

    2个字节short int 高低位转化 short int y 61 0x7f21 y 61 y amp 0xff00 gt gt 8 y amp 0x00ff lt lt 8 printf 34 x 34 y 用short型变量储存 xf
  • 王者荣耀-数模论文分享(虽然结果我自己都不信)

    基于基础数据的王者荣耀英雄强度评估及英雄设计 摘要 王者荣耀是当下很火爆的一款手机游戏 xff0c 如何基于当下的双方阵容选择合适的英雄来获得胜利 xff0c 是一个值得探讨的问题 xff0c 现基于游戏数据对于各个英雄的强度进行建模评估
  • 用蚁群算法求解TSP问题

    TSP是什么 xff1f TSP全称Travelling salesman problem 中文名 xff1a 旅行商问题 就是模拟退火中讲到的14个城市之间巡回旅行 xff0c 求路径最短的问题 为什么偏偏找他呢 xff1f 因为这是一个
  • python 语法小进阶1

    1 filter 是通过生成 True 和 False 组成的迭代器将可迭代对象中不符合条件的元素过滤掉 xff1b 而 map 返回的则是 True 和 False 组成的迭代器 gt gt gt res1 61 map lambda n
  • 焊接的技巧与方法

    手工焊接操作的基本步骤 1 清洁焊接对象的表面 xff0c 这一步是必须的 xff0c 就算你再赶时间也不能偷懒 用小刀或者砂纸把焊点打磨光亮 xff0c 露出铜的光泽 铜表面的氧化物会阻碍焊锡与之形成合金 xff0c 这一步做得不到位的话
  • 计算机网络体系结构

    计算机网络体系结构 一 计算机网络概述计算机网络的概念 组成与功能概念 xff1a 计算机网络 功能 xff1a 数据通信 连通性 资源共享分布式处理 信息综合处理 提高可靠性 负载均衡 发展的三个阶段组成 xff1a 物理组成 xff1a
  • 嵌入式技术基础与实践(第4版)

    1 5 2020 开放权限 在此之前 xff0c 防报告查重 嵌入式系统概述 嵌入式系统常用术语 嵌入式系统常用的C语言基本语法概要 M0 43 体系结构与指令系统简介 存储映象 中断源 硬件最小系统 GPIO及基本打通原理 程序的基本调试
  • 串行通信基础知识与UART驱动构件使用方法

    串行通信基础 串行通信接口 异步串行通信 UART 常称为 串口 或SCI xff0c 在USB未普及之前 xff0c 是PC机必备通信接口之一 通信方式为单字节通信 xff0c 是最简单的串行通信方式 RS232 RS485 接线简单 x
  • ARM Cortex-M0+中断机制与中断编程步骤

    中断基础知识 为什么需要使用中断 xff1f 如果通过查询接收标志查看一个字节是否收到 xff0c 则需要时刻花费CPU等资源 但中断机制能够在收到一个字节后 xff0c 通知CPU把收到的字节取走 异常 xff1a CPU强行从正常运行的