国产cortex-m3核芯片TS3F605的堆栈空间分析

下图是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.堆栈溢出

如果在程序运行的过程中,堆的空间也一直在消耗,栈的空间也在增加,那么这时堆和栈如果碰到一起,那么就会造成堆栈溢出,从而导致我们的程序跑飞

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值