www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 單片機 > 單片機
[導讀]編譯器在生成代碼使用兩個堆棧:一個是用于子程序調用和中斷操作的硬件堆棧,一個是用于以堆棧結構傳遞的參數臨時變量和局部變量的軟件堆棧。硬件堆棧是從數據內存的頂部開始分配的,在硬件堆棧下面再分配一定數量的

編譯器在生成代碼使用兩個堆棧:一個是用于子程序調用和中斷操作的硬件堆棧,一個是用于以堆棧結構傳遞的參數臨時變量和局部變量的軟件堆棧。硬件堆棧是從數據內存的頂部開始分配的,在硬件堆棧下面再分配一定數量的字節(jié)作為軟件堆棧。硬件堆棧和軟件堆棧均為向下生長型的堆棧(注意:這與51單片機相反)。

通常如果你的程序沒有子程序調用也不調用象帶有%f 格式的printf()等庫函數,那么默認的16 字節(jié)應該在大多數的例子中能良好工作。在絕大多數程序中除了很繁重的遞歸調用程序再入式函數,最多40 個字節(jié)的硬件堆棧應該是足夠的。

如果函數的調用層次太深,有可能會發(fā)生硬件堆棧溢出到軟件堆棧中,改變了軟件堆棧中數據的內容,同樣,當定義了太多的局部變量或一個局部集合變量太多也有可能出現軟件堆棧溢出到動態(tài)分配的數據區(qū),兩個堆棧都有可能溢出,如果堆棧溢出,會引起不可預測的錯誤??梢允褂枚褩z查函數檢測兩個堆棧是否溢出。

在Target的頁面中有一個Return Stack Sizi選項,用于指定硬件堆棧(保存函數返回值)的大小,通常如果子程序調用嵌套不深(不超過4層),那么使用默認的16字節(jié)就足夠了,如果使用了浮點函數,則至少應設定為30個字節(jié)。在一般情況下,除了層次很深的遞歸調用及使用了%f格式說明符外,設定為40個字節(jié)就足夠了。

硬件堆棧是從數據內存的頂部開始分配的,而軟件堆棧是在它下面一定數量字節(jié)處分配。硬件堆棧和數據內存的大小是受在編譯器選項中的目標裝置項設定限制的。數據區(qū)從0x60 開始分配。在IO 空間后面是正確的。允許數據區(qū)和軟件堆棧彼此相向生長。

如果你選擇的目標裝置帶有32K 或64K 的外部SRAM,那么堆棧是放在內部SRAM的頂部而且向低內存地址方向生長。參考程序和數據內存的使用。任意一個程序失敗的重要原因是堆棧溢出到其它數據內存的范圍,兩個堆棧中的任意一個都可能溢出,并且當一個堆棧溢出時會偶然產生壞的事情,你可以使用堆棧檢查函數檢測溢出情況 。

關于堆棧檢查函數:

啟動代碼在硬件堆棧和軟件堆棧的最低字節(jié)分別寫進一個代碼(0xaa),把這個代碼稱為警戒線。如果硬件堆棧和軟件堆棧如果溢出過,則警戒字節(jié)的代碼(0xaa)就會被改變,堆棧檢查函數就是通過檢查這兩個堆棧的最低字節(jié)的代碼是否被改變來判斷兩個堆棧是否溢出。通過調用_StackCheck(void)函數來檢查堆棧溢出,如果警戒線字節(jié)中的代碼仍然保持正確的值,那么函數檢查通過,沒有溢出。如果堆棧溢出,那么警戒線字節(jié)將可能被破壞,_StackCheck(void)函數檢查到警戒線判斷字節(jié)中的代碼被改變,就判斷相應的堆棧溢出(當程序堆棧溢出,程序可能運行不正?;蚺既槐罎?,該函數再調用函數_StackOverflowed(char c),如果參數是1,那么硬件堆棧有過溢出;如果參數是0,那么軟件堆棧曾經溢出。

在使用堆棧檢查函數時應注意以下幾點:

1、在使用堆棧檢查函數時,前必須用#i nclude "macros.h"預處理。

2、如果使用自己的啟動文件,在ICCAVR6.20以后的版中,如果使用的啟動文件中沒有警戒線的內容,ICCAVR也會自動添加警戒線。而在ICCAVR6.20以前的版本中,必須自己添加該部分內容,否則生成的代碼中堆棧分配將不帶警戒線。

3、如果使用動態(tài)內存分配,必須跳過警戒線字節(jié)_bss_end來分配您的堆(即增加一個字節(jié)),詳見內存分配函數說明

4、當_StackCheck(void)函數檢測到警戒線字節(jié)被改變,則會調用一個默認的_StackOverflowed 函數來跳轉到程序存儲器0的位置(復位向量地址)。可以指定或重新編寫一個新的函數來代替它,例如可以用新函數來指示是哪個堆棧溢出等,但這個函數也不可能執(zhí)行太多的功能或讓程序恢復到正常狀態(tài)。因為堆棧溢出后,會更改掉一些有用的數據,引起不可預測的錯誤,甚至使程序死機。

下面用一個簡單的實例來說明堆棧檢查函數的作用:

main( )

{

init( ) //調用初始化程序

float a,b;

a=1.0;

b=1.0;

printf("a = %fn", a);

printf("b = %fn", b);

_StackCheck( ); //調用堆棧檢查函數

}

_StackOverflowed(char c)

{

if (c == 1)

puts("trashed HW stack"); //硬件堆棧溢出

else

puts("trashed SW stack"); //軟件堆棧溢出

}

擴展閱讀:AVR單片機一些學習筆記

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯合牽頭組建的NVI技術創(chuàng)新聯盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現場 NVI技術創(chuàng)新聯...

關鍵字: VI 傳輸協議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉