KEIL 工程中內(nèi)存分布 MSP 棧溢出的問題分析

1.棧指針溢出現(xiàn)象

當在編程的時候,如果沒有棧溢出的意識,某些情況下可能會將局部變量的大小設(shè)置的非常大赃梧,如下代碼:

void fun()
{
    //....
}
int main(void) 
{
    char a[1024];
    char b[1024];
    int  c;
    fun();
    //...
}

局部變量 a、b數(shù)組總共的有2k內(nèi)存大小豌熄,如果設(shè)置芯片的棧大小為2k時授嘀,當運行fun函數(shù)時,程序直接進入hardware出現(xiàn)死機的問題锣险。

2.理論分析
keil工程下內(nèi)存分布

我們先來看一下在keil工程的內(nèi)存分布:
使用MDK編譯代碼時蹄皱,在編譯輸出窗口會輸出以下內(nèi)容:

Program Size: Code=5756 RO-data=336 RW-data=56 ZI-data=1832  

MDK將代碼分成了Code,RO-data,RW-data,ZI-data這幾個段:

  • Code :是存儲程序代碼(指令)的。
  • RO-data:是存儲const常量芯肤,如一些字符串巷折。
  • RW-data :是存儲初始化值不為0的全局變量。
  • ZI-data :是存儲未初始化的全局變量或初始化值為0的全局變量崖咨。

Flash = Code + RO Data + RW Data;
RAM= RW-data + ZI-data;

MSP指針

我們現(xiàn)在主要來看一下 RAM 的分配锻拘, RAM 不僅存放了初始化和未初始化的全局變量, 我們還將RAM劃分成兩個段來存放堆和棧击蹲, 堆和棧的區(qū)分如下:

  • 堆:這部分內(nèi)存一般用于程序員分配和釋放署拟,如使用malloc函數(shù)申請的內(nèi)存
  • 棧:這部分由程序自動完成, 如入棧的時候?qū)⒕植孔兞看娣胚@個區(qū)域

在cortex-M3中歌豺, 0地址存放的就是SP的指針值推穷,使用的是“向下生長的滿棧”模型, 即SP指向的是棧內(nèi)存的最高地址类咧,入棧時馒铃,SP指針值遞減,如下圖所示:

image
image

在stm32 keil工程中設(shè)置棧的大小在 starup_stm32f10x_hd.s文件中:

Stack_Size      EQU     0x00000400

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

意思講棧的大小設(shè)置為了0x00000400 = 1k(我們自己也可以改)痕惋。
如上代碼中区宇, 局部變量有2k大小,當調(diào)用fun函數(shù)時血巍,程序會將這些局部變量入到棧內(nèi)存中萧锉,這時,MSP指向的位置早已超出了棧內(nèi)存的位置述寡,如果MSP指向的RAM內(nèi)存暫時沒用到柿隙,可能會比較幸運的不出現(xiàn)問題,如果MSP 指向的位置已不在RAM 的范圍之內(nèi)鲫凶,程序?qū)⒅苯铀罊C禀崖。

  • 在eclipse工程(GCC編譯)中,內(nèi)存是通過鏈接腳本來分布設(shè)置的螟炫,棧一般設(shè)置在RAM的最高地址的那塊區(qū)域波附。
  • 在keil工程(ARMCC編譯)中是通過分散加載文件設(shè)置的,一般是采用keil工程自帶的〉牛可以用j-flash 查看編譯出來的hex文件封寞,其中前四個字節(jié)就是SP指針指向的地址,棧一般設(shè)置為RAM 的低地址那塊區(qū)域仅财。

所以狈究,有時候同樣的代碼在eclipse工程中能跑過,在keil工程中跑不過盏求,這就是其中的原因抖锥。

3. 結(jié)論

我們要合理的設(shè)置棧的大小和 局部變量的大小,合理的分配內(nèi)存分布碎罚。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末磅废,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子荆烈,更是在濱河造成了極大的恐慌拯勉,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耙考,死亡現(xiàn)場離奇詭異谜喊,居然都是意外死亡潭兽,警方通過查閱死者的電腦和手機倦始,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來山卦,“玉大人鞋邑,你說我怎么就攤上這事≌巳兀” “怎么了枚碗?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铸本。 經(jīng)常有香客問我肮雨,道長,這世上最難降的妖魔是什么箱玷? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任怨规,我火速辦了婚禮,結(jié)果婚禮上锡足,老公的妹妹穿的比我還像新娘波丰。我一直安慰自己,他們只是感情好舶得,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布掰烟。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纫骑。 梳的紋絲不亂的頭發(fā)上蝎亚,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音先馆,去河邊找鬼颖对。 笑死,一個胖子當著我的面吹牛磨隘,可吹牛的內(nèi)容都是我干的缤底。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼番捂,長吁一口氣:“原來是場噩夢啊……” “哼个唧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起设预,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤徙歼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鳖枕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體魄梯,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年宾符,在試婚紗的時候發(fā)現(xiàn)自己被綠了酿秸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡魏烫,死狀恐怖辣苏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哄褒,我是刑警寧澤稀蟋,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站呐赡,受9級特大地震影響退客,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜链嘀,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一萌狂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧管闷,春花似錦粥脚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冤留。三九已至,卻和暖如春树灶,著一層夾襖步出監(jiān)牢的瞬間纤怒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工天通, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泊窘,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓像寒,卻偏偏與公主長得像烘豹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子诺祸,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 文章也同時在個人博客 http://kimihe.com/更新 引言 網(wǎng)絡(luò)上關(guān)于內(nèi)存中各區(qū)段作用的文章有很多携悯,但不...
    QihuaZhou閱讀 37,821評論 12 135
  • 從三月份找實習到現(xiàn)在,面了一些公司筷笨,掛了不少憔鬼,但最終還是拿到小米、百度胃夏、阿里轴或、京東、新浪仰禀、CVTE照雁、樂視家的研發(fā)崗...
    時芥藍閱讀 42,246評論 11 349
  • 忙碌的一天,到了下午的時候悼瘾,就開始覺得腦子有些不太好使囊榜,我知道审胸,這是一種信號亥宿,我累了,需要休息一下砂沛。每次迭代周一因...
    玉露君閱讀 313評論 0 0
  • 跳一跳烫扼,夠得著 激勵方案的制定要重視并且謹慎,不能太高碍庵,或太低映企,都形同虛設(shè)。 太吝嗇或太大方都不利于激勵員工静浴,過時...
    張磊沙閱讀 108評論 0 0