uC/OS-III的OSTaskStkInit函数中的Align the stack to 8-bytes

问题

最近在学习uC/OS-III,刚好看到官方源码中的OSTaskStkInit函数中有这么一句让我百思不得其解。
在这里插入图片描述

/* Align the stack to 8-bytes.                            */
p_stk = (CPU_STK *)((CPU_STK)(p_stk) & 0xFFFFFFF8);	

然后我开始看CSDN其他博主的文章,然后我竟然开始怀疑官方是不是错了(too young,too naive)
看了很久的博主才终于明白,最后顺便写了下面这两遍博客,里面是关于字节对齐问题更具体的解释:
字节对齐
【嵌入式】堆栈8字节对齐


分析

回到本文的重点
p_stk = (CPU_STK *)((CPU_STK)(p_stk) & 0xFFFFFFF8); 这一句代码其实也就是为了进行8字节对齐
所谓的“对齐”就是从0开始就把内存按照一定大小划分,那么这个地址就一定能被这个大小整除。
那是怎么做到的呢?
p_stk 其实是一个 8字节的指针,从汇编角度来看的话,在执行到这一句语句之前,p_stk 可能因为char,int等这些不是8字节的变量影响,导致p_stk并不在划分的边界,如图
在这里插入图片描述
这时我们需要把p_stk"抽象地"下移,实际上下图中间那块黑色区域还是p_stk的,而且还是存在的,只是我们为了对齐再也不会去使用它,就废弃了——所以可以把它抽象为下移。
而且栈我们是要求不能完全用光的,会留有一点点,所以不用去考虑它的结尾在哪里。
在这里插入图片描述

解释

那么怎么用代码实现“下移”呢?
像上面的分析一样,只要使这个地址能被对齐的大小整除就可以了,因为这个大小是8,所以用位运算就是:
(CPU_STK)(p_stk) & 0xFFFFFFF8
低三位清零就相当于除以8了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值