MCU并没有DDR,所以他把代码存储在flash上,临时变量和栈运行在SRAM上。之所以这么做是因为MCU的cpu频率很低,都是几十MHZ到一二百MHZ,flash的读取速度能够满足cpu 的取指需求,但flash 的写入速度很慢,所以引入了SRAM 作为临时变量和栈的运行空间。
-
关于flash的存储结构
中断向量表放置在flash的起始地址,privileged functions 特权模式下执行的指令
.isr_vector section的目的是把中断向量表放在 0x08000000 这个特定的内存位置,确保中断向量表占用的内存空间大小是 0x298 字节,将所有包含中断向量表的目标文件(*(.isr_vector))链接到这个 section。
*(.text section*)中定义的是中断服务的应用代码
FreeRTOS系统调用被放置在起始地址0x08008000的flash地址,也就接着特权指令后的地址
FreeRTOS是如何被写到flash地址的,通过.ld文件链接脚本(Linker Script)文件实现的,实现了内存映射,定义目标中不同类型的内存区域,如 Flash、RAM、外设,指定每个内存区域的起始地址和大小。以及实现MPU内存保护。不同芯片文件不一样,TC397用的vLinkGen.lsl文件实现。
-
关于MCU的内存分配结构:
对于MCU来说,栈区和bss段和data段一般是放在MCU的SRAM区
下面这些都是从RAM里获取的
常量rodata和代码存放在MCU的内部flash里
下面都是从flash里获取的
关于MCU的寄存器地址
寄存器用于暂存CPU内部的数据和状态。
SRAM用于存储程序运行时的临时数据。
FLASH用于存储程序代码和持久性配置数据。