Cortex-M3初探

news/2024/9/20 9:08:42/文章来源:https://www.cnblogs.com/RAM-YAO/p/18337045

目录
  • 寄存器组
    • R0-R12:通用寄存器
    • R13:两个堆栈指针 SP
    • R14:连接寄存器 LR
    • R15:程序计数寄存器 PC
  • 特殊功能寄存器
    • xPSR寄存器
    • PRIMASK寄存器
    • FAULTMASK寄存器
    • BASEPRI寄存器
    • CONTROL寄存器
  • 操作模式与特权级别
    • 用户级切换为特权级的流程
  • 内建的嵌套向量中断控制器 NVIC
    • 可嵌套的中断支持
    • 向量中断支持
    • 动态优先级调整支持
    • 中断延迟大大缩减
    • 中断可屏蔽
  • 中断和异常

寄存器组

Cortex-M3处理器拥有R0-R15的寄存器组,其中R0-R12为通用寄存器;R13作为堆栈指针SP(SP主堆栈指针MSP和进程堆栈指针PSP);R14为连接寄存器;R15为程序计数器。

R0-R12:通用寄存器

R0-R12都是32位的通用寄存器,主要用于暂存数据和中间计算结果,在函数调用过程中函数的参数以及在多任务系统中任务的上下文信息通常通过R0-R3进行保存。

R13:两个堆栈指针 SP

Cortex-M3有两个堆栈指针,在任一时刻只能使用其中一个。

主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核及异常处理例程(中断服务例程使用的永远都是MSP)。

进程堆栈指针(PSP):由用户的应用程序代码使用。

R14:连接寄存器 LR

LR寄存器主要用于存储函数调用的返回地址,当执行函数调用指令,当前函数地址会被存储到LR寄存器中,这样在函数执行结束后,处理器就可以使用LR寄存器中的地址返回到调用该函数的地方。在发生异常处理时处理器也会将当前地址存储到LR寄存器中,以便在异常处理结束后返回到异常发生的地方继续执行。

R15:程序计数寄存器 PC

PC寄存器存储当前正在执行的指令的地址,它是处理器执行指令的关键,每执行一条指令,PC寄存器的值自动增加指向下一条要执行的指令。

注意区分一下LR寄存器和PC寄存器:LR寄存器是用于存储函数调用或异常处理的返回地址,它的更新与程序函数调用和异常处理直接相关;PC寄存器负责控制和管理程序的指令执行流程,它的更新是由处理器硬件自动管理的,它直接控制了程序的执行顺序和指令的流动。

特殊功能寄存器

Cortex-M3在内核上还搭载了若干特殊功能寄存器,如程序状态字寄存器(xPSR)、中断屏蔽寄存器组(PRIMASK、FAULTMASK、BASEPRI)、控制寄存器(CONTROL)。

xPSR寄存器

记录ALU标志(0标志,进位标志,负数标志,溢出标志)、执行状态、当前正在服务的中断号。

PRIMASK寄存器

该寄存器用于屏蔽所有可编程中断,当然不可编程中断如NMI、硬(hard)fault是不可编程的所以无法屏蔽。

FAULTMASK寄存器

该寄存器也可用于屏蔽中断,但相比于PRIMASK,该寄存器会屏蔽除NMI之外的所有中断,即便是硬(hard)fault也会被屏蔽掉。

BASEPRI寄存器

屏蔽优先级小于等于某个值的中断,如设置为5则表示屏蔽掉优先级小于等于5往后的所有中断,优先级比5大的则不会屏蔽。该寄存器写0表示不屏蔽任何中断。

CONTROL寄存器

定义特权状态(特权级还是用户级),并且决定使用哪一个堆栈指针(MSP还是PSP)。

以下为Cortex-M3异常类型

操作模式与特权级别

Cortex-M3支持两种处理器模式和两个特权操作。

两种处理模式为:handler模式和线程模式。引入两种模式的本意是用于区分普通的应用程序代码和异常服务例程代码。

两种特权级别为:特权级和用户级。

在CM3运行主程序时(线程模式),既可以使用特权级也可以使用用户级,但是异常服务例程必须在特权级下执行。复位后处理器默认进入线程模式、特权级。在特权级下程序可以访问所有范围的存储器(如果有MPU内存管理单元则要在MPU规定的禁地之外),并且可以执行所有指令。

用户级切换为特权级的流程

用户级程序不能通过简单的修改CONTROL寄存器的值就进入特权级,它必须先进行“申诉”:执行一条系统调用指令SVC,这将会触发SVC异常由异常服务例程接管,如果批准了进入,则异常服务例程修改CONTROL寄存器才能从用户级进入特权级(要明白异常服务例程是在特权级下执行的,也就是说只有在特权级下进行修改CONTROL寄存器才能从用户级进入特权级)。

操作系统的内核通常都是在特权模式下运行,因为需要访问一些特殊的存储器、寄存器。

内建的嵌套向量中断控制器 NVIC

NVIC与内核是紧耦合的,它不属于某一款芯片的外设,其属于内核,所以如果大家去查阅相关如中文参考手册能找到的描述其实是不多的。因为类似中文参考手册大多介绍的是某一系列单片机的基本外设,NVIC不属于某一系列芯片的外设,它属于内核。

NVIC提供以下功能:

可嵌套的中断管理

向量中断支持

动态的优先级调整支持

中断延迟大大缩短

中断可屏蔽

可嵌套的中断支持

当一个异常发生时,硬件会自动比较该异常的优先级是否比当前异常优先级更高,如果更高,处理器会中断当前的中断服务例程,而服务新来的异常---即抢占。

向量中断支持

当开始响应一个中断后,CM3会自动定位一张向量表,并且根据中断号从向量表中找到中断服务例程的入口,然后跳转过去执行。

动态优先级调整支持

软件可以在运行时更改中断的优先级,如果在某个中断服务例程中修改了自己对应的中断优先级,而这个中断又有新的实例处于悬起中,也不会自己打断自己。

中断延迟大大缩减

Cortex-M3为了缩减中断延迟引入了好几个新特性,包括自动现场保护和恢复,咬尾中断和晚到中断,用于缩短中断嵌套时的ISR间的延迟。

咬尾中断简单来说就是在上一个中断执行完毕后不进行POP相关的寄存器,而是下一个异常继续使用上一个异常已经PUSH好的成果,形成首位紧密衔接的情况,所以叫做咬尾中断。

晚到中断就是如果在响应某一低优先级异常#1的早期检测到了更高优先级异常#2,只要#2不是太晚到就能以晚到中断的方式处理。即#1进行入栈结束后执行#2的服务例程,相当于#1帮#2做了入栈动作(徒做嫁衣了)。

中断可屏蔽

即可以屏蔽优先级低于某个阈值的中断(通过设置BASEPRI寄存器),也可以进行全体封杀(通过设置PRIMASK或FAULTMASK)。操作系统中的临界区操作常常使用到BASEPRI寄存器屏蔽某些中断以实现临界操作。

中断和异常

CM3支持16-4-1=11中系统异常(保留了4+1个档位),外加240个外部中断输入。CM3中取消了FIQ(快速中断请求,用于处理一些高优先级、对响应时间要求极高的中断事件),因为有了更好的机制---中断优先级管理和嵌套中断支持。CM3的所有中断机制都是由NVIC实现的。

要注意,虽然CM3支持多达256个中断,但具体使用的数量多少是由芯片生产商来决定的。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenSSH秘钥指纹图像生成算法

使用 SSH 秘钥生成时产生疑惑,它的 fingerprint randomart image 是如何生成的?对此进行了探索和研究,意外的简单OpenSSH秘钥指纹图像生成算法使用 SSH 秘钥生成时产生疑惑,它的 randomart image 是如何生成的?下面进行了探索和研究 引入 生成位数为 4096 位的 rsa 公私钥…

检测Linux服务器CPU、内存、负载、IO读写、机房带宽和服务器类型的脚本

脚本内容: #!/usr/bin/env bash # # # #RED=\033[0;31m GREEN=\033[0;32m YELLOW=\033[0;33m SKYBLUE=\033[0;36m PLAIN=\033[0mabout() {echo ""echo " ========================================================= "echo " \ Supe…

拖拽式操作也能制作中国式报表了?

报表作为企业经营和决策的重要工具,其重要性不言而喻。中国式报表,不仅要求数据的精准呈现,还需要在格式上保持高度的灵活性,以满足不同场景下的需求。中国式报表以独特的复杂性和信息量大而著称,而这种复杂性也带来了制作和维护上的挑战,使得许多企业在处理中国式报表时…

STM32G030F6P6TR_IAP

bootloader程序 STM32FLASH读写1 /**2 ******************************************************************************3 * @file stmflash.c4 * @brief 读写STM32内部flash(STM32G030F6P6TR)5 **********************************************************…

XALM基本语法

1.同一个UI可以有不同的实现如上图所示,可以存在以下两种不通的实现: 实现一: 实现二:2.对对象属性赋值: 两种语法:使用字符串进行简单赋值;使用属性元素进行复杂赋值; 一.简单赋值: 二.使用属性元素赋值: 3.简化XAML得技巧 精简后如下: 4.对于复杂的绘图和动画制作…

8月8日在线研讨会 | 如何快速开发量产级别功能安全应用软件

本次研讨会经纬恒润将结合自身控制器产品研发及国内外功能安全开发、集成、测试、咨询的实践经验,重点基于功能的应用监控软件,从需求定义、架构设计、单元设计及测试验证等多个环节,分享功能安全量产软件实施的方案、加速实施过程的方法,以推动客户汽车量产级别软件功能安…

vue集成svg大图拖拽无限放大缩小

vue项目中根据实际CAD图为参考,以及参看项目实际现场,手动绘制了一张线体、堆垛机、库区货架svg图,集成到vue页面中,svg图中可以交互接收C#发送过来的singalR实时数据。接收singalR的实时数据并显示到vue中,这里不作展开讲,可以参看笔者另一篇文章《vue若依集成C#的singa…

积目社交app应用深度剖析:定位、功能与用户生态

一、产品概述 积目是一款主打青年文化领域的陌生人社交App,成立于2016年9月。它致力于提高用户质量,为青年群体提供基于兴趣的社交服务。积目的业务涵盖了看照滑卡牌、青年社区、共鸣匹配、线下活动等多个方面,旨在打造一个全方位的社交娱乐平台。二、用户分析 用户特征: 积…

抖音私信如何跳转微信,抖音卡片制作教程

在社交媒体平台中,抖音和微信都是非常受欢迎的应用程序。抖音是一款短视频分享平台,而微信是一款社交聊天应用。有时候,我们可能希望将抖音视频分享到微信上,但是却无法直接在抖音上找到跳转微信的功能。所以在本文中,我们将探讨如何生成抖音跳转微信链接的方法。 首先,我…

比较基因组学流程

1、OrthoFinder 教程 用于比较基因组学的系统发育直系学推断 1.1 orthofinder介绍OrthoFinder是一种快速、准确和全面的比较基因组学分析工具。它可以找到直系和正群,为所有的正群推断基因树,并为所分析的物种推断一个有根的物种树。OrthoFinder还为比较基因组分析提供全面的…

记一次拿到网站管理员账号密码的渗透

信息收集 第一步肯定是老生常谈的信息收集了,这次,首先是给了一个域名,我拿到之后,先是去收集了一些基本信息,如ip等等,但由于是个门户网站,没找到什么打的地方,便用fscan进行了c段扫描 fscan.exe -h ip/24 得到了很多,也都去看了一遍,在其中一个网站...... 探索 前面…

AlertManager简介与使用

目录一、AlertManager简介AlertManager 常用的功能Prometheus 和 AlertManager 的关系二、分组、抑制、静默分组抑制静默三、Alertmanager部署基于k8s部署PVC资源 alertmanager-storage.yamlConfigMap(邮件方式)deploy.yaml创建svc.yamlingress.yaml四、Prometheus添加告警配…