map文件解析
编译环境:IAR for MSP430 5.50.2
MCU:MSP430F4793( 60K ROM 2.5K RAM )
DATA16_AN:本地未初始化数据(寄存器变量)寄存器变量
DATA16_AC:绝对地址常量 (使用@绝对地址)
DATA16_N:静态和全局未初始化变量(_ _no_init _ _data16 static and global variables)
DATA16_I:静态和全局初始化变量
DATA16_Z:初始化为0的静态和全局变量
DATA16_C:常量
DATA16_ID:DATA16_I中保持初始化值的静态和全局初始化变量
CODE:代码区
CSTART:启动代码区
INTVEC:中断向量表(interrupt vector)
RESET:复位向量(reset vector)
编译之后的map文件最下面三行信息:
36556 bytes of CODE memory
2538 bytes of DATA memory (+ 63 absolute )
246 bytes of CONST memory (+ 23382 absolute )
1
2
3
36 556 bytes of CODE memory
范围:1100-FFDF(占用MCU的ROM)
36 556:代码大小(CODE,CSTART)
2 538 bytes of DATA memory (+ 63 absolute )
范围:0200-0BFF
2538:占用RAM的大小(DATA16_I,DATA16_Z,DATA16_N,TLS16_I,DATA16,CSTACK)
范围:0000-01FF
63:调用的寄存器变量大小(DATA16_AN,不占用单片机RAM)
246 bytes of CONST memory (+ 23 382 absolute )
范围:1100-FFDF(占用MCU的ROM)
246:常量大小(DATA16_C)
23382:绝对地址常量大小(DATA16_AC)
------------------------------以上内容参考他人---------------------------------------
栈分析
经过分析栈的深度可以通过map文件的CSTACK得到,CSTACK代表调用这个函数需要的栈空间大小
堆栈大小设置
修改后栈空间在map文件中显示位置
默认栈大小
生成map文件
分析栈空间大小
communication_up函数分析
- 函数地址在9FD8 - A021 一共(0x4a 字节)
- 调用该函数的位置仅仅有classfy_parse这个地方
- 这里的栈为8
create_header函数分析
- 函数地址在8F52 - 8FCB 一共(0x7a 字节)
- 调用该函数的位置有14地方这个地方
- 这里的栈为4
引用位置
read_rtc_rx8130函数分析
read_hos_data_from_index函数分析
栈溢出可能位置
- 这里申请了0xdc 大小的空间,默认时80字节栈,实际这里使用了220个字节,这就可能导致栈移除
2. 这里又有可能不会移除,移植栈是向下生长的,如果向下有足够的没有使用的空间,也就不会导致程序崩溃,毕竟他不会破坏有用的数据空间,如下图所示,栈空间特别足,不会使用到全局或静态变量的空间