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

歷史上的今天

今天是:2025年01月12日(星期日)

2020年01月12日 | stm32 堆和棧(stm32 Heap & Stack)

發布者:喜從中來 來源: eefocus關鍵字:stm32 手機看文章 掃描二維碼
隨時隨地手機看文章

關于堆和棧已經是程序員的一個月經話題,大部分有是基于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文件(這個是stm32的啟動文件)中,它的前面幾行就有以上定義,

這下該明白了吧。

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是很大的自由存儲區(heap雖然有很大的存儲區,但是這個存儲區并不是無限大的,在stm32中,heap區的最大值由SRAM區決定,而SRAM區的大小可以參考具體的數據手冊)。

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

------------------------------------------------------------------------------------------------------
1.堆和棧大小

定義大小在startup_stm32f2xx.s (這個地方應該是有錯,定義的大小是在startup_stm32f10x_hd.s,也就是啟動文件中)

Stack_Size  EQU  0x00000400 

AREA  STACK, NOINIT, READWRITE, ALIGN=3 
Stack_Mem  SPACE  Stack_Size 
__initial_sp

; Heap Configuration 
;  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> 
;

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里的,有可能是內部也有可能是外部,可以讀寫;(堆在stm32是分配在SRAM中的)

棧:存函數的臨時變量,即局部變量,函數返回時隨時有可能被其他函數棧用。所以棧是一種分時輪流使用的存儲區,編譯器里定義的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)。


參考資料:

1 百度文庫《stm32堆棧分析》

http://wenku.baidu.com/link?url=Fk8ht47IULQFtxV43tc36LMSqDaGihhImEiVWmch-3nqRwRv2Arg9HUxU-JtQy8E64Kfiuhn0QghFpFQBFV9jdTRqpmMoaowX2DiMTGHC7u

關鍵字:stm32 引用地址:stm32 堆和棧(stm32 Heap & Stack)

上一篇:STM32堆和棧(Heap & Stack)及SRAM存儲使用
下一篇:淺談STM32堆棧與uCOS堆棧,其實是兩碼事

0

推薦閱讀

單片機 步進電機的驅動程序動電壓 12V ,步進角為 7.5 度 . 一圈 360 度 , 需要 48 個脈沖完成 !!! 在這里介紹一下用 51 單片機 對這款步進電機的驅動方法。 該步進電機有 6 根引線,排列次序如下: 1: 紅色、 2: 紅色、 3: 橙色、 4: 棕色、 5: 黃色、 6: 黑色。 采用 51 驅動 ULN2003 的方法進行驅動。...
TrendForce記憶體儲存研究(DRAMeXchange)指出,NAND Flash市場經歷2018年全年供過于求,2019年在筆記本電腦、智能手機、服務器等主要需求表現難見起色下,預計產能過剩難解,因而使得供應商進一步降低資本支出以放緩擴產進程,避免單位成長過多導致過剩狀況加劇。根據DRAMeXchange調查指出,2018年因供過于求難以遏制,韓國供應商帶頭降低資本支出,NAN...
void main(void){ s1=1; TMOD=0x01; //使用定時器T0的模式1 TH0=(65536-46083)/256; //定時器T0的高8位設置初值 TL0=(65536-46083)%256; //定時器T0的低8位設置初值函數功能:定時器T0的中斷服務函數********************************************************/void Time0(void ) interrupt 1 using 0...
根據 TrendForce 集邦咨詢旗下顯示器研究處表示,受惠于疫情衍生的宅經濟效應,包含液晶監視器產品在內的 IT 產品需求持續延燒。然液晶監視器面板供給面臨其他產品的產能排擠,以及 IC 短缺越趨嚴重的情況,導致供需缺口持續擴大。另外,2021 年三星顯示器(SDC)將淡出液晶顯示器面板供應,預估市占將自去年的 12%掉至 1%,再加上南京熊貓 8.5 ...

史海拾趣

問答坊 | AI 解惑

MAX3000系列的引腳圖

我是剛學CPLD的,手上有幾片EPM3064,網上找了很久都沒能找到引腳圖,哪位知道的大俠指點下。謝謝!…

查看全部問答∨

第二屆恩智浦杯創新設計大賽

本帖最后由 paulhyde 于 2014-9-15 09:48 編輯 活動介紹   恩智浦半導體(NXP Semiconductors)是一家新近獨立的半導體公司,由飛利浦公司創立,已擁有五十年的悠久歷史,主要提供工程師與設計人員各種半導體產品與軟件,為消費電子、安全應用、 ...…

查看全部問答∨

28027 flash燒寫問題

不知各位遇到過TI C2000 Piccolo Microcontrollers不能燒寫FLASH的問題沒? 小弟遇到的問題如下: 軟件配置:CCS3.3.82.13+F2802x_CSP_RTM.exe+FlashAPIInterface2802xV1_00a.out+F28027.CMD 硬件配置:TDS510仿真器+F28027最小系統板 問題 ...…

查看全部問答∨

集成運放中的電流源電路和差動放大電路

6集成電路運算放大器 6 .1.1集成電路運算放大器的特點 6.1.2集成運算放大電路中的電流源 6.1.3基本型差動放大器 6.1.4雙電源長尾式差放 6.1.5差動電路的幾種接法 6.1.6恒流源式差放…

查看全部問答∨

大功率衰減器系統設計方法概述

本帖最后由 paulhyde 于 2014-9-15 09:18 編輯 衰減器的功能是能處理大功率信號且不會影響信號性能,所以在對大功率信號處理和測試時需要用到高頻衰減器。尤其是一些特殊的信號,例如在商業廣播和軍用雷達系統中常見的超過1kW的信號來講,在任何測 ...…

查看全部問答∨

中嵌學院的嵌入式培訓怎么樣?

中嵌學院的嵌入式培訓怎么樣?保證就業是真的嗎?就業怎么樣?有在中嵌培訓過的大哥大姐能回答下嗎?學費太貴,農村的我想把來之不易的錢用到實處, 有知道的說下…

查看全部問答∨

STR750微控制器的車載控制平臺的設計

該平臺可以管理車輛控制系統、導航儀和音響等娛樂設備,并能監控車輛運行及環境信息。通過合理使用STR750的各種通信接口,滿足車載控制系統的功能要求。要求按照實際需要設計出一個功能豐富的通用控制平臺,進行軟硬件系統設計,實現相應的功能。…

查看全部問答∨

m_ctrlComm.SetOutput問題?

程序在窗口輸入的情況下,一切正常。 但當把數據編入軟件,不用輸入,直接使用時,會提示錯誤。 下面這段程序,問題在那里? CByteArray m_1; m_1.SetSize(8); m_1[0]=0x01; m_1[1]=0x03; m_1[2]=0x00; m_1[3]=0x08; m_1[4]=0x00; m_1[5] ...…

查看全部問答∨

LED燈壽命不超過12000小時?

大家都知道,LED燈采用半導體原理,其光源的壽命是很長的,可達50000h以上,然而最近和節能燈行業一位前輩交流,他卻稱,這種說法是不實之言,他是這樣給我分析的: LED發光原理普通節能一樣,都是利用稀土三基色熒光粉發光,只是激發方式不同。 ...…

查看全部問答∨
小廣播
添点儿料...
无论热点新闻、行业分析、技术干货……
設計資源 培訓 開發板 精華推薦

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

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

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 莱阳市| 平定县| 固镇县| 乐安县| 禹城市| 滦平县| 枞阳县| 晋宁县| 库尔勒市| 北海市| 东至县| 和田县| 高碑店市| 葫芦岛市| 三台县| 和龙市| 固安县| 宜昌市| 纳雍县| 屯门区| 易门县| 巍山| 阜平县| 永修县| 霍城县| 苗栗市| 图木舒克市| 江城| 离岛区| 万源市| 蒲城县| 军事| 扎赉特旗| 兴山县| 怀宁县| 门源| 宿松县| 天祝| 遵义县| 遂宁市| 江山市|