搜索
bottom↓
回复: 9

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

[复制链接]

出0入0汤圆

发表于 2020-8-21 14:59:46 | 显示全部楼层 |阅读模式
肯定是递减的,但是不确定是空/满栈?
假设现在的ram地址是0x20000000~0x20010000共64KB,我想把最后的16KB做栈,我的栈起始地址是设置0x20010000还是0x2000FFFC?

出15入186汤圆

发表于 2020-8-21 16:20:08 | 显示全部楼层
栈是往下长的,看ARM官方手册说明,

出0入0汤圆

发表于 2020-8-21 18:31:45 | 显示全部楼层
仿真试一下不就行了嘛?

出0入0汤圆

发表于 2020-8-21 20:38:09 来自手机 | 显示全部楼层
我认为是0x20010000。

出0入8汤圆

发表于 2020-8-22 08:53:51 | 显示全部楼层
0x20010000

出870入263汤圆

发表于 2020-8-24 14:49:36 | 显示全部楼层
是0x20010000,称为满递减堆栈。

出0入0汤圆

 楼主| 发表于 2020-8-24 15:12:24 | 显示全部楼层
armstrong 发表于 2020-8-24 14:49
是0x20010000,称为满递减堆栈。

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

出870入263汤圆

发表于 2020-8-24 15:32:29 | 显示全部楼层
不要管名称,你这里确实是要配置为0x20010000;而且要确保堆栈地址为8字节对齐。
0x2000FFFC不是8字节对齐,而且白白搁置4字节空间。

出0入0汤圆

 楼主| 发表于 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.

出870入263汤圆

发表于 2020-8-24 21:38:58 | 显示全部楼层
shiva_shiva 发表于 2020-8-24 16:34
哦,满栈是不是这样:
1、sp--
2、*sp = data


上电时,CPU会从异常向量表自动取出堆栈地址,这个只要查看项目的启动文件就行了。
比如:

  1. Stack_Size      EQU     0x00000400

  2.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3
  3. Stack_Mem       SPACE   Stack_Size
  4. __initial_sp

  5. ; Vector Table Mapped to Address 0 at Reset
  6.                 AREA    RESET, DATA, READONLY
  7.                 EXPORT  __Vectors
  8.                 EXPORT  __Vectors_End
  9.                 EXPORT  __Vectors_Size

  10. __Vectors
  11.                 DCD     __initial_sp               ; Top of Stack
  12.                 DCD     Reset_Handler              ; Reset Handler
  13.                 DCD     NMI_Handler                ; NMI Handler
  14.                 DCD     HardFault_Handler          ; Hard Fault Handler
  15.                 DCD     MemManage_Handler          ; MPU Fault Handler
  16.                 DCD     BusFault_Handler           ; Bus Fault Handler
  17.                 DCD     UsageFault_Handler         ; Usage Fault Handler
  18.                 DCD     0                          ; Reserved
  19.                 DCD     0                          ; Reserved
  20.                 DCD     0                          ; Reserved
  21.                 DCD     0                          ; Reserved
  22.                 DCD     SVC_Handler                ; SVCall Handler
  23.                 DCD     DebugMon_Handler           ; Debug Monitor Handler
  24.                 DCD     0                          ; Reserved
  25.                 DCD     PendSV_Handler             ; PendSV Handler
  26.                 DCD     SysTick_Handler            ; SysTick Handler
复制代码

其中__initial_sp就是。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 18:06

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表