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

    文章

    19286

    浏览量

    229842
  • 芯片
    +关注

    关注

    455

    文章

    50816

    浏览量

    423616
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136827
  • RTOS
    +关注

    关注

    22

    文章

    813

    浏览量

    119636
收藏 人收藏

    评论

    相关推荐

    AWTK-WEB 快速入门(1) - C 语言应用程序

    导读AWTK可以使用相同的技术开发各种平台的应用程序。有时我们需要使用Web界面与设备进行交互,本文介绍一下如何使用C语言开发AWTK-WEB应用程序。AWTKDesigner新建
    的头像 发表于 11-27 11:46 210次阅读
    AWTK-WEB 快速入门(1) - <b class='flag-5'>C</b> <b class='flag-5'>语言</b>应用程序

    技术干货驿站 ▏深入理解C语言:掌握C语言条件判断,从if到switch的应用

    在编程中,条件判断语句是控制程序流程的核心元素之一。它们使得程序能够根据不同的输入和状态,做出相应的决策。特别是在C语言中,条件判断语句的使用极为广泛,涵盖了从简单的if语句到更复杂的
    的头像 发表于 11-09 01:10 323次阅读
    技术干货驿站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:掌握<b class='flag-5'>C</b><b class='flag-5'>语言</b>条件<b class='flag-5'>判断</b>,从if到switch的应用

    贴片滤波器极性方向怎么判断

    贴片滤波器是一种广泛应用于电子威廉希尔官方网站 中的元件,用于抑制或滤除不需要的频率信号,保证威廉希尔官方网站 的正常工作。在贴片滤波器的使用过程中,极性方向判断是非常重要的,因为它直接影响到滤波器的性能和威廉希尔官方网站 的稳定性。 一
    的头像 发表于 08-25 16:02 644次阅读

    通电线圈怎么判断磁场方向

    通电线圈产生的磁场方向可以通过右手定则来判断。右手定则是电磁学中一个非常重要的定则,它可以用来判断电流、磁场和力之间的关系。 一、右手定则的基本原理 右手定则的定义:右手定则是一个用于判断
    的头像 发表于 08-21 10:21 2338次阅读

    负电荷受洛伦兹力的方向怎么判断

    量、速度以及磁场的强度和方向。 对于负电荷,洛伦兹力的方向可以通过左手定则来判断。左手定则是电磁学中常用的一种判断力的方向的方法,它适用于洛
    的头像 发表于 07-29 16:57 1776次阅读

    场效应管的电流方向怎么判断

    场效应管(Field Effect Transistor,简称FET)的电流方向判断,主要依据其类型(N沟道或P沟道)以及源极(S)、漏极(D)和栅极(G)之间的相对位置和工作原理。
    的头像 发表于 07-23 11:50 2512次阅读

    霍尔元件怎么判断电势高低

    霍尔元件是一种基于霍尔效应的传感器,能够将磁信号转换为电信号。在许多应用中,我们需要根据霍尔元件产生的电势高低来判断磁场的强度和方向
    的头像 发表于 05-22 17:26 1984次阅读

    fpga是c语言还是verilog

    FPGA(现场可编程逻辑门阵列)开发主要使用的编程语言是硬件描述语言(HDL),其中Verilog是最常用的编程语言之一。而C语言通常用于传
    的头像 发表于 03-27 14:38 2003次阅读

    C语言内存泄漏问题原理

    内存泄漏问题只有在使用堆内存的时候才会出现,内存不存在内存泄漏问题,因为内存会自动分配和释放。C语言代码中堆内存的申请函数是malloc。
    发表于 03-19 11:38 527次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>内存泄漏问题原理

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

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

    线圈磁场方向判断方法什么符号表示

    线圈是电磁器件中广泛应用的一种结构,其具有产生磁场的功能。在实际应用中,了解线圈磁场的方向对于设计、运用和分析威廉希尔官方网站 非常重要。本文将判断线圈磁场方向的方法,即右手定则,并探讨其应用。 第一节:线圈磁场
    的头像 发表于 02-25 17:16 4855次阅读

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

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

    c语言,c++,java,python区别

    C语言C++、Java和Python是四种常见的编程语言,各有优点和特点。 C语言
    的头像 发表于 02-05 14:11 2390次阅读

    鸿蒙开发什么语言

    两种开发方向 我们常说鸿蒙开发,但是其实鸿蒙开发分为两个方向: 一个是系统级别的开发,比如驱动,内核和框架层的开发,这种开发以C/C++为主 还有一个是应用级别的开发,在API7以及以
    的头像 发表于 01-30 16:12 1545次阅读
    鸿蒙开发<b class='flag-5'>用</b>什么<b class='flag-5'>语言</b>?

    C语言能够实现单片机功能,为什么还要使用汇编

    C语言能够实现单片机功能,为什么还要使用汇编C语言是一种高级编程语言,它具有跨平台、可移植
    的头像 发表于 01-15 14:59 1062次阅读