怎么确认一个Cortex-M4的芯片的栈的类型?
肯定是递减的,但是不确定是空/满栈?假设现在的ram地址是0x20000000~0x20010000共64KB,我想把最后的16KB做栈,我的栈起始地址是设置0x20010000还是0x2000FFFC? 栈是往下长的,看ARM官方手册说明, 仿真试一下不就行了嘛? 我认为是0x20010000。 0x20010000 是0x20010000,称为满递减堆栈。 armstrong 发表于 2020-8-24 14:49
是0x20010000,称为满递减堆栈。
满递减栈,并不是不应该用0x2001000地址,初始值应该设置为0x2000FFFC?!
空递减栈才设置为0x2001000吧? 不要管名称,你这里确实是要配置为0x20010000;而且要确保堆栈地址为8字节对齐。
0x2000FFFC不是8字节对齐,而且白白搁置4字节空间。 本帖最后由 shiva_shiva 于 2020-8-24 16:36 编辑
armstrong 发表于 2020-8-24 15:32
不要管名称,你这里确实是要配置为0x20010000;而且要确保堆栈地址为8字节对齐。
0x2000FFFC不是8字节对齐 ...
哦,满栈是不是这样:
1、sp--
2、*sp = data
所以,虽然是满栈,但是上电后栈指针其实是指向一个空位置的。
如果是空栈,则是:
1、*sp=data
2、sp--
所以,如果是空栈,初始值应该设置为0x0000FFF8. shiva_shiva 发表于 2020-8-24 16:34
哦,满栈是不是这样:
1、sp--
2、*sp = data
上电时,CPU会从异常向量表自动取出堆栈地址,这个只要查看项目的启动文件就行了。
比如:
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT__Vectors
EXPORT__Vectors_End
EXPORT__Vectors_Size
__Vectors
DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
其中__initial_sp就是。
页:
[1]