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

    文章

    19155

    浏览量

    229049
  • 芯片
    +关注

    关注

    453

    文章

    50360

    浏览量

    421638
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136120
  • RTOS
    +关注

    关注

    21

    文章

    809

    浏览量

    119410
收藏 人收藏

    评论

    相关推荐

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

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

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

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

    fpga是c语言还是verilog

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

    C语言内存泄漏问题原理

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

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

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

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

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

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

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

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

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

    如何判断编码器的方向

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

    如何判断电动势的方向

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

    怎么判断霍尔元件的类型

    怎么判断霍尔元件的类型? 霍尔元件是一种常用的传感器元件,用于测量电流、磁场、位置等物理量。根据其工作原理和性质的不同,可以将霍尔元件分为多种类型。本文将详细介绍并解释这些类型,以帮助读者了解
    的头像 发表于 12-18 14:56 1520次阅读

    C语言的短路现象

    a || b || c 只要a为真(非0)就不必判断b和c;只有a为假,才需要判断b的值;只有a和b都为假,才有必要判断
    的头像 发表于 12-07 12:20 613次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>的短路现象

    如何在Saber中使用C语言进行建模

    Saber不仅支持MAST语言和VHDL‐AMS语言建立模型,也支持C语言建立器件模型,这对熟悉C语言
    的头像 发表于 12-05 11:30 1084次阅读
    如何在Saber中使用<b class='flag-5'>C</b><b class='flag-5'>语言</b>进行建模<b class='flag-5'>呢</b>?

    \0在c语言中怎么

    C语言是一种广泛使用的程序设计语言,具有高效、简洁和可移植等特点。本文将详尽介绍C语言的基本语法、数据类型、控制结构、函数及库函数等内容,以
    的头像 发表于 11-24 09:59 3004次阅读