chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

冬至配餃子 ? 來源:最后一個bug ? 作者:bug菌 ? 2022-07-28 11:23 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

1、棧的增長方向

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

poYBAGLiAHuAAbKkAABnWFxTtuQ560.png

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

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

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

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

2、有什么用?

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

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

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

poYBAGLiAKKAFXH2AABy3437hcQ779.png

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

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

3、用C語言如何判斷?

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

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

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

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

必須有的,那就是函數(shù)調用棧了,因為先調用的函數(shù)必然首先入棧。

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

poYBAGLiAMmAOSP7AAD6dMwwGvQ386.pngpoYBAGLiAM2ABykAAACdf-nzKFc394.png

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


審核編輯:劉清

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

    關注

    68

    文章

    20142

    瀏覽量

    246638
  • 芯片
    +關注

    關注

    462

    文章

    53499

    瀏覽量

    458494
  • C語言
    +關注

    關注

    183

    文章

    7642

    瀏覽量

    144525
  • RTOS
    +關注

    關注

    25

    文章

    862

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Stack到底用來干嘛的?

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

    C語言程序的結構

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

    C語言的常量介紹

    、-13; 實型常量:13.33、-24.4; 字符常量:‘a(chǎn)’、‘M’ 字符串常量:”I love china!” 在C語言中,可以一個標識符來表示一個常量,稱之為符號常量。符號常量在使用之前必須先
    發(fā)表于 11-24 07:12

    C語言特性

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

    C語言在嵌入式開發(fā)中的應用

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

    2025年最佳的嵌入式編程語言有哪些

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

    C語言和單片機C語言有什么差異

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

    C語言的printf基本用法介紹

    個簡單的例子: printf(\"C語言\"); 這個語句可以在屏幕上顯示“C語言”,與puts(\"C
    發(fā)表于 11-12 07:04

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

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

    基于LabVIEW的鼠標滑動方向檢測教程

    本篇教程源于一位客戶的真實需求,需要LabVIEW能夠檢測到鼠標滑動的方向,然后通過判斷滑動方向處理后續(xù)的功能。
    的頭像 發(fā)表于 07-30 13:51 ?543次閱讀
    基于LabVIEW的鼠標滑動<b class='flag-5'>方向</b>檢測教程

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

    C語言編程中,循環(huán)結構是至關重要的,它可以讓程序重復執(zhí)行特定的代碼塊,從而提高編程效率。然而,為了避免程序進入無限循環(huán),C語言提供了多種循環(huán)控制語句,如break、continue和
    的頭像 發(fā)表于 04-29 18:49 ?1722次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:<b class='flag-5'>C</b><b class='flag-5'>語言</b>循環(huán)控制

    C語言的歷史及程序介紹

    電子發(fā)燒友網(wǎng)站提供《C語言的歷史及程序介紹.pdf》資料免費下載
    發(fā)表于 04-09 16:10 ?0次下載

    51單片機C語言學習筆記

    c51語言快速入門
    發(fā)表于 03-24 14:04 ?3次下載

    MATLAB或者C語言開發(fā)FPGA有什么問題嗎

    最近有個項目領導要求MATLAB開發(fā)FPGA,有大佬MATLAB或者C語言開發(fā)FPGA的嗎,有沒有什么問題,需要注意什么問題嗎
    發(fā)表于 01-26 09:57

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

    電子發(fā)燒友網(wǎng)站提供《EE-33:C語言對ADSP-21xx定時器進行編程.pdf》資料免費下載
    發(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定時器進行編程