野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3877|回复: 6

请教 关于栈顶指针字节对齐问题

[复制链接]
发表于 2019-5-29 10:48:32 | 显示全部楼层 |阅读模式
请问一下各位大神,
RT-Thread 内核实现与应用开发实战指南
—基于野火 STM32 全系列(M3/4/7)开发板


        /* 让stk指针向下8字节对齐 */
        stk = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stk, 8) ;

代码清单 6-16(6):让 stk 这个指针向下 8 个字节对齐,确保 stk 是 8 字节对齐的地址。在 Cortex-M 内核的处理器里面,要确保栈顶指针是 8 字节对齐的。如果栈顶指针是 8 字对齐的,在进行向下 8 字节对齐的时候,指针不会移动,如果不是 8 字节对齐的,在做向下 8 字节对齐的时候,就会空出几个字节,不会使用,
比如当 stk 是 33,明显不能整除 8,进行向下 8 字节对齐就是 32,那么就会空出一个字节不使用。


为什么要向下对齐,不向上对齐啊?向下对齐不就比预设的栈大小要小了吗?向上对齐不就全部字节都能使用了吗?不太明白。

回复

使用道具 举报

发表于 2019-5-29 16:56:22 | 显示全部楼层
本帖最后由 aozima 于 2019-5-29 16:57 编辑
  1. char stack[33];
  2. char buffer_mine[11];
复制代码


向上就踩雷了哦
只能宁愿舍点不用,另外,M系列栈起码要256起哦。具体看调用深度

回复 支持 反对

使用道具 举报

发表于 2019-5-30 22:38:29 | 显示全部楼层
这个跟堆栈的生长方式有关,如果堆栈是向下生长(Cortex-M3就是,通俗的讲就是栈顶地址随着压栈,地址值会减小),也就是说如果栈顶指针是33,不能被8整除,那么栈顶指针就向下生长,移动到32,而32是可以被8整除的,这个时候,就空出来一个地址是不被使用的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-3 08:35:31 | 显示全部楼层
aozima 发表于 2019-5-29 16:56
向上就踩雷了哦
只能宁愿舍点不用,另外,M系列栈起码要256起哦。具体看调用深度

谢谢大神,好像有点明白,

但是在字节对齐之后,最后一个字节不能用了,我仍按原来设定的大小来使用的话,会不会出问题啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-3 09:53:19 | 显示全部楼层
Taizi091019 发表于 2019-5-30 22:38
这个跟堆栈的生长方式有关,如果堆栈是向下生长(Cortex-M3就是,通俗的讲就是栈顶地址随着压栈,地址值会减 ...

谢谢,

那如果我仍按照33来使用,会出现什么问题吗?
回复 支持 反对

使用道具 举报

发表于 2019-6-3 09:59:25 | 显示全部楼层
你要使用多少栈,你并不能精确知道,所以不存在你继续按33来用这个说法。
同样的代码,不同的编译参数使用量会有不同。
然后子函数 的调用深度也会改变栈深度。
所以一般要对栈使用有个评估,然后检查确认,只保证不溢出即可。

比如在 shell中可以通过ps命令查看当前使用百分比。
回复 支持 反对

使用道具 举报

发表于 2019-6-3 14:47:25 | 显示全部楼层
这个说起来有点儿复杂,对齐方式直接对应的是栈指针的增减方式,M3和M4的栈指针(MSP和PSP)都是32位寄存器,Cortex-M的内核中push和pop指令都是32位的,所以栈地址必须得对正32位也即4字节对齐,而且这两个栈指针的最后两位始终为0(对这两位的写操作是不起作用的),也就是说,栈指针永远都不会指向一个地址不能被4整除的地址,举一个不是很恰当的例子,如果你自定义了一个栈空间,然后将需要出栈的信息放在了起始地址为0x****4001内存中,这时候你赋值给栈指针,想要使得栈指针等于0x****4001,但是对于栈指针来说,最后写入的01根本就没用,所以此时的栈指针值是0x****4000,显然不是你预期想要它指向的地方。这个时候你执行push或者pop一定得不到你想要的结果。这个就是栈地址对齐的意义。至于火哥说栈地址必须8字节对齐,这个我想可能是更多的兼容性考虑吧。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-4 01:59 , Processed in 0.032326 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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