本帖最后由 luaffy 于 2020-9-8 14:39 编辑
map文件详解
MAP 文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。
如下图,<CODE>1所指的函数Flash_Read();地址为85FC - 8617 ,占0x1c bytes,被flashhandle 文件的Application()函数,EraseCode()函数和bootcmd文件的PcCmd_Process()函数调用。
MAP文件和XCL文件中,重要符号含义如下——
DATA16_AN:外围文件映射
DATA16_I:通过从DATA16_ID复制初始化的数据/定义时有初始化的变量
DATA16_Z:定义时初始化为0的数据
CSTACK:栈
DATA16_C:常数,包括字符串
CSTART:程序启动代码
ISR_CODE:中断服务函数程序代码
DATA16_N:使用__no_init定义的数据/未在定义时初始化的变量
DATA16_HEAP:malloc和free使用的堆
TLS16_I:主线程的线程本地存储
DATA16_ID:数据初始化器
CODE:程序代码
ISR_CODE:中断服务函数程序代码
INTVEC:中断向量
RESET:复位中断向量
ISR_CODE:中断服务函数程序代码
结合map文件、用户手册、内存窗口,可以了解到MSP430F247的内存划分情况。
单片机预留0x0000-0x01FF地址放置外围映射数据,msp430f247只用了0x0000-0x01A8,细划分为——
特殊功能寄存器SFR(0x0000-0x0003),MAP: DATA16_AN
外围文件映射/寄存器(0x0004-0x01A8),MAP:DATA16_AN
RAM镜像Mirrired (0x1100-0x18FF)数据的拷贝
大小正好为512bytes,一个扇区,写满FF 3F
固化的bootloader
- information memory(0x1000-0x10FF)
INFOA=10C0-10FF
INFOB=1080-10BF
INFOC=1040-107F
INFOD=1000-103F
镜像(Mirrired):0x1100-0x18FF
拓展(Extended):0x1900-0x20FF
RAM(0x0200-0x09FF)的内存空间拷贝了一份镜像(0x1100-0x18FF)的数据。
镜像和拓展区装载了通过从DATA16_ID复制初始化的数据/定义时有初始化的变量(MAP:DATA16_I)、定义时初始化为0的数据(MAP:DATA16_Z)、栈区数据(MAP:CSTACK)
写满FF 3F
- code memory(0x8000-0xFFFF)
以bootloader为例,code memory再细分为:常数区0x8000-0x8003(MAP: DATA16_C),启动程序0x8004-0x801B(MAP: CSTART),程序区0x801C-0x87FF(MAP: <CODE> 1 ,硬件中断向量区0xFFC0-0xFFFD(MAP: INTVEC),复位中断向量地址0xFFFE – 0xFFFF(MAP: RESET)
综上,MSP430F247硬件内存空间详细划分如下图:
|