根据系统的memory mapping,链接脚本中规定有栈顶的地址(栈地址变换为从上往下,从大到小,因此规定栈顶)

  __stack_top = ORIGIN(SRAM) + LENGTH(SRAM); //在此规定从ram胡最后开始为栈顶 __stack_bottom = __stack_top - __stack_size

也可以动态计算栈地址

.stack (NOLOAD) : {

. = ALIGN(4) ;

__irq_stack_start = .;

. += 1024;

__irq_stack = .;

__stack_start = .;

__stack_size = __RAM_END - ABSOLUTE(.) - 4;

. += __stack_size;

__stack = .;

} > REGION_BSS

在start.S中,需要拿到栈顶地址

.import __stack_top

会将__stack_top这个变量的地址load到cpu的sp寄存器,从而规定其初始地址

后续栈的使用由程序调用过程决定。这可以理解成编译器维护?