下图是TS3F605芯片的空间分布,RAM是从0x2000 0000-0x2001 7FFF共96KB。
1. 芯片的RAM空间由data段,bss段,Heap段,Stack段组成。
data段初始值为非0的全局变量,
bss段为初始值为0的和未初始化的全局变量。
Heap段在为由 malloc 申请的空间由 free 释放,如果不适用malloc可以设置为0。
Stack段是局部变量使用的空间,需要根据用户实际使用打下设置。
比如:
int dataVal = 0x1234;//分配到data空间
int bssInitVal = 0x0;//分配到bss空间
int bssVal ;//分配到bss空间
int main()
{
int StackVal = 0; //分配到Stack空间
}
2.mdk map文件分析
使用keil mdk,可以在生成的map文件中,在黄色标记位置即为各个段的地址。
Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x00005248, Size: 0x00001440, Max: 0x00018000, ABSOLUTE, COMPRESSED[0x000000c8])
Exec Addr Load Addr Size Type Attr Idx E Section Name Object
0x20000000 COMPRESSED 0x0000000a Data RW 2335 .data.__caxx_cap__ capsenceparameter.o
……
0x20000310 - 0x00000060 Zero RW 2656 .bss c_w.l(libspace.o)
……
0x20000640 - 0x00000a00 Zero RW 2298 HEAP startup_tscaxx.o
0x20001040 - 0x00000400 Zero RW 2297 STACK startup_tscaxx.o
3.data段,bss段,Heap段,Stack段的配置
data段和bss段编译器根据变量的个数自动生成。
Heap段在.s启动文件的Heap_Size设置
Heap_Size EQU 0x00000A00
Stack段在.s启动文件的Stack_Size设置
Stack_Size EQU 0x00000400
通过调用__user_initial_stackheap函数进行设置
//*----------------------------------------------------------------------------
//* Function Name : __user_initial_stackheap
//* Object : Returns the locations of the initial stack and heap.
//* Input Parameters :
//* Output Parameters :The values returned in r0 to r3 depend on whether you
//* are using the one or two region model:
//* One region (r0,r1) is the single stack and heap region. r1 is
//* greater than r0. r2 and r3 are ignored.
//* Two regions (r0, r2) is the initial heap and (r3, r1) is the initial
//* stack. r2 is greater than or equal to r0. r3 is less than r1.
//* Functions called : none
//*----------------------------------------------------------------------------
-
__value_in_regs struct __initial_stackheap __user_initial_stackheap(unsigned R0, unsigned SP, unsigned R2, unsigned SL)
-
{
-
struct __initial_stackheap config;
-
config.stack_base = SP;
-
config.stack_limit = SP-STACK_SIZE;
-
config.heap_base = (unsigned)(USER_HEAP_ADDRESS);
-
config.heap_limit = ((unsigned)(USER _HEAP_ADDRESS))+USER_SRAM_SIZE;
-
return config;
-
}
4.堆栈溢出
如果在程序运行的过程中,堆的空间也一直在消耗,栈的空间也在增加,那么这时堆和栈如果碰到一起,那么就会造成堆栈溢出,从而导致我们的程序跑飞