娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

簡介:堆和棧的區別:stack的空間由操作系統自動分配/釋放,heap上的空間手動分配/釋放。stack的空間有限,heap是很大的自由存儲區。程序在編譯期和函數分配內存都是在棧上進行,且程序運行中函數調用時參數的傳遞也是在棧上進行。


關于堆和棧已經是程序員的一個月經話題,大部分有是基于os層來聊的。


那么,在赤裸裸的單片機下的堆和棧是什么樣的分布呢?以下是網摘:


剛接手STM32時,你只編寫一個


int main()


{


while(1);


}


BUILD://Program Size: Code=340 RO-data=252 RW-data=0 ZI-data=1632


編譯后,就會發現這么個程序已用了1600多的RAM,要是在51單片機上,會心疼死了,這1600多的RAM跑哪兒去了,分析map,你會發現是堆和棧占用的,在startup_stm32f10x_md.s文件中,它的前面幾行就有以上定義,這下該明白了吧。


Stack_Size EQU 0x00000400


Heap_Size EQU 0x00000200


以下引用網上資料 理解堆和棧的區別


(1)棧區(stack):由編譯器自動分配和釋放,存放函數的參數值、局部變量的值等,其操作方式類似于數據結構中的棧。


(2)堆區(heap):一般由程序員分配和釋放,若程序員不釋放,程序結束時可能由操作系統回收。分配


方式類似于數據結構中的鏈表。


(3)全局區(靜態區)(static):全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。程序結束后由系統自動釋放。


(4)文字常量區:常量字符串就是存放在這里的。


(5)程序代碼區:存放函數體的二進制代碼。


例如:


int a=0; //全局初始化區


char *p1; //全局未初始化區


main()


{


int b; //棧


char s[]="abc"; //棧


char *p3= "1234567"; //在文字常量區Flash


static int c =0 ; //靜態初始化區


p1= (char *)malloc(10); //堆區


strcpy(p1,"123456"); //"123456"放在常量區


}


所以堆和棧的區別:


stack的空間由操作系統自動分配/釋放,heap上的空間手動分配/釋放。


stack的空間有限,heap是很大的自由存儲區。


程序在編譯期和函數分配內存都是在棧上進行,且程序運行中函數調用時參數的傳遞也是在棧上進行。


------------------------------------------------------------------------------------------------------


1.堆和棧大小


定義大小在startup_stm32f2xx.s


Stack_Size EQU 0x00000400


AREA STACK, NOINIT, READWRITE, ALIGN=3


Stack_Mem SPACE Stack_Size


__initial_sp


; Heap Configuration


; Heap Size (in Bytes)


;


Heap_Size EQU 0x00000200


AREA HEAP, NOINIT, READWRITE, ALIGN=3


__heap_base


2.堆和棧位置


通過MAP文件可知


HEAP 0x200106f8 Section 512 startup_stm32f2xx.o(HEAP)


STACK 0x200108f8 Section 1024 startup_stm32f2xx.o(STACK)


__heap_base 0x200106f8 Data 0 startup_stm32f2xx.o(HEAP)


__heap_limit 0x200108f8 Data 0 startup_stm32f2xx.o(HEAP)


__initial_sp 0x20010cf8 Data 0 startup_stm32f2xx.o(STACK)


顯然 Cortex-m3資料可知:__initial_sp是堆棧指針,它就是FLASH的0x8000000地址前面4個字節(它根據堆棧大小,由編譯器自動生成)


顯然堆和棧是相鄰的。


3.堆和棧空間分配


棧:向低地址擴展


堆:向高地址擴展


顯然如果依次定義變量


先定義的棧變量的內存地址比后定義的棧變量的內存地址要大


先定義的堆變量的內存地址比后定義的堆變量的內存地址要小


4.堆和棧變量


棧:臨時變量,退出該作用域就會自動釋放


堆:malloc變量,通過free函數釋放


另外:堆棧溢出,編譯不會提示,需要注意


------------------------------------------------------------------------------------------------------


如果使用了HEAP,則必須設置HEAP大小。


如果是STACK,可以設置為0,不影響程序運行。


IAR STM8定義STACK,是預先在RAM尾端分配一個字節的區域作為堆棧預留區域。


當程序靜態變量,全局變量,或者堆與預留堆棧區域有沖突,編譯器連接的時候就會報錯。


你可以吧STACK設置為0,并不影響運行。(會影響調試,調試會報堆棧溢出警告)。


其實沒必要這么做。


一般程序,(在允許范圍內)設置多少STACK,并不影響程序真實使用的RAM大小,(可以試驗,把STACK設置多少,編譯出來的HEX文件都是一樣),


程序還是按照它原本的狀態使用RAM,把STACK設置為0,并不是真實地減少RAM使用。


僅僅是欺騙一下編譯器,讓程序表面上看起來少用了RAM。


而設置一定size的STACK,也并不是真的就多使用了RAM,只是讓編譯器幫你檢查一下,是否能夠保證有size大小的RAM沒有被占用,可以用來作為堆棧。


以上僅針對IAR STM8.


------------------------------------------------------------------------------------------------------


從以上網摘來看單片機的堆和棧是分配在RAM里的,有可能是內部也有可能是外部,可以讀寫;


棧:存函數的臨時變量,即局部變量,函數返回時隨時有可能被其他函數棧用。所以棧是一種分時輪流使用的存儲區,


編譯器里定義的Stack_Size,是為了限定函數的局部數據活動的范圍,操過這么范圍有可以跑飛,也就是棧溢出;


Stack_Size不影響Hex,更不影響Hex怎么運行的,只是在Debug調試時會提示錯。棧溢出也有是超過了國界進行活動,只要老外沒有意見,你可以接著玩,有老外不讓你玩,你就的得死,或是大家都死(互相撕殺),有的人寫單片機代碼在函數里定義一個大數組 int buf[8192],棧要是小于8192是會死的很慘。


堆:存的是全局變量,這變量理論上是所有函數都可以訪問的,全局變量有的有初始值,但這個值不是存在RAM里的,是存在Hex里,下載到Flash里,上電由代碼(編譯器生成的匯編代碼)搬過去的。有的人很“霸道”,上電就霸占已一塊很大的RAM(Heap_Size),作為己有(malloc_init),別人用只能通過他們管家借(malloc),用完還得換(free)。所以一旦有“霸道”的人出現是編譯器里必須定義Heap_Size,否則和他管家借也沒有用。


總之:堆和棧有存在RAM里,他兩各分多少看函數需求,但是他兩的總值不能超過單片機硬件的實際RAM尺寸,否則只能到海里玩(淹死了)或是自己打造船接著玩(外擴RAM)。


關鍵字:STM32 引用地址:STM32 堆和棧知識

上一篇:STM32低成本WiFi播放電路設計詳解
下一篇:STM32啟動代碼分析問題

推薦閱讀

原理如下:以下代碼實現了利用TIM3的CH3以及CH4輸出兩路移相的PWM,移相角度為225度。void TIM3_PWMShiftInit(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; GPIO_InitTypeDef GPIO_InitStruct; TIM_OCInitTypeDef TIM_OCInitStruct; /**********************TIM3 GPIO配置*****************************/ RCC_APB2PeriphClockCmd(RCC...
電池包易自燃?蔚來召回4803輛ES8 涉及近三分之一首批交付車輛 蔚來承諾會對所有因電池質量安全事故造成的用戶財產損失依法賠付 蔚來汽車近半年來發生數次自燃事故。6月27日,經國家主管部門調查后,蔚來汽車決定召回4803輛搭載了2018年4月2日到2018年10月19日期間生產的動力電池包的蔚來ES8電動汽車。 蔚來汽車召回部分ES8約占交付車輛三分之一6月27日,...
2020年上半年,受新冠疫情影響,半導體產業鏈訂單延遲、減少等情況屢見不鮮;各地的重大半導體項目也存在計劃推遲等情況。青島芯恩項目2018年5月,芯恩(青島)集成電路有限公司芯片項目啟動簽約儀式舉行,這是中國國內啟動的首個CIDM集成電路項目。簽約期間的公開信息顯示該項目計劃2019年底一期整線投產,2022年滿產。2019年10月28日,芯恩舉行了集成電...
據外媒報道,索尼電子公司(Sony Electronics Inc.)宣布推出Mobile ES?系列首款具有高分辨率音頻功能的車載媒體接收器XAV-9500ES。該9500ES接收器搭載時尚、高清的10.1英寸顯示屏,可提供高品質聲音、可定制的音頻功能以及索尼首個無線Apple CarPlay和Android Auto?連接。索尼電子公司家庭娛樂與音響副總裁Daisuke Kawaguchi表示:“索尼Mobile ...

史海拾趣

問答坊 | AI 解惑

基于單片機的具有通訊口的智能溫控表

本帖最后由 paulhyde 于 2014-9-15 09:52 編輯 1 引言 溫控表已廣泛應用于工業控制等諸多領域,本文介紹的具有計算機通訊功能的智能溫控表是一種新穎的自動化儀表,它以單片機AT89C52為核心,采用電壓/頻率轉換技術和RS-485通信接口芯片MAX ...…

查看全部問答∨

寫串口通信程序,第一反應是采用中斷+隊列方式。

然后再考慮能不能裁減、替換、簡化。 學會了這些基本原理,做ARM、PC什么的驅動程序都簡單了。 要牢記:這是基本設計原理。…

查看全部問答∨

請問這樣是否可行,需要多大的電容?

請大家幫個忙:我需要在系統斷開市電后,利用開關電源當中剩余的部分電量來寫數據到nor flash當中,nor flash在之前有外部電源的時候已經擦除過了,所以不用擦除,寫入的數據108個字節,打算在開關電源上加入一個大一點的電容,以延長掉電后可以操 ...…

查看全部問答∨

匯編 1+2+3+……+100

1.1、古代某棋手在一次國際性比賽中贏得了第一名,為國家爭得了榮譽,國王重獎這位棋手,頒發的獎金的方式就是在棋盤的100個方格上依次放入與棋盤編號等號克數的黃金,請你設計程序幫助這位古代棋手計算出他一共獲得多少克黃金。(將結果存在30H和 ...…

查看全部問答∨

發一篇陳年舊文——nor flash壽命及失效模式測試

    動手寫djyos的flash文件系統前,花幾天實測了一下flash壽命和失效模式。從以往使用經驗中,對flash的失效模式是有一個基本的感性認識的,但畢竟沒有實測過,都是憑經驗和手冊使用。djyos的flash文件系統會利用這些測試結果,用以優化 ...…

查看全部問答∨

strcpy

都說wince只支持UNICODE,所有的字符串函數都要換成_wcs系列的,可是為什么我用strcpy,strcat照樣可以運行呢,至少在模擬器上運行沒問題。只有AfxMessageBox這樣的函數才有問題。 [code] FILE* f = fopen(\"text\",\"a\"); char* text =(char* ...…

查看全部問答∨

大家注意了。C8051F的板子,發現問題,

還差幾個元件沒有焊接,所以沒有上電,但現在發現2個比較大的問題。 1,U2 那個DC/DC 封裝錯了。焊接后VDD和 GND 斷路,只有把U2立著焊接。 2,USB 插座錯了。   濕度傳感器可以參考zhaojun_xf斑竹發的貼,我就不發圖片了。我也是按他的方 ...…

查看全部問答∨

美國會規定2015年前1/3地面戰斗將使用機器人

我看到這條消息時我有點振驚了。如果那樣中國的工程師壓力老大了。 轉自中華網社區,騰迅新聞也有 下面是全文: 來自互聯網:                         &n ...…

查看全部問答∨

MSP430教程4:MSP430單片機調試接口和JTAG仿真器原理圖

MSP430單片機調試接口簡介MSP430F1、F2、F4系列產品中,采用的是4線JTAG接口。也即TMS(模式選擇)、TCK(JTAG時鐘信號)、TDO(數據輸出)、TDI(數據輸入)。 在4線制的JTAG接口中,TI公司有定義一個常規的14pin接口方式  而在MSP430F2系列產 ...…

查看全部問答∨

求 最小系統板STM32F103VET6的原理圖PDF

哪位大神有 STM32F103VET6最小系統板 的原理圖PDF 發一封來  zywindows8@vip.qq.com  不勝感激 …

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 象州县| 濮阳县| 鸡东县| 罗田县| 宜兰县| 安顺市| 湖北省| 纳雍县| 广宗县| 托克逊县| 阜城县| 盐边县| 临夏市| 黔西县| 永州市| 九寨沟县| 齐齐哈尔市| 镇宁| 昆山市| 郁南县| 江城| 南通市| 耿马| 社旗县| 郑州市| 新巴尔虎右旗| 左贡县| 浦东新区| 永川市| 玉树县| 鄂尔多斯市| 宁强县| 白山市| 龙海市| 淳安县| 遵化市| 海盐县| 全南县| 广东省| 南召县| 南充市|