ARM MCU 内存划分
← 返回 Cortex-M4内核原理 | ← 主页|
Cortex-M 地址空间
0xFFFF FFFF ┌──────────────────────────────────────────┐
│ 片上系统外设 / 供应商保留区 │
0xE000 0000 ├──────────────────────────────────────────┤ ◄── 书上说的 0xE000 0000(PPB 内核私有总线)
│ 0xE000 E010: SysTick 滴答定时器寄存器 │
│ 0xE000 E100: NVIC 中断使能/优先级寄存器 │
│ 0xE000 ED08: SCB->VTOR 向量表偏移寄存器 │
0x6000 0000 ├──────────────────────────────────────────┤
│ 外部 RAM / 外部存储区 │
0x4000 0000 ├──────────────────────────────────────────┤
│ 片上外设区:GPIOA、USART1、TIM2、RCC... │
0x2000 0000 ├──────────────────────────────────────────┤
│ 片内 SRAM:变量、堆、栈 │
0x080F FFFF ├──────────────────────────────────────────┤ ◄── Flash 代码区(0x0800 0000 ~ 0x080F FFFF,依芯片)
│ [向量表] MSP、Reset、NMI、各中断入口... │
│ [代码区] main() 与用户业务代码 │
0x0800 0000 ├──────────────────────────────────────────┤ ◄── Flash 基址
│ 空白区域 │
0x001F FFFF ├──────────────────────────────────────────┤
│ 根据 boot0和boot1 映射:栈顶指针和 │
│ reset handler 中断入口 │
0x0000 0000 └──────────────────────────────────────────┘
Plaintext
┌─────────────────────────────────────────────────────────┐
│ Flash / ROM (程序代码区) │
│ ┌───────────────────────────────────────────────────┐ │
│ │ .text (代码段): 机器码.上电以后程序也运行在这里 │ │
│ │ 未初始化全局变量以指令方式存在, | |
│ │ 上电后执行指令开辟 BSS 段 | |
│ │ .data 初始值: 全局变量的初始数值 │ │
│ └───────────────────────────────────────────────────┘ │
└──────────────────────────┬──────────────────────────────┘
│ 1.硬件复位:
| 从flash的0x8000 0000读MSP值加载到MSP寄存器
| 从flash的0x8000 0004读取Reset_Handler地址,加载到PC寄存器
| 2.执行Reset_Handler:
| 执行SystemInit(),(在system_stm32xxxxx.c中,由ARM制定,ST写的)
| 3.执行__main():
| 复制flash的.data段到SRAM的.data区
| 清零SRAM的.bss区
| 完成其他的初始化最后调用用户的main()
┌──────────────────────────▼──────────────────────────────┐
│ RAM (0x2000 0000~0x200x xxxx此根据芯片) │
│ ┌───────────────────────────────────────────────────┐ │
│ │ .data (数据段): 已初始化的全局变量 / static变量 │ │
│ ├───────────────────────────────────────────────────┤ │
│ │ .bss (BSS段): 未初始化全局变量 (上电自动清零) │ │
│ │ 变量地址编译期就已确定,后续赋值不改变其地址 | |
| | freertos的线程栈和TCB就在这里 │ │
│ ├───────────────────────────────────────────────────┤ │
│ │ Heap (堆): malloc / free 动态申请的内存 (向上增长) │ │
│ ├───────────────────────────────────────────────────┤ │
│ │ Stack (栈): 函数局部变量、返回地址、压栈保护 (向下) │ │
│ └─────────────────────────┬─────────────────────────┘ │
└────────────────────────────┼────────────────────────────┘
│ CPU 抓取数据到寄存器计算
┌────────────────────────────▼────────────────────────────┐
│ CPU 芯片内部 │
│ ┌───────────────────────────────────────────────────┐ │
│ │ Registers (CPU 寄存器: R0~R15, PC, SP 等): │ │
│ │ 速度最快、数量极少的"工作台",用来做真正的加减乘除 │ │
│ └───────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘