在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

用C語言如何判斷棧的增長方向呢

冬至配餃子 ? 來源:最后一個bug ? 作者:bug菌 ? 2022-07-28 11:23 ? 次閱讀

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

1、棧的增長方向

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

poYBAGLiAHuAAbKkAABnWFxTtuQ560.png

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

而我們平時所說的棧的增長方向又是怎么回事呢?

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

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

2、有什么用?

當(dāng)了解處理器中棧指針的增長方向以后,我們在debug程序的時候才能真正的把控程序的運(yùn)行過程。

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

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

poYBAGLiAKKAFXH2AABy3437hcQ779.png

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

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

3、用C語言如何判斷?

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

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

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

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

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

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

poYBAGLiAMmAOSP7AAD6dMwwGvQ386.pngpoYBAGLiAM2ABykAAACdf-nzKFc394.png

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


審核編輯:劉清

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

    關(guān)注

    68

    文章

    19714

    瀏覽量

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

    關(guān)注

    459

    文章

    51893

    瀏覽量

    433305
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7626

    瀏覽量

    139590
  • RTOS
    +關(guān)注

    關(guān)注

    24

    文章

    836

    瀏覽量

    120542
收藏 人收藏

    評論

    相關(guān)推薦

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

    電子發(fā)燒友網(wǎng)站提供《EE-33:C語言對ADSP-21xx定時器進(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'>語言</b>對ADSP-21xx定時器進(jìn)行編程

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

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

    使用C語言實(shí)現(xiàn)函數(shù)模板

      C語言能不能實(shí)現(xiàn)一個通用的函數(shù),既能完成整數(shù)的相加,又能完成浮點(diǎn)數(shù)的相加?
    的頭像 發(fā)表于 11-09 11:38 ?727次閱讀

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

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

    C語言與Java語言的對比

    C語言和Java語言都是當(dāng)前編程領(lǐng)域中的重要成員,它們各自具有獨(dú)特的優(yōu)勢和特點(diǎn),適用于不同的應(yīng)用場景。以下將從語法特性、內(nèi)存管理、跨平臺性、性能、應(yīng)用領(lǐng)域等多個方面對C
    的頭像 發(fā)表于 10-29 17:31 ?806次閱讀

    C語言中最常見的宏定義寫法

    如果讓你C語言寫個宏定義,我相信大部分同學(xué)順手就能寫出define。
    的頭像 發(fā)表于 10-28 11:12 ?630次閱讀

    楞次定律怎么用手判斷 楞次定律怎么判斷感應(yīng)電流方向

    楞次定律是電磁感應(yīng)定律的一個重要部分,它描述了感應(yīng)電動勢和感應(yīng)電流的產(chǎn)生方向。在理解和應(yīng)用楞次定律時,我們可以借助右手定則來判斷感應(yīng)電流的方向。 一、楞次定律的基本概念 楞次定律指出,感應(yīng)電流具有
    的頭像 發(fā)表于 10-17 18:03 ?3318次閱讀

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

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

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

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

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

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

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

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

    線圈的感應(yīng)電動勢方向怎么判斷

    法拉第電磁感應(yīng)定律是電磁感應(yīng)現(xiàn)象的基礎(chǔ)。它描述了變化的磁場在導(dǎo)體回路中產(chǎn)生電動勢的現(xiàn)象。 楞次定律 楞次定律是判斷感應(yīng)電動勢方向的另一個重要定律。它指出,感應(yīng)電流的方向總是試圖抵消引起它的磁場變化。楞次定律可以
    的頭像 發(fā)表于 07-18 17:06 ?5033次閱讀

    PLC編程語言C語言的區(qū)別

    在工業(yè)自動化和計算機(jī)編程領(lǐng)域中,PLC(可編程邏輯控制器)編程語言C語言各自扮演著重要的角色。盡管兩者都是編程語言,但它們在多個方面存在顯著的區(qū)別。本文將從多個維度深入探討PLC編程
    的頭像 發(fā)表于 06-14 17:11 ?4157次閱讀

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

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

    AWTK 開源串口屏開發(fā)(18) - C 語言自定義命令

    如果AWTK-HMI內(nèi)置模型無法滿足需求,可以使用C語言來擴(kuò)展默認(rèn)模型。本文通過一個簡單的例子,介紹一下C語言擴(kuò)展默認(rèn)模型的方法。AWTK
    的頭像 發(fā)表于 05-11 08:24 ?606次閱讀
    AWTK 開源串口屏開發(fā)(18) - <b class='flag-5'>用</b> <b class='flag-5'>C</b> <b class='flag-5'>語言</b>自定義命令
    主站蜘蛛池模板: 亚洲成a人片在线网站 | 亚洲色图 第一页 | 亚洲精品中文字幕乱码三区一二 | 午夜影院色 | 国产精品久久久久久久牛牛 | 免费大片黄在线观看 | 91日韩精品天海翼在线观看 | 亚洲产国偷v产偷v自拍色戒 | 最新版资源在线天堂 | 在线中文天堂 | 欧美视频一区二区三区四区 | 色综合视频一区二区三区 | 欧美成人eee在线 | 天天操夜操 | 午夜一级毛片不卡 | 天天爽夜夜爽人人爽免费 | 免费番茄社区性色大片 | 午夜看大片| 夜夜操天天操 | 久久久久女人精品毛片九一 | 免费看污视频的网站 | 黄色网址 在线播放 | 给我一个可以看片的www日本 | 日本欧美一区二区三区不卡视频 | 夜夜骑夜夜操 | 人与牲动交xxxxbbbb高清 | 久久精品综合 | 欧美午夜精品一区二区三区 | 亚洲高清一区二区三区四区 | 天堂中文最新版www 天堂资源8中文最新版在线 | ts国产| 一区二区三区在线看 | 美女视频黄视大全视频免费网址 | 色噜噜狠狠色综合欧洲selulu | 婷婷6月 | 国产精品久久久久久久免费 | videosex久久麻豆 | 深夜动态福利gif动态进 | 日韩毛片网 | 最新激情网站 | 福利你懂的 |