CM3基础(持续更新)

2024-03-31 06:38
文章标签 基础 更新 持续 cm3

本文主要是介绍CM3基础(持续更新),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CM3基础

操作模式和特权级别

参考Cortex-M3操作模式和特权级别

总结

系统有两种模式,handler模式和线程模式,前者始终位于特权级(用于处理异常),后者有特权和用户级两种。特权级别能够访问更多的数据范围。在系统复位后运行在线程模式的特权级下,位于特权级可以通过置为control[0]来进入用户级,而用户级别要进入特权级,只能被动等待异常出现然后进入handler模式来进入特权级。如下图
特权级和用户级

MSP&PSP

SP是堆栈指针,用于指向系统当前使用的堆栈位置,其实际位置取决于MSP或者PSP指向的地址,Cortex-M3的有两个堆栈指针寄存器MSP和PSP,任何时刻只能使用一个寄存器作为SP堆栈指针的索引值,可以在特权模式下通过修改control[1]来设置当前使用哪个寄存器,当系统位于handle模式时,只能使用MSP,即handle模式下虽然是特权模式但control[1]=0(即只能使用MSP),当处于线程模式时,则在特权级时可以设置为0(MSP)或者1(PSP)。
当然,我们不用担心何时去切换SP所对应寄存器地址,牢记一点:当处于中断中时,系统使用MSP,出中断前后使用PSP。更一般的,进入中断前,系统会自动使用PSP保存部分寄存器(R0-R3,R12,14,15,XPSR)到任务堆栈,在出中断前,系统会调用SP恢复寄存器,但出中断时仍处于MSP,所以在出中断前要先设置当前SP参考寄存器为PSPORR LR, LR, #0x04,这样出中断过程中会根据PSP恢复对应的软件堆栈寄存器(R0-R3,R12,14,15,XPSR)。


使用这种双指针是为了保护系统内核的堆栈数据,当系统位于软件层面时,系统使用的堆栈指针为PSP,而处理系统级别事务时则使用MSP,由于两个寄存器的储存值不同,系统堆栈和任务堆栈被人为分开了,这样能够确保软件层面的操作不会影响到系统层面。
MSP堆栈指针实际上就是整个SRAM的堆栈指针,而PSP指针只是作为任务堆栈指针来使用。
下图为MSP堆栈指针的初始化示例。因为代码中使用的数据结构可能不同(如使用了大量的数组时,位于最后的堆栈指针MSP所指的位置肯定要更靠后,即地址更高),导致实际的MSP的初始位置不同。
MSP和PSP堆栈1
在初始化SRAM时,诸如数组这样的全局变量占用SRAM低地址空间,这些数组在系统中就作为任务堆栈的储存空间,数组的末尾(数组的高地址段)就作为储存任务寄存器的地方,其中PSP就指向所压入堆栈的最后一个寄存器的地址。这样在空间上就把任务堆栈(PSP)和系统堆栈(MSP)分离开,分别标志不同的地址位,互不干扰。同时,不同的任务都有一个自己保存好的任务堆栈栈顶备份(位于TCB中),当切换回该任务时,会把自己的栈顶备份写入PSP寄存器,实现不同任务间的切换。
MSP和PSP指向不同的堆栈位置
MSP和PSP堆栈2
参考
Cortex-M3 双堆栈指针(MSP&PSP)
STM32双堆栈及其在uC/OS-II中的使用
PendSVC切换任务时,PSP和MSP的使用

这篇关于CM3基础(持续更新)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

Docker部署Jenkins持续集成(CI)工具的实现

《Docker部署Jenkins持续集成(CI)工具的实现》Jenkins是一个流行的开源自动化工具,广泛应用于持续集成(CI)和持续交付(CD)的环境中,本文介绍了使用Docker部署Jenkins... 目录前言一、准备工作二、设置变量和目录结构三、配置 docker 权限和网络四、启动 Jenkins

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应