shiva_shiva 发表于 2020-8-21 14:59:46

怎么确认一个Cortex-M4的芯片的栈的类型?

肯定是递减的,但是不确定是空/满栈?
假设现在的ram地址是0x20000000~0x20010000共64KB,我想把最后的16KB做栈,我的栈起始地址是设置0x20010000还是0x2000FFFC?

yuyu87 发表于 2020-8-21 16:20:08

栈是往下长的,看ARM官方手册说明,

meirenai 发表于 2020-8-21 18:31:45

仿真试一下不就行了嘛?

LinuxHacker 发表于 2020-8-21 20:38:09

我认为是0x20010000。

security 发表于 2020-8-22 08:53:51

0x20010000

armstrong 发表于 2020-8-24 14:49:36

是0x20010000,称为满递减堆栈。

shiva_shiva 发表于 2020-8-24 15:12:24

armstrong 发表于 2020-8-24 14:49
是0x20010000,称为满递减堆栈。

满递减栈,并不是不应该用0x2001000地址,初始值应该设置为0x2000FFFC?!
空递减栈才设置为0x2001000吧?

armstrong 发表于 2020-8-24 15:32:29

不要管名称,你这里确实是要配置为0x20010000;而且要确保堆栈地址为8字节对齐。
0x2000FFFC不是8字节对齐,而且白白搁置4字节空间。

shiva_shiva 发表于 2020-8-24 16:34:31

本帖最后由 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.

armstrong 发表于 2020-8-24 21:38:58

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]
查看完整版本: 怎么确认一个Cortex-M4的芯片的栈的类型?