-内置
SRAM:196KB
Up to 192+4 Kbytes of SRAM including 64 Kbyte of CCM (core coupled memory) data RAM
SROM(用户可编程):1M
Up to 1 Mbyte of Flash memory
-外扩
IS62WV51216:1MB,SRAM,FSMC接口
// 为什么不扩展SDRAM,STM32F407 FSMC接口支持SRAM,NAND,NOR,PSRAM. 不支持SDRAM.STM32的高端产品429/439添加了新的外设,SDRAM控制器(FMC总线)24C02:256B,EEPROM,I2C接口
W25Q128:16M,NorFlash,SPI接口
startup_stm32f40_41xxx.s 中有对 栈(stack) 和 堆(heap)的初始化
1. RESET
2. XIP on 主Flash (属于硬件对内存的管理,代码开始之后,就开始了软件对内存的管理,硬件对内存的管理退出舞台)2.1 Reset_Handler
2.2 SystemInit // 专门的跳转指令 B、BL、BX、BLX 和 BXJ ,不会使用 .stack2.3 _main
3. 代码执行序列到_main
3.1 将 non-root (RO and RW) execution regions 从 加载地址 拷贝到 执行地址.如果data sections被压缩,则将它们从加载地址(加载区域)解压缩到执行地址(执行区域)。//具体实现在(InRoot$$Sections) ------------对应 .code 段 和 .ro-data 段
// 其实 RO(RO-data) 的 加载地址 和 执行地址是一样的.都在0x08000000(主Flash上)------------对应 .data 段
// RW(RW-data) 加载地址在 0x08000000 + sizeof(RO-data),执行地址在0x20000000(SRAM1)------------对应 .bss 段
// ZI(ZI-data) 加载地址在 0x08000000 + sizeof(RO-data),执行地址在0x20000000(SRAM1) // 其实这一段并没有加载,因为加载了也要清0,所以干脆留空.只记录 ZI-data 执行地址的开始地址和结束地址------------对应 .bss 段
3.2. 将ZI regions清03.3. 跳转到__rt_entry
------------对应 .stack 段 和 .heap段
3.3.1. Sets up the stack and the heap by one of a number of means that include calling __user_setup_stackheap(), calling __rt_stackheap_init(), or loading the absolute addresses of scatter-loaded regions.// 栈的初始化不涉及到内存,只涉及到SP寄存器// 堆的初始化涉及到内存, 1.清零堆空间 2.在堆中建立数据结构来对堆进行分块 // 从现在开始,内存分段(软件对内存的布局)已经完成// 下面就开始使用前面代码建立的 .stack .heap .data .bss .code .ro-data 段进行操作3.3.2. Calls __rt_lib_init() to initialize referenced library functions, initialize the locale and,if necessary, set up argc and argv formain(). For C++, calls the constructors for any top-level objects by way of __cpp_initialize__aeabi_ .3.3.3. Calls main(), the user-level root of the application. From main(), your program might call, among other things, library functions.3.3.4. Calls exit() with the value returned by main()
栈
栈大小定义
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
;<h> Stack Configuration
;<o> Stack Size (in Bytes)<0x0-0xFFFFFFFF:8>;</h>
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
定义一个宏 Stack_Size 为 0x00000400
汇编一段空间(定义数据段),空间名为 STACK,不初始化,可读写, 8(2^3)字节边界对齐。
从 STACK(不确定)开辟一段空间给空间STACK,大小为 Stack_Size(0x00000400) 字节,即从(__initial_sp -0x000003FF,__initial_sp),不初始化
栈顶标号为__initial_sp ,它根据堆栈大小,由编译器自动生成
说明:
AREA命令指示汇编器汇编一个新的代码段或者数据段。Contrx-M3的指令地址要求是字边界对齐(4字节),但是代码段是要求8字节边界对齐的。
NOINIT:指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个内存单元值初始化为0。
SP寄存器的初始化
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
//__Vectors 为 0x00000000//DCD命令 分配一个双字(32bits)的内存空间,并将 __initial_sp 存入,并4字节对其.//__initial_sp 为 之前定义的栈的栈顶地址,cortex-m3手册中规定 0x00000000 必须放 栈顶地址
硬件正点原子探索者开发板 STM32407ZET6 cortex-M4 ARMv7 -内置 SRAM:196KB Up to 192+4 Kbytes of SRAM including 64 Kbyte of CCM (core coupled memory) data RAM SROM(用户可编程):1M Up to 1 Mbyte of Flash me...