哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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編程類書(shū)本上,基本上都會(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ì)于堆棧而言原本并沒(méi)有方向一說(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),并沒(méi)有太大的影響。

那么是否有一種方法不依賴于編譯器實(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

    文章

    20329

    瀏覽量

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

    關(guān)注

    463

    文章

    54410

    瀏覽量

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

    關(guān)注

    183

    文章

    7646

    瀏覽量

    146122
  • RTOS
    +關(guān)注

    關(guān)注

    25

    文章

    869

    瀏覽量

    123208
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Vibe Coding AI全開(kāi)發(fā)實(shí)戰(zhàn)

    開(kāi)發(fā)模式,開(kāi)發(fā)者在數(shù)周內(nèi)就完成了從需求定義到系統(tǒng)上線的全過(guò)程。具體流程如下: 需求定義 :“用戶故事地圖”對(duì)齊認(rèn)知,明確業(yè)務(wù)目標(biāo)、用戶角色和核心場(chǎng)景。 技術(shù)選型 :AI根據(jù)需求推薦合適的技術(shù)
    發(fā)表于 04-15 16:02

    C語(yǔ)言主要特點(diǎn)

    指針類型數(shù)據(jù),使用十分靈活和多樣化,能用來(lái)實(shí)現(xiàn)各種復(fù)雜的數(shù)據(jù)結(jié)構(gòu)(如鏈表、樹(shù)、等)的運(yùn)算。 4.具有結(jié)構(gòu)化的控制語(yǔ)句。函數(shù)作為程序的模塊單位,便于實(shí)現(xiàn)程序的模塊化。C語(yǔ)言是完全模塊
    發(fā)表于 01-05 07:41

    單片機(jī)c語(yǔ)言中定義字節(jié)怎么定義?

    定義位可以***it但是定義字節(jié)?還有就是比如匯編中的DPTR的DPH和DPL在c語(yǔ)言中怎樣定義的?
    發(fā)表于 12-29 06:32

    嵌入式C語(yǔ)言中各變量存儲(chǔ)位置

    C語(yǔ)言的程序中,對(duì)變量的使用還有以下幾點(diǎn)需要注意 1. 體中定義的變量通常是在上,不需要在程序中進(jìn)行管理,由編繹器處理。 2. malloc,calloc,realloc等分配內(nèi)
    發(fā)表于 12-25 07:54

    如何用好 C 語(yǔ)言函數(shù)的返回值?

    的重點(diǎn),本文更關(guān)心的是,該以何值表示“成功”,何值表示“失敗”。 按照C語(yǔ)言語(yǔ)法, 0 表示假,非零(常常用 1)表示真,那是否函數(shù)也 0 返回值表示“失敗”,1 返回值表示“成功”
    發(fā)表于 12-25 07:17

    IPv6 Only 進(jìn)入倒計(jì)時(shí) ,單替代雙成網(wǎng)絡(luò)演進(jìn)必然選擇

    2025年末,中國(guó)工程院院士鄔賀銓在“2026ICT行業(yè)趨勢(shì)年會(huì)”上強(qiáng)調(diào)“雙是過(guò)去的妥協(xié),IPv6Only才是未來(lái)的必然”,這一判斷精準(zhǔn)點(diǎn)出了全球網(wǎng)絡(luò)協(xié)議演進(jìn)的核心方向。隨著技術(shù)兼容方案成熟、政策
    的頭像 發(fā)表于 12-23 09:59 ?1703次閱讀
    IPv6 Only 進(jìn)入倒計(jì)時(shí) ,單<b class='flag-5'>棧</b>替代雙<b class='flag-5'>棧</b>成網(wǎng)絡(luò)演進(jìn)必然選擇

    單片機(jī)C語(yǔ)言的誤區(qū)介紹

    忽視了,否則怎么是注釋? 2、for循環(huán)和蝸牛代碼意義一樣,for循環(huán)匯編以后和和你不用for循環(huán)把代碼笨辦法依次寫出來(lái)效果一樣,不妨試試,弄個(gè)for循環(huán)依次點(diǎn)亮8led燈,然后再用笨辦法寫8行代碼,依次點(diǎn)亮8
    發(fā)表于 12-22 12:45

    Stack到底用來(lái)干嘛的?

    我們?cè)诤瘮?shù)的局部變量、數(shù)組這些不能超過(guò)1K(含嵌套的函數(shù)),否則程序就會(huì)崩潰進(jìn)入hardfaul。 除了這些局部變量以外,還有一些實(shí)時(shí)操作系統(tǒng)的現(xiàn)場(chǎng)保護(hù)、返回地址都是存儲(chǔ)在里面。 還有一點(diǎn)題外話,就是增長(zhǎng)方向是從高地址到低
    發(fā)表于 12-01 08:04

    C語(yǔ)言程序的結(jié)構(gòu)

    ,87LPC764有4KB的Flash ROM,而筆者的程序量只有2KB多點(diǎn),因而第一個(gè)想法是改用C語(yǔ)言作為主要的開(kāi)發(fā)語(yǔ)言,應(yīng)該不至于導(dǎo)致代碼空間不夠用。其次,考慮到需要定時(shí)功能的模塊(或稱任務(wù),以下統(tǒng)稱任務(wù)
    發(fā)表于 11-26 08:12

    C語(yǔ)言特性

    數(shù)據(jù),實(shí)現(xiàn)對(duì)設(shè)備的精準(zhǔn)控制,同時(shí)降低功耗,延長(zhǎng)設(shè)備的使用壽命。 2、可移植性:跨平臺(tái)的通行證 C 語(yǔ)言具有良好的可移植性,這意味著 C 語(yǔ)言
    發(fā)表于 11-24 07:01

    C語(yǔ)言在嵌入式開(kāi)發(fā)中的應(yīng)用

    發(fā)動(dòng)機(jī)的最佳性能和燃油經(jīng)濟(jì)性。C 語(yǔ)言的高效性和對(duì)硬件的直接操作能力,使得它能夠滿足 ECU 對(duì)實(shí)時(shí)性和精確性的嚴(yán)格要求。據(jù)統(tǒng)計(jì),全球超過(guò) 80% 的汽車 ECU 軟件都是 C
    發(fā)表于 11-21 08:09

    2025年最佳的嵌入式編程語(yǔ)言有哪些?

    語(yǔ)言有哪些?今天我們將討論這些語(yǔ)言C、C++、Rust、Python和生成式AI提示;以及它們?cè)诋?dāng)今的現(xiàn)代系統(tǒng)中的使用方式。資料來(lái)源:T
    的頭像 發(fā)表于 11-14 10:27 ?1756次閱讀
    2025年最佳的嵌入式編程<b class='flag-5'>語(yǔ)言</b>有哪些<b class='flag-5'>呢</b>?

    C語(yǔ)言和單片機(jī)C語(yǔ)言有什么差異

    單片機(jī)c語(yǔ)言相對(duì)于普通C語(yǔ)言增加了一些基本的指令,還有變量的賦值是16進(jìn)制,當(dāng)然單片機(jī)c語(yǔ)言只牽
    發(fā)表于 11-14 07:55

    怎么判斷我現(xiàn)在用的是外部時(shí)鐘還是內(nèi)部時(shí)鐘?

    在用i2c或者其他通訊協(xié)議的時(shí)候,都要去cubemx移植代碼過(guò)來(lái),我怎么判斷我現(xiàn)在用的是外部時(shí)鐘還是內(nèi)部時(shí)鐘
    發(fā)表于 09-28 15:21

    深入理解C語(yǔ)言C語(yǔ)言循環(huán)控制

    C語(yǔ)言編程中,循環(huán)結(jié)構(gòu)是至關(guān)重要的,它可以讓程序重復(fù)執(zhí)行特定的代碼塊,從而提高編程效率。然而,為了避免程序進(jìn)入無(wú)限循環(huán),C語(yǔ)言提供了多種循環(huán)控制語(yǔ)句,如break、continue和
    的頭像 發(fā)表于 04-29 18:49 ?2209次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>:<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>循環(huán)控制
    普宁市| 武汉市| 芒康县| 鲜城| 双江| 前郭尔| 汾西县| 阿合奇县| 荃湾区| 天水市| 定西市| 江孜县| 延津县| 苏尼特右旗| 申扎县| 翁源县| 德惠市| 陇西县| 汝城县| 阿城市| 阿图什市| 定安县| 东辽县| 六枝特区| 焦作市| 香河县| 龙门县| 浦东新区| 涿鹿县| 武威市| 利辛县| 合作市| 上栗县| 达日县| 南汇区| 灵川县| 肃宁县| 莱西市| 叙永县| 新和县| 广宗县|