Cotex-M0中断及与Cotex-M3的对比

2023-10-30

注:本文内容主要参考cortex-M0 权威指南。
Cotex-M0处理器内置了中断控制器,并且最多支持32个中断请求(IRQ)输入,以及1 个不可屏蔽中断(NMI)输入。另外Cotex-M0处理器还支持多个内部异常。而 Cortex -M3中的 NVIC 支持最多240个中断请求(IRQ)、1 个不可屏蔽中断(NMI)多个系统异常。
Cortex -M0的每个中断都有一个单独的中断编号, NMI 的编号为2,而片上外设和外部中断的则为16-47。1-15的其他编号,用于处理器内部的系统异常。有些中断的优先级是固定的,而有些则是可编程的。表中列出了异常类型、异常编号和优先级。
在这里插入图片描述
从头文件中可以看出,FM33LG0XX芯片的中断表如下。
在这里插入图片描述
外部中断
在这里插入图片描述
中断优先级定义
在 Cortex -M0处理器中,毎个中断都对应一个优先级。优先级决定了中断是否执行或者是否延迟执行。Cortex -M0处理器支持3个固定的最高优先级以及4个可编程的优先级。对于具有可编程优先级的异常,优先级配置寄存器为8位宽,而且只能使用最高两位。见下图。
在这里插入图片描述

因为第0到5位没有使用,故它们读出始终为0,对它们的写操作没有意义。在这个设定下,可以使用的优先级为0x00(最高)、0x40、0x80和 0xc0 (最低)。这点同 Cortex -M3处理器类似,只是 Cortex -M3处理器至少使用3个位,因此就具有至少8个可编程的优先级,而 Cortex -M0处理器只有4个。再加上3个固定的优先级,Cortex - M0总共具有7个优先级。
对于Cortex - M3来说,处理器有3个固定优先级和最多256 个优先级(最多有 128 个抢占等级),优先级的数量也是可由芯片设计者配置的,可选范围为8-256(多数情况下为8-32,比如 STM32 就只有16 级优先级)。 NVIC 将优先级分为两个部分:抢占优先级(用于嵌套中断)和子优先级(用于多个具有相同抢占优先级的中断同时发生),并且它们可由软件配置(SCB->AIRCR [10:8] PRIGROUP field)。
系统异常控制寄存器
对于 Cortex -M0处理器,只有3个与 OS 相关的系统异常才具有可编程的优先级,它们包括 SVC 、PendSV 和 SysTick ,其他像 NMI 和硬件错误等系统异常的优先级则是固定的。通过配置SHPR2和SHPR3两个寄存器来修改三个系统异常的优先级。
在这里插入图片描述
在这里插入图片描述
如果使用了CMSIS设备驱动库,你可以使用寄存器名SCB->SHP[0]和SCB->SHP[1]来访问SHPR2和SHPR3。
在这里插入图片描述
以freeRTOS为例,在port.c中,可以看到将PendSV和SysTick配置为最低优先级。
在这里插入图片描述
在这里插入图片描述
中断屏蔽寄存器(PRIMASK)
有些对时间敏感的应用,需要在一段较短的时间内禁止所有中断。对于这种应用,Cortex -M0处理器没有使用中断使能/禁止控制寄存器来禁止所有中断然后再恢复,而是提供了一个单独的特性,特殊寄存器中有一个被称作 RRIMASK,通过它可以屏蔽掉除了 NMI 和硬件错误异常的其他所有的中断和系统异常。 PRIMASK 寄存器只有1位有效,并且在复位后默认为0。该寄存器为0时,所有的中断和异常都处于允许状态;而设为1后,只有 NMI 和硬件错误异常处于使能。实际上,当 PRIMASK 设置为1后,处理器的当前优先级就降到了 0 (可设置的最高优先级)。若使用C语言以及CMSIS设备驱动库,用户可以使用以下函数来设置和清除PRIMASK。
__disable_irq();//设置PRIMASK
__enable_irq();//清除PRIMASK
在这里插入图片描述
对于Cortex -M3来说除了 PRIMASK 外还有其他的中断屏蔽寄存器。 BASEPRI 寄存器可以阻止某优先级或更低优先级的中断, FAULTMASK 寄存器则提供了其他的错误管理特性。

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

Cotex-M0中断及与Cotex-M3的对比 的相关文章

  • 读取和打印手臂组件中的字符串

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

    我正在尝试使用 ARM 工具链编译 so 文件 但是我不断收到这个错误 错误 源对象的 EABI 版本为 0 但目标对象的 EABI 版本为 5 我无法更改工具链中的任何内容 因为我必须使用给定的工具链 我以前从未见过这个错误 我使用了这个
  • M1 MacBook Pro 上的 Android Studio 无法使用 ABI armeabi-v7a 模拟系统映像

    我的 M1 Macbook Pro 上的 Android Studio 可以很好地模拟 ABI arm64 v8a 的所有系统映像 API 24 29 30 31 但是 它无法使用 ABI armeabi v7a 运行所有映像 例如 API
  • 有没有办法在 Xcode 4 中为 ARM 而不是 Thumb 进行编译?

    如果有很多浮点运算正在进行 Apple 建议针对 ARM 进行编译 而不是针对拇指进行编译 我的整个应用程序几乎是一个大型浮点运算 iOS 应用程序开发工作流程指南中是这样说的 iOS 设备支持两种指令集 ARM 和 Thumb Xcode
  • ARM + gcc:不要使用一大块 .rodata 部分

    我想使用 gcc 编译一个程序 并针对 ARM 处理器进行链接时间优化 当我在没有 LTO 的情况下编译时 系统会被编译 当我启用 LTO 时 使用 flto 我收到以下汇编错误 错误 无效的文字常量 池需要更近 环顾网络 我发现这与我系统
  • 分析 Cortex-M7 (stm32f7) 上的 memcpy 性能

    简洁版本 从 GNU ARM 工具链中提取的 memcpy 的性能指标在 ARM Cortex M7 上对于不同的副本大小似乎差异很大 即使复制数据的代码始终保持不变 这可能是什么原因造成的 长版 我是使用 GNU Arm 工具链 11 2
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • 了解 U-Boot 内存占用

    我不明白加载 U Boot 时 RAM 中发生了什么 我正在开发 Xilinx Zynq ZC702 评估套件 并尝试使用 U Boot 在其上加载 Linux 内核 于是我使用Xilinx工具Vivado和SDK生成了一个BOOT bin
  • iPhone 3GS 上的 ARM 与 Thumb 性能比较,非浮点代码

    我想知道是否有人有关于 iPhone 3GS 上 ARM 与 Thumb 代码性能的硬性数据 特别是对于非浮点 VFP 或 NEON 代码 我知道 Thumb 模式下的浮点性能问题 更大的 ARM 指令的额外代码大小是否会在某个时刻成为性能
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • 为什么前向引用 ADR 指令在 Thumb 代码中以偶数偏移进行汇编?

    To bx对于 Thumb 函数 需要设置地址的最低有效位 GNU 作为文档states https sourceware org binutils docs as ARM Opcodes html当地址是从一个生成时这是如何工作的adr伪
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • 错误:-march= 开关的值错误

    我写了一个Makefile 但无法让它工作 我有一个选项应该选择编译到哪个处理器 然而 当我跑步时make从命令行它说 tandex tandex P 6860FX emulators nintendo sdks 3DS SDK HomeB
  • LDR指令如何将常量加载到寄存器中?

    我刚刚读了一本ARM指令书 看到一条指令我无法解释 It says LDR将 32 位常量加载到r0登记 LDR r0 pc const number 8 pc const number DCD 0xff00ffff 我不明白什么 pc c
  • ARM、VFP、浮点、惰性上下文切换

    我正在为 ARM 处理器 Cortex A9 编写操作系统 我正在尝试实现浮点寄存器的延迟上下文切换 这背后的想法是 浮点扩展最初对线程禁用 因此不需要在任务切换上保存浮点上下文 当线程尝试使用浮点指令时 会触发异常 然后 操作系统启用浮点
  • 在LPC2148 ARM处理器上创建中断向量的汇编代码

    我最近刚刚开始使用 LPC2148 ARM 处理器 我试图理解一些有关创建中断向量的汇编代码 这是代码 Runtime Interrupt Vectors Vectors b start reset start ldr pc undf un
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组
  • 什么是 .axf 文件?

    我是arm架构的新手 我从事嵌入式软件工作 并试图了解我的项目二进制文件的调试文件夹中存在的 axf文件 发现它是链接器在构建过程中生成的arm可执行格式文件 用于调试崩溃 所以很明显它包含了一些调试信息 但不清楚具体是什么信息 而且deb
  • 将 32 位值加载到 Arm 汇编中的寄存器中

    我想使用arm汇编将1个32位十六进制直接加载到寄存器中 mov r1 0x6c617669 这不能使用 因为从该指令我们只能加载 8 位值 所以我直接从内存加载32位值 那么如何将32位值存储在内存中并使用arm汇编将其直接加载到寄存器中

随机推荐

  • 解决ROS系统 rosdep update超时问题的新方法

    由于近期国内Github Raw的可用IP越来越少 通过修改hosts文件解决rosdep update超时问题的方法已经不太好用 本文通过修改rosdep源码中下载资源的函数来解决这一问题 网站https ghproxy com 支持gi
  • c++时间戳获取和转换

    1 使用api 可以使用windows下和linux下api函数来获取 比较简单 如下所示 int64 t getTimeStamp 毫秒数 int mSecond 0 if defined WIN32 SYSTEMTIME sys Get
  • video-player实现hls播放全过程

    安装依赖 npm install vue video player save 引入样式 第一个是videoJs的样式 后一个是vue video player的样式 因为考虑到我其他业务组件可能也会用到视频播放 所以就放在了main js内
  • typeScript--[数据定义]

    一 安装ts 1 命令行运行如下命令 全局安装 TypeScript npm install g typescript 2 安装完成后 在控制台运行如下命令 检查安装是否成功 tsc V 二 创建ts文件 1 创建一个day01 ts文件
  • Linux·C/C++主线程对子线程的影响

    这篇文章主要介绍了简单了解C语言中主线程退出对子线程的影响 文中通过示例代码介绍的非常详细 对大家的学习或者工作具有一定的参考学习价值 需要的朋友可以参考下 对于程序来说 如果主进程在子进程还未结束时就已经退出 那么Linux内核会将子进程
  • Android几种定时任务实现方式汇总

    目录 前言 方式一 AlarmManager API19之前AlarmManager常用的一些方法 参数说明 使用举例 AlarmManager实例Demo讲解 包含版本适配以及高版本设置重复闹钟 AlarmManager总结 方式二 Ha
  • 设计模式——责任链

    本文说明 在学习 Java EE互联网轻量级框架整合开发 此书时 里面提到了几种设计模式 我在学习这几种设计模式时写了笔记 放上来让大家共同学习 如果有错误 望指出 本章由两部分组成 1 基本概念 关键代码讲解 2 完整例子 基本概念 关键
  • WEB服务器如何确定哪个Servlet处理请求

    文章目录 一 WEB服务器 二 Servlet容器 三 Servlet生命周期 创建对象 初始化 处理请求 销毁 四 WEB服务器确定Servlet处理请求过程 一 WEB服务器 是指计算机和运行在它上面的服务器软件的总和 能提供网上信息浏
  • vue中实现ueditor上传图片遇到的几个问题及解决方案

    vue中实现ueditor上传图片功能 遇到的问题 初始化ue组件无法正常显示 无法加载 单图上传的图标变灰无法点击 or 多图上传显示后端配置项没有正常加载 上传插件不能正常使用 配置上传接口错误 请求报404 无法找到 上传后 服务端显
  • QT 信号和槽需要注意的几点

    connect 发出信号的对象指针 SIGNAL 信号函数原型 响应信号的对象 SLOT 槽函数原型 这里先说说信号及槽与普通成员函数有什么区别 只是定义的区域不同而已 信号函数需要声明在头文件的signals 关键字后面 无需实现 而槽则
  • c语言的标识符必须以字母或下划线开头,大一C语言选择题及答案

    第1章 C语言程序设计概述 一 选择题 1 以下叙述中正确的是 A A C语言程序中注释部分可以出现在程序中任意合适的地方 B 花括号 和 只能作为函数体的定界符 C 构成C语言程序的基本单位是函数 所有函数名都可以由用户命名 D 分号是C
  • pandas 用read_csv读取txt文件时,部分行丢失

    用pandas 的 read csv 来读取txt文件时 出现了部分行丢失的情况 原因是某行中有单个英文引号 导致 n换行符失效 多行连成了一行 直到遇到下一个单个引号 例如 txt文件如下 这里有一个未闭合的引号 就是它 这是正常的第二行
  • 丑数 打表+二分查找

    1010 只包含因子2 3 5 的数 题目链接 http www 51nod com Challenge Problem html problemId 1010 引用知识 https baike baidu com item E4 B8 9
  • DevOps系列之 —— 持续开发与集成(六)静态代码检查

    DevOps系列之 DevOps概览 一 软件产业和交付模式发展趋势 DevOps系列之 DevOps概览 二 新型软件技术及交付模式 DevOps系列之 DevOps概览 三 DevCloud HE2E DevOps 框架及其主要服务 D
  • Python头歌合集(题集附解)

    目录 一 Python初识 基本语法 第1关 Hello Python 第2关 我想看世界 第3关 学好Python 第4关 根据圆的半径计算周长和面积 第5关 货币转换 二 turtle简单绘图 第1关 英寸与厘米转换 第2关 绘制等边三
  • java使用easyExcel实现Excel导入和导出

    1 引入依赖
  • CSV文件 分类

    org deeplearning4j examples dataexamples BasicCSVClassifier 数据格式 一定要搞清楚数据格式 输入输出 才能构建网络 对应的是你手头有什么 想要做什么 预测什么 训练日志 这个例子只
  • 第六章:string类

    系列文章目录 文章目录 系列文章目录 前言 为什么学习string类 C语言中的字符串 ASCII Unicode UTF 8 UTF 16 UTF 32 GBK 标准库中的string类 string类 总结 string类的常用接口说明
  • ubuntu环境下 nginx 怎么配置文件

    文章目录 nginx安装 nginx启动 nginx打开 nginx配置 nginx安装 首先是安装nginx 环境依然是ubuntu12 04 64位 通过下面命令 sudo apt get install nginx nginx启动 安
  • Cotex-M0中断及与Cotex-M3的对比

    注 本文内容主要参考cortex M0 权威指南 Cotex M0处理器内置了中断控制器 并且最多支持32个中断请求 IRQ 输入 以及1 个不可屏蔽中断 NMI 输入 另外Cotex M0处理器还支持多个内部异常 而 Cortex M3中