STM32 M4 存储器学习
关联:存储器映射、位带区位带别名、systick
存储空间的一些位置用于调试组件等私有外设,这个地址段被称为“ 私有外设区”。私有外设区的组件包括:
闪存地址重载及断点单元(FPB)
数据观察点单元(DWT)
指令跟踪宏单元(ITM)
嵌入式跟踪宏单元(ETM)
跟踪端口接口单元(TPIU)
ROM 表 通常指的是 系统中断向量表 或 系统控制表,它存储了和系统管理、异常处理以及一些核心功能相关的信息。
中断向量表(Interrupt Vector Table, IVT) 是一个存储中断处理函数地址的数据结构。它定义了每个中断源触发时,微控制器应该跳转到哪个特定的函数处理该中断。
每个中断源(例如外部中断、定时器中断、系统异常等)都会有一个对应的 中断服务程序(ISR),也就是中断处理函数
M3预存的存储器预设↓
并不是每个地址都有效。事实上,在这个地址空间中,许多地址并没有被使用,或者并不与物理存储或外设关联。这些地址通常是 未定义的地址,如果尝试访问这些地址,可能会导致 异常 或 无效访问 错误。
映射的 SRAM 区的作用
1. 存储局部变量和堆栈
2. 动态数据存储
3. 存储全局变量
4. 数据交换和计算缓存
5. 启动时的数据加载
6. 高频缓存区
7. 保存运行时状态
位带区和位带别名
位带区 (Bit-band area) 是一种特殊的内存区域,通常用于嵌入式系统中(如 STM32 微控制器),可以让我们通过一个 32 位内存单元 来操作内存中的 单个位,而无需使用位运算。
最后还剩下 0.5GB 的隐秘地带, CM3 内核的闺房就在这里面,包括了系统级组件,内部私有外设总线 s,外部私有外设总线 s,以及由提供者定义的系统外设。
私有外设总线有两条:
AHB 私有外设总线,只用于 CM3 内部的 AHB 外设,它们是: NVIC, FPB, DWT 和 ITM。
APB 私有外设总线,既用于 CM3 内部的 APB 设备,也用于外部设备(这里的“外部”是对内核而言)。 CM3 允许器件制造商再添加一些片上 APB 外设到 APB 私有总线上,它们通过 ABP 接口来访问。
0xE000E000 – 0xE000EFFF:系统控制空间,用于控制处理器的核心功能和系统控制寄存器。主要涉及:
0xE000E010 – 0xE000E01F:SysTick 定时器控制寄存器,提供定时功能。
0xE000E100 – 0xE000EFFF:这是 嵌套向量中断控制器(NVIC) 的寄存器区,管理中断的优先级、屏蔽等。
SYSTICK 只是一个定时器,它的作用是基于系统时钟(如 HSI、HSE、或 PLL 时钟)提供定时中断或延时。它是用来执行时间间隔操作的,而不是作为整个系统的时钟源。整个系统的时钟周期通常由系统时钟源(如外部晶振、内部时钟源或 PLL)控制。
RTC(Real-Time Clock) 是用于跟踪当前时间和日期的外设。RTC 通常独立于主处理器运行,并通过外部 晶振 提供稳定的时钟源。
E0000000
到 E00FFFFF
这个地址范围是专门为 系统控制外设 和 中断管理 保留的区域。这个区域并不是一般的外设区域,而是一些特定的 系统管理和控制外设,它包括 NVIC(嵌套向量中断控制器)、SysTick(系统定时器)、系统控制、硬件调试功能 等相关的外设。
为什么“代码区”不可以缓存?
私有外设区(Private Peripheral Region)指的是存储器地址空间中专门为系统的内部外设分配的区域。这个区域通常被 微控制器(MCU) 或 微处理器(MPU) 的 外设 所占用,用于与 系统核心 或 外部设备 进行数据交换、控制和状态更新。
私有外设区:是一个相对较为 狭义 的定义,通常指的是系统内部与核心功能或模块紧密耦合的外设,往往不直接与外部设备交互。它可能包括:
外设区:指的是所有通过 内存映射 I/O(MMIO)访问的外设,包括存储器、I/O接口、通信接口(如 UART、SPI、I2C)等。
一.存储器的缺省访问许可
CM3 有一个缺省的存储访问许可,它能防止使用户代码访问系统控制存储空间,保护NVIC、 MPU 等关键部件。缺省访问许可在下列条件时生效
没有配备 MPU
配备了 MPU,但是 MPU 被除能
缺省的存储器访问许可权限如表
1. 32 位数据的对齐要求:
对于 32 位数据(如 uint32_t
、float
等),访问时需要确保内存地址是 4 字节对齐,即地址是 4 的倍数。例如,访问 0x20000000、0x20000004 等地址时是合法的,但如果访问 0x20000001,则可能会导致总线错误(Bus Fault)。
2. 16 位数据的对齐要求:
对于 16 位数据(如 uint16_t
),通常要求 2 字节对齐。这意味着可以访问地址为 偶数地址(例如 0x20000000、0x20000002)的内存位置,但不能访问奇数地址(如 0x20000001)。
3. 8 位数据的对齐要求:
对于 8 位数据(如 uint8_t
),没有对齐要求,可以访问任何地址。这意味着可以访问 所有地址,包括 奇数地址。
4. 总线错误(Bus Fault):
如果你访问了不满足对齐要求的地址(例如访问 0x20000001 来读取 32 位数据),ARM Cortex-M 处理器会产生一个 总线错误,因为处理器要求 32 位数据必须 4 字节对齐,而 16 位数据 必须 2 字节对齐。
存储器映射区域中的 1 字节对齐数据
通常情况下,1 字节对齐 的区域是用于存储 8 位数据 的部分。具体来说,以下几个区域或数据类型是 1 字节对齐 的:
1. 内部 SRAM 和外部存储器的字节数据
0x20000000
到 0x2001FFFF
)和 外部存储器(如通过外部总线连接的存储器)中,8 位数据(如 uint8_t
类型)是 1 字节对齐 的。你可以将这些区域视为存储字节数据的地方,可以访问任何地址。2. 外设寄存器(8 位的外设)
有些外设(特别是那些只涉及 8 位数据 的外设)在存储器映射中是 1 字节对齐 的。例如,一些只接收或传输字节数据的通信外设(如串口的数据寄存器)可能会存储为 1 字节对齐。
示例:一个 UART(串口)的 数据寄存器,它存储的是 8 位数据,在地址映射中会是 1 字节对齐。
位带操作还能用来化简跳转的判断。当跳转依据是某个位时,以前必须这样做:
读取整个寄存器
掩蔽不需要的位
比较并跳转
现在只需:
从位带别名区读取状态位
比较并跳转
多任务的共享资源必须满足一次只有一个任务访问它——亦即所谓的“原子操作”。以前的读-改-写需要 3 条指令,导致这中间留有两个能被中断的空当。于是可能会出现如下图所示的紊乱危象:
通过使用 CM3 的位带操作,就可以消灭上例中的紊乱危象。 CM3 把这个“读-改-写”做成一个硬件级别支持的原子操作,不能被中断,
作者:q2380957683