0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用C语言如何判断栈的增长方向呢

冬至配饺子 来源:最后一个bug 作者:bug菌 2022-07-28 11:23 次阅读

在学校或者各种编程类书本上,基本上都会看到一句话:"函数是程序的基本组成单位",可以说理解函数对编程是非常重要的,与函数调用紧密结合的机制就是函数调用栈了,而栈有一个特别的属性就是栈的增长方向问题了,也发现一些多年编程经验的朋友对这一块都有点迷迷糊糊的。在阅读RTOS源码的时候也会经常看到栈的增长方向配置项目,那么今天就带大家了解一下栈的增长方向到底是咋回事。

1、栈的增长方向

首先我们要明确的是栈同样也是分布在我们的内存之中,而内存是通过地址来进行编排访问的,如下是堆栈的示意图:

poYBAGLiAHuAAbKkAABnWFxTtuQ560.png

对于堆栈而言原本并没有方向一说,只有入栈和出栈一说,程序中执行push指令则栈顶向上移动,执行pop指令则栈顶向下移动,其仅仅只是一种先进后出的数据结构,增长方向都是从栈底向栈顶方向移动,即分配数据的过程。

而我们平时所说的栈的增长方向又是怎么回事呢?

为了在内存中分配一段内存给堆栈,我们必须要区分堆栈相对于内存的地址而言的方向性,通常栈顶增长的方向是从内存的低地址向高地址变化,我们则称为向上增长;反之则向下增长。

所谓"水往高处流,即向上增长",这样应该就很好记忆了。

2、有什么用?

当了解处理器中栈指针的增长方向以后,我们在debug程序的时候才能真正的把控程序的运行过程。

在移植RTOS的过程中我们都需要对每个任务的堆栈分配一个合适的连续内存区域来使用,此时初始状态堆栈指针指向什么位置就跟堆栈的增长方向密切相关,有过RTOS移植经验的朋友应该都有在RTOS配置项中关注过这块的选择。

RTOS在任务初始化的时候,其堆栈指针应该指向其栈底位置,那么对于堆栈向上增长,任务初始化的时候我们需要把堆栈指针设置在所分配内存的低地址内存处,反之则设置到高地址处。

poYBAGLiAKKAFXH2AABy3437hcQ779.png

设置好以后,其在堆栈分配的过程中才会朝着所分配的内存区域中,否则就会堆栈反向自爆,导致程序异常;如果你的堆栈分配不合理,同样了解堆栈变化方向后也变得有迹可循。

同样在裸机程序中也需要了解一下处理器的堆栈变化方向,从而用来排查一些堆栈溢出所导致的程序异常问题。

3、用C语言如何判断?

要了解一个CPU的堆栈的变换方向,一方面就是查询相应的芯片参考手册,另外一方面就是实际测试了。

毕竟堆栈也就是内存,自然就可以通过堆栈的分配过程取出所分配的内存地址来比较判断,而C语言可以方便的访问内存,也就比较容易判断当前处理器中堆栈指针的增长方向了。

那还不简单,直接在函数内部先后定义两个局部变量,直接比较两个变量的地址大小不就搞定了吗?其实这种方式是依赖于编译器实现的,毕竟哪个变量先进行内存申请,并没有太大的影响。

那么是否有一种方法不依赖于编译器实现呢?

必须有的,那就是函数调用栈了,因为先调用的函数必然首先入栈。

基于这样的思想,这里bug菌写一个判断堆栈增长方向的demo供大家参考:

poYBAGLiAMmAOSP7AAD6dMwwGvQ386.pngpoYBAGLiAM2ABykAAACdf-nzKFc394.png

可以拿去试一试,看看你的芯片堆栈咋变化的~


审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18612

    浏览量

    224559
  • 芯片
    +关注

    关注

    449

    文章

    48596

    浏览量

    413103
  • C语言
    +关注

    关注

    180

    文章

    7551

    浏览量

    131905
  • RTOS
    +关注

    关注

    20

    文章

    782

    浏览量

    118922
收藏 人收藏

    评论

    相关推荐

    柔性电流探头方向判断的方法

    柔性电流探头是一种用于测量电流的设备,其特点是能够弯曲和扭转以适应不同的测量场景。在使用柔性电流探头时,正确判断方向非常重要,因为方向错误可能导致测量结果的偏差。以下是柔性电流探头方向
    的头像 发表于 03-11 13:33 214次阅读
    柔性电流探头<b class='flag-5'>方向</b><b class='flag-5'>判断</b>的方法

    电子受的洛伦兹力的方向判断

    介绍如何判断电子受到洛伦兹力的方向。 第一部分:洛伦兹力的基本定义和表达式 洛伦兹力是由法国物理学家洛伦兹于1895年提出的,用于描述带电粒子在电磁场中所受到的力。洛伦兹力的表达式可以写为: F = q(E + v × B) 其中,F表示
    的头像 发表于 02-26 14:14 1229次阅读

    通电导体在磁场中受到力的作用方向怎么判断

    通电导体在磁场中受到力的作用方向可以使用右手定则来判断。右手定则是根据电荷在磁场中受力的方向判断导体受力的方向。 首先,假设我们有一个通电
    的头像 发表于 02-25 17:37 1739次阅读

    线圈磁场方向判断方法用什么定则

    线圈磁场方向判断可以利用右手螺旋定则。该定则是由法国物理学家安德烈-玛丽·安培(Andre-Marie Ampere)于19世纪提出的。 右手螺旋定则是一种用于判断电流所产生的磁场的方向
    的头像 发表于 02-25 17:07 2379次阅读

    如何判断编码器的方向

    通过直流调速器(590)里的参数可以知道编码器的方向,如果反了,将A、B相信号反一下就行了,这是平时我在现场看到别人调试时这么做的,请问如果没有直流调速器,要怎么判断编码器的方向
    发表于 12-21 07:17

    如何判断电动势的方向

    如何判断电动势的方向? 电动势是指一个电源(如电池)在电路中产生的电势差,它是产生电流的动力源。电动势的方向对于电路的工作至关重要,因此了解如何判断电动势的
    的头像 发表于 12-19 11:35 2250次阅读

    单片机编程语言可以c++吗?

    单片机编程语言可以c++吗?
    发表于 11-09 06:40

    快速判断LDO VOUT的变化方向

    我们知道,在LDO或者开关变换器里,VIN(输入电压)以及i(负载电流)的突变会引起VOUT(输出电压)的瞬态变化,引起overshoot(过冲)或undershoot(下冲)的现象。当然,这和电路本身的带宽有关。这里仅以LDO为例,快速判断VOUT的变化方向
    的头像 发表于 11-07 17:29 597次阅读
    快速<b class='flag-5'>判断</b>LDO VOUT的变化<b class='flag-5'>方向</b>

    请问单片机的是c语言的吗?

    请问单片机的是c语言的吗?
    发表于 11-02 06:46

    请问FPGA可以C语言开发吗?

    FPGA可以C语言开发吗?
    发表于 10-31 08:26

    单片机C语言指针有什么用处

    单片机C语言指针有什么用处
    发表于 10-23 07:18

    增量式编码器怎么判断正反方向?

    应该怎么通过单片机来判断旋转方向
    发表于 10-16 07:25

    IIC协议中是怎么确定主和从的?

    是通过什么方式来判断一个设备是主还是从
    发表于 10-10 06:01

    电压源的电流方向怎么判断

    电压源的电流方向怎么判断? 电压源是电路中为保持电势差不变,能够提供一定电压的电器元件,其电流方向是指在整个电路中,从电压源正极到负极的方向。通常情况下,电压源的电流
    的头像 发表于 09-17 09:57 1.3w次阅读

    如何判断电、磁、力方向

    判断电、磁、力方向的“七字口诀”是“左力”、“右电”、“磁螺旋”。 一、“左力” 左手判断的是和力有关的方向判断通电导体在磁场中所受安培力
    的头像 发表于 09-14 10:51 1.1w次阅读
    如何<b class='flag-5'>判断</b>电、磁、力<b class='flag-5'>方向</b>