0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用C語(yǔ)言如何判斷棧的增長(zhǎng)方向呢

冬至配餃子 ? 來(lái)源:最后一個(gè)bug ? 作者:bug菌 ? 2022-07-28 11:23 ? 次閱讀

在學(xué)?;蛘吒鞣N編程類書本上,基本上都會(huì)看到一句話:"函數(shù)是程序的基本組成單位",可以說(shuō)理解函數(shù)對(duì)編程是非常重要的,與函數(shù)調(diào)用緊密結(jié)合的機(jī)制就是函數(shù)調(diào)用棧了,而棧有一個(gè)特別的屬性就是棧的增長(zhǎng)方向問(wèn)題了,也發(fā)現(xiàn)一些多年編程經(jīng)驗(yàn)的朋友對(duì)這一塊都有點(diǎn)迷迷糊糊的。在閱讀RTOS源碼的時(shí)候也會(huì)經(jīng)??吹綏5脑鲩L(zhǎng)方向配置項(xiàng)目,那么今天就帶大家了解一下棧的增長(zhǎng)方向到底是咋回事。

1、棧的增長(zhǎng)方向

首先我們要明確的是棧同樣也是分布在我們的內(nèi)存之中,而內(nèi)存是通過(guò)地址來(lái)進(jìn)行編排訪問(wèn)的,如下是堆棧的示意圖:

poYBAGLiAHuAAbKkAABnWFxTtuQ560.png

對(duì)于堆棧而言原本并沒有方向一說(shuō),只有入棧和出棧一說(shuō),程序中執(zhí)行push指令則棧頂向上移動(dòng),執(zhí)行pop指令則棧頂向下移動(dòng),其僅僅只是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),增長(zhǎng)方向都是從棧底向棧頂方向移動(dòng),即分配數(shù)據(jù)的過(guò)程。

而我們平時(shí)所說(shuō)的棧的增長(zhǎng)方向又是怎么回事呢?

為了在內(nèi)存中分配一段內(nèi)存給堆棧,我們必須要區(qū)分堆棧相對(duì)于內(nèi)存的地址而言的方向性,通常棧頂增長(zhǎng)的方向是從內(nèi)存的低地址向高地址變化,我們則稱為向上增長(zhǎng);反之則向下增長(zhǎng)。

所謂"水往高處流,即向上增長(zhǎng)",這樣應(yīng)該就很好記憶了。

2、有什么用?

當(dāng)了解處理器中棧指針的增長(zhǎng)方向以后,我們?cè)赿ebug程序的時(shí)候才能真正的把控程序的運(yùn)行過(guò)程。

在移植RTOS的過(guò)程中我們都需要對(duì)每個(gè)任務(wù)的堆棧分配一個(gè)合適的連續(xù)內(nèi)存區(qū)域來(lái)使用,此時(shí)初始狀態(tài)堆棧指針指向什么位置就跟堆棧的增長(zhǎng)方向密切相關(guān),有過(guò)RTOS移植經(jīng)驗(yàn)的朋友應(yīng)該都有在RTOS配置項(xiàng)中關(guān)注過(guò)這塊的選擇。

RTOS在任務(wù)初始化的時(shí)候,其堆棧指針應(yīng)該指向其棧底位置,那么對(duì)于堆棧向上增長(zhǎng),任務(wù)初始化的時(shí)候我們需要把堆棧指針設(shè)置在所分配內(nèi)存的低地址內(nèi)存處,反之則設(shè)置到高地址處。

poYBAGLiAKKAFXH2AABy3437hcQ779.png

設(shè)置好以后,其在堆棧分配的過(guò)程中才會(huì)朝著所分配的內(nèi)存區(qū)域中,否則就會(huì)堆棧反向自爆,導(dǎo)致程序異常;如果你的堆棧分配不合理,同樣了解堆棧變化方向后也變得有跡可循。

同樣在裸機(jī)程序中也需要了解一下處理器的堆棧變化方向,從而用來(lái)排查一些堆棧溢出所導(dǎo)致的程序異常問(wèn)題。

3、用C語(yǔ)言如何判斷?

要了解一個(gè)CPU的堆棧的變換方向,一方面就是查詢相應(yīng)的芯片參考手冊(cè),另外一方面就是實(shí)際測(cè)試了。

畢竟堆棧也就是內(nèi)存,自然就可以通過(guò)堆棧的分配過(guò)程取出所分配的內(nèi)存地址來(lái)比較判斷,而C語(yǔ)言可以方便的訪問(wèn)內(nèi)存,也就比較容易判斷當(dāng)前處理器中堆棧指針的增長(zhǎng)方向了。

那還不簡(jiǎn)單,直接在函數(shù)內(nèi)部先后定義兩個(gè)局部變量,直接比較兩個(gè)變量的地址大小不就搞定了嗎?其實(shí)這種方式是依賴于編譯器實(shí)現(xiàn)的,畢竟哪個(gè)變量先進(jìn)行內(nèi)存申請(qǐng),并沒有太大的影響。

那么是否有一種方法不依賴于編譯器實(shí)現(xiàn)呢?

必須有的,那就是函數(shù)調(diào)用棧了,因?yàn)橄日{(diào)用的函數(shù)必然首先入棧。

基于這樣的思想,這里bug菌寫一個(gè)判斷堆棧增長(zhǎng)方向的demo供大家參考:

poYBAGLiAMmAOSP7AAD6dMwwGvQ386.pngpoYBAGLiAM2ABykAAACdf-nzKFc394.png

可以拿去試一試,看看你的芯片堆棧咋變化的~


審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19384

    瀏覽量

    230512
  • 芯片
    +關(guān)注

    關(guān)注

    456

    文章

    51037

    瀏覽量

    425503
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7614

    瀏覽量

    137261
  • RTOS
    +關(guān)注

    關(guān)注

    22

    文章

    817

    瀏覽量

    119769
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    EE-33:C語(yǔ)言對(duì)ADSP-21xx定時(shí)器進(jìn)行編程

    電子發(fā)燒友網(wǎng)站提供《EE-33:C語(yǔ)言對(duì)ADSP-21xx定時(shí)器進(jìn)行編程.pdf》資料免費(fèi)下載
    發(fā)表于 01-15 15:46 ?0次下載
    EE-33:<b class='flag-5'>用</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>對(duì)ADSP-21xx定時(shí)器進(jìn)行編程

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

    導(dǎo)讀AWTK可以使用相同的技術(shù)開發(fā)各種平臺(tái)的應(yīng)用程序。有時(shí)我們需要使用Web界面與設(shè)備進(jìn)行交互,本文介紹一下如何使用C語(yǔ)言開發(fā)AWTK-WEB應(yīng)用程序。AWTKDesigner新建
    的頭像 發(fā)表于 11-27 11:46 ?253次閱讀
    AWTK-WEB 快速入門(1) - <b class='flag-5'>C</b> <b class='flag-5'>語(yǔ)言</b>應(yīng)用程序

    技術(shù)干貨驛站 ▏深入理解C語(yǔ)言:掌握C語(yǔ)言條件判斷,從if到switch的應(yīng)用

    在編程中,條件判斷語(yǔ)句是控制程序流程的核心元素之一。它們使得程序能夠根據(jù)不同的輸入和狀態(tài),做出相應(yīng)的決策。特別是在C語(yǔ)言中,條件判斷語(yǔ)句的使用極為廣泛,涵蓋了從簡(jiǎn)單的if語(yǔ)句到更復(fù)雜的
    的頭像 發(fā)表于 11-09 01:10 ?399次閱讀
    技術(shù)干貨驛站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>:掌握<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>條件<b class='flag-5'>判斷</b>,從if到switch的應(yīng)用

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

    貼片濾波器是一種廣泛應(yīng)用于電子電路中的元件,用于抑制或?yàn)V除不需要的頻率信號(hào),保證電路的正常工作。在貼片濾波器的使用過(guò)程中,極性方向判斷是非常重要的,因?yàn)樗苯佑绊懙綖V波器的性能和電路的穩(wěn)定性。 一
    的頭像 發(fā)表于 08-25 16:02 ?755次閱讀

    通電線圈怎么判斷磁場(chǎng)方向

    通電線圈產(chǎn)生的磁場(chǎng)方向可以通過(guò)右手定則來(lái)判斷。右手定則是電磁學(xué)中一個(gè)非常重要的定則,它可以用來(lái)判斷電流、磁場(chǎng)和力之間的關(guān)系。 一、右手定則的基本原理 右手定則的定義:右手定則是一個(gè)用于判斷
    的頭像 發(fā)表于 08-21 10:21 ?2941次閱讀

    負(fù)電荷受洛倫茲力的方向怎么判斷

    量、速度以及磁場(chǎng)的強(qiáng)度和方向。 對(duì)于負(fù)電荷,洛倫茲力的方向可以通過(guò)左手定則來(lái)判斷。左手定則是電磁學(xué)中常用的一種判斷力的方向的方法,它適用于洛
    的頭像 發(fā)表于 07-29 16:57 ?2253次閱讀

    場(chǎng)效應(yīng)管的電流方向怎么判斷

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

    霍爾元件怎么判斷電勢(shì)高低?

    霍爾元件是一種基于霍爾效應(yīng)的傳感器,能夠?qū)⒋判盘?hào)轉(zhuǎn)換為電信號(hào)。在許多應(yīng)用中,我們需要根據(jù)霍爾元件產(chǎn)生的電勢(shì)高低來(lái)判斷磁場(chǎng)的強(qiáng)度和方向。
    的頭像 發(fā)表于 05-22 17:26 ?2355次閱讀

    fpga是c語(yǔ)言還是verilog

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

    C語(yǔ)言內(nèi)存泄漏問(wèn)題原理

    內(nèi)存泄漏問(wèn)題只有在使用堆內(nèi)存的時(shí)候才會(huì)出現(xiàn),內(nèi)存不存在內(nèi)存泄漏問(wèn)題,因?yàn)?b class='flag-5'>棧內(nèi)存會(huì)自動(dòng)分配和釋放。C語(yǔ)言代碼中堆內(nèi)存的申請(qǐng)函數(shù)是malloc。
    發(fā)表于 03-19 11:38 ?557次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>內(nèi)存泄漏問(wèn)題原理

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

    柔性電流探頭是一種用于測(cè)量電流的設(shè)備,其特點(diǎn)是能夠彎曲和扭轉(zhuǎn)以適應(yīng)不同的測(cè)量場(chǎng)景。在使用柔性電流探頭時(shí),正確判斷方向非常重要,因?yàn)?b class='flag-5'>方向錯(cuò)誤可能導(dǎo)致測(cè)量結(jié)果的偏差。以下是柔性電流探頭方向
    的頭像 發(fā)表于 03-11 13:33 ?428次閱讀
    柔性電流探頭<b class='flag-5'>方向</b><b class='flag-5'>判斷</b>的方法

    線圈磁場(chǎng)方向判斷方法什么符號(hào)表示

    線圈是電磁器件中廣泛應(yīng)用的一種結(jié)構(gòu),其具有產(chǎn)生磁場(chǎng)的功能。在實(shí)際應(yīng)用中,了解線圈磁場(chǎng)的方向對(duì)于設(shè)計(jì)、運(yùn)用和分析電路非常重要。本文將判斷線圈磁場(chǎng)方向的方法,即右手定則,并探討其應(yīng)用。 第一節(jié):線圈磁場(chǎng)
    的頭像 發(fā)表于 02-25 17:16 ?5230次閱讀

    線圈磁場(chǎng)方向判斷方法什么定則

    線圈磁場(chǎng)方向判斷可以利用右手螺旋定則。該定則是由法國(guó)物理學(xué)家安德烈-瑪麗·安培(Andre-Marie Ampere)于19世紀(jì)提出的。 右手螺旋定則是一種用于判斷電流所產(chǎn)生的磁場(chǎng)的方向
    的頭像 發(fā)表于 02-25 17:07 ?6247次閱讀

    c語(yǔ)言,c++,java,python區(qū)別

    C語(yǔ)言、C++、Java和Python是四種常見的編程語(yǔ)言,各有優(yōu)點(diǎn)和特點(diǎn)。 C語(yǔ)言
    的頭像 發(fā)表于 02-05 14:11 ?2508次閱讀

    鴻蒙開發(fā)什么語(yǔ)言?

    兩種開發(fā)方向 我們常說(shuō)鴻蒙開發(fā),但是其實(shí)鴻蒙開發(fā)分為兩個(gè)方向: 一個(gè)是系統(tǒng)級(jí)別的開發(fā),比如驅(qū)動(dòng),內(nèi)核和框架層的開發(fā),這種開發(fā)以C/C++為主 還有一個(gè)是應(yīng)用級(jí)別的開發(fā),在API7以及以
    的頭像 發(fā)表于 01-30 16:12 ?1598次閱讀
    鴻蒙開發(fā)<b class='flag-5'>用</b>什么<b class='flag-5'>語(yǔ)言</b>?