吴忠躺衫网络科技有限公司

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

    文章

    19409

    瀏覽量

    231205
  • 芯片
    +關注

    關注

    456

    文章

    51192

    瀏覽量

    427324
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137736
  • RTOS
    +關注

    關注

    22

    文章

    819

    瀏覽量

    119890
收藏 人收藏

    評論

    相關推薦

    EE-33:C語言對ADSP-21xx定時器進行編程

    電子發燒友網站提供《EE-33:C語言對ADSP-21xx定時器進行編程.pdf》資料免費下載
    發表于 01-15 15:46 ?0次下載
    EE-33:<b class='flag-5'>用</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>對ADSP-21xx定時器進行編程

    AWTK-WEB 快速入門(1) - C 語言應用程序

    導讀AWTK可以使用相同的技術開發各種平臺的應用程序。有時我們需要使用Web界面與設備進行交互,本文介紹一下如何使用C語言開發AWTK-WEB應用程序。AWTKDesigner新建
    的頭像 發表于 11-27 11:46 ?294次閱讀
    AWTK-WEB 快速入門(1) - <b class='flag-5'>C</b> <b class='flag-5'>語言</b>應用程序

    技術干貨驛站 ▏深入理解C語言:掌握C語言條件判斷,從if到switch的應用

    在編程中,條件判斷語句是控制程序流程的核心元素之一。它們使得程序能夠根據不同的輸入和狀態,做出相應的決策。特別是在C語言中,條件判斷語句的使用極為廣泛,涵蓋了從簡單的if語句到更復雜的
    的頭像 發表于 11-09 01:10 ?434次閱讀
    技術干貨驛站 ▏深入理解<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的應用

    C語言與Java語言的對比

    C語言和Java語言都是當前編程領域中的重要成員,它們各自具有獨特的優勢和特點,適用于不同的應用場景。以下將從語法特性、內存管理、跨平臺性、性能、應用領域等多個方面對C
    的頭像 發表于 10-29 17:31 ?440次閱讀

    貼片濾波器極性方向怎么判斷

    貼片濾波器是一種廣泛應用于電子電路中的元件,用于抑制或濾除不需要的頻率信號,保證電路的正常工作。在貼片濾波器的使用過程中,極性方向判斷是非常重要的,因為它直接影響到濾波器的性能和電路的穩定性。 一
    的頭像 發表于 08-25 16:02 ?800次閱讀

    通電線圈怎么判斷磁場方向

    通電線圈產生的磁場方向可以通過右手定則來判斷。右手定則是電磁學中一個非常重要的定則,它可以用來判斷電流、磁場和力之間的關系。 一、右手定則的基本原理 右手定則的定義:右手定則是一個用于判斷
    的頭像 發表于 08-21 10:21 ?3319次閱讀

    負電荷受洛倫茲力的方向怎么判斷

    量、速度以及磁場的強度和方向。 對于負電荷,洛倫茲力的方向可以通過左手定則來判斷。左手定則是電磁學中常用的一種判斷力的方向的方法,它適用于洛
    的頭像 發表于 07-29 16:57 ?2537次閱讀

    場效應管的電流方向怎么判斷

    場效應管(Field Effect Transistor,簡稱FET)的電流方向判斷,主要依據其類型(N溝道或P溝道)以及源極(S)、漏極(D)和柵極(G)之間的相對位置和工作原理。
    的頭像 發表于 07-23 11:50 ?3049次閱讀

    霍爾元件怎么判斷電勢高低

    霍爾元件是一種基于霍爾效應的傳感器,能夠將磁信號轉換為電信號。在許多應用中,我們需要根據霍爾元件產生的電勢高低來判斷磁場的強度和方向
    的頭像 發表于 05-22 17:26 ?2549次閱讀

    fpga是c語言還是verilog

    FPGA(現場可編程邏輯門陣列)開發主要使用的編程語言是硬件描述語言(HDL),其中Verilog是最常用的編程語言之一。而C語言通常用于傳
    的頭像 發表于 03-27 14:38 ?2176次閱讀

    C語言內存泄漏問題原理

    內存泄漏問題只有在使用堆內存的時候才會出現,內存不存在內存泄漏問題,因為內存會自動分配和釋放。C語言代碼中堆內存的申請函數是malloc。
    發表于 03-19 11:38 ?577次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>內存泄漏問題原理

    fpga的是什么編程語言 fpga什么語言開發

    fpga的是什么編程語言 FPGA(現場可編程邏輯門陣列)主要使用的編程語言是硬件描述語言(HDL)。在眾多的HDL中,Verilog HDL和VHDL是最常用的兩種。 Verilo
    的頭像 發表于 03-14 17:09 ?3635次閱讀

    柔性電流探頭方向判斷的方法

    柔性電流探頭是一種用于測量電流的設備,其特點是能夠彎曲和扭轉以適應不同的測量場景。在使用柔性電流探頭時,正確判斷方向非常重要,因為方向錯誤可能導致測量結果的偏差。以下是柔性電流探頭方向
    的頭像 發表于 03-11 13:33 ?460次閱讀
    柔性電流探頭<b class='flag-5'>方向</b><b class='flag-5'>判斷</b>的方法

    線圈磁場方向判斷方法什么符號表示

    線圈是電磁器件中廣泛應用的一種結構,其具有產生磁場的功能。在實際應用中,了解線圈磁場的方向對于設計、運用和分析電路非常重要。本文將判斷線圈磁場方向的方法,即右手定則,并探討其應用。 第一節:線圈磁場
    的頭像 發表于 02-25 17:16 ?5476次閱讀

    線圈磁場方向判斷方法什么定則

    線圈磁場方向判斷可以利用右手螺旋定則。該定則是由法國物理學家安德烈-瑪麗·安培(Andre-Marie Ampere)于19世紀提出的。 右手螺旋定則是一種用于判斷電流所產生的磁場的方向
    的頭像 發表于 02-25 17:07 ?6556次閱讀
    大发888代充平台| 大发888娱乐场 b8| 太阳城百家乐官网怎么出千| 玩百家乐去哪个娱乐城最安全| 网上最好赌博网站| 百家乐tt娱乐场开户注册| 伟博百家乐官网娱乐城| 锦屏县| 试玩百家乐代理| 丽景湾百家乐官网的玩法技巧和规则| 巴中市| 威尼斯人娱乐场图片| 百家乐如何写路| 狮威百家乐官网娱乐| 万博88| 手机棋牌游戏平台| 百家乐视频游365| 网络百家乐官网的玩法技巧和规则 | 大发888 dafa888 octbay| 属鼠做生意办公桌摆貔貅好不好 | 顶尖百家乐学习| 米其林百家乐官网的玩法技巧和规则 | 聚宝盆百家乐官网的玩法技巧和规则 | 百家乐官网怎么赢博彩正网| 威尼斯人娱乐平台注册网址| 百家乐娱乐网送68元| 百家乐官网倍投软件| 赌王百家乐官网的玩法技巧和规则| 百家乐官网娱乐分析软件v4.0| 澳门百家乐官网怎赌才能赚钱| 利来| 吉林省| 百家乐官网账号变动原因| 在线百家乐官网平台| 网上百家乐官网赌钱| 大发888网页在线游戏| 网上现金棋牌游戏| 大发888在线登陆| 樱桃木百家乐桌| 太阳城百家乐筹码租| 百家乐赌博玩法技巧|