找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 8366|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)可以執(zhí)行多少次嵌套?原因是什么?

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
ID:488693 發(fā)表于 2019-3-12 15:34 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
如題
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

來(lái)自 11#
ID:401564 發(fā)表于 2019-3-12 23:54 | 只看該作者
這個(gè)和單片機(jī)的硬件有關(guān)的,很多人是以8051的C語(yǔ)言開(kāi)始學(xué)習(xí)的,8051的堆棧是程序自動(dòng)分配的軟件堆棧,理論上來(lái)說(shuō)從030H到0FFH都可以作為堆棧,大概200層吧,那么在C中,大概就能嵌套200層,至少理論上來(lái)說(shuō)是這樣的
但別的單片機(jī)就不一樣的了,有的是使用硬件堆棧,合泰單片機(jī)就是這樣的硬件堆棧,有的型號(hào)只有4層硬件堆棧,也就是說(shuō)最多只能嵌套4層,PIC的單片機(jī)也是大概如此,像這種硬件堆棧,而且只有幾層堆棧的單片機(jī),一般是不會(huì)嵌套的,函數(shù)的遞歸也是不允許的,就是中斷函數(shù)里面都不用函數(shù)之類的要用到堆棧的語(yǔ)句

評(píng)分

參與人數(shù) 1黑幣 +60 收起 理由
admin + 60 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

10#
ID:426861 發(fā)表于 2019-12-13 16:53 | 只看該作者
受限于單片機(jī)硬件和C語(yǔ)言規(guī)范
回復(fù)

使用道具 舉報(bào)

9#
ID:663288 發(fā)表于 2019-12-13 15:30 | 只看該作者
不同的單片機(jī)可以執(zhí)行的嵌套也不同,RAM大的單片機(jī),多少級(jí)都是隨便的
回復(fù)

使用道具 舉報(bào)

8#
ID:416239 發(fā)表于 2019-12-13 14:56 | 只看該作者
我用過(guò)最多4次
回復(fù)

使用道具 舉報(bào)

7#
ID:532541 發(fā)表于 2019-12-13 08:16 | 只看該作者
嵌套的層數(shù)與堆棧的深度有關(guān),每次調(diào)用子程序,或者相應(yīng)中斷,都要在堆棧中保留返回值,如何堆棧滿了,再嵌套,就無(wú)法返回了。我用過(guò)最PIC16c57,硬件堆棧2級(jí)。。 若是標(biāo)準(zhǔn)的51單片機(jī),堆棧在128B的RAM中可以自己設(shè)置指針,但是R0-R7 用戶的數(shù)據(jù)要占用一些RAM 剩余的可做堆棧,每次入棧2字節(jié),可以計(jì)算出能嵌套多少次了,52多了128B的RAM 可以用l來(lái)做堆棧 128B的堆?梢郧短64次。當(dāng)然每次嵌套要保存數(shù)據(jù)還需要RAM。
回復(fù)

使用道具 舉報(bào)

6#
ID:235200 發(fā)表于 2019-12-9 23:26 | 只看該作者
Y_G_G 發(fā)表于 2019-3-12 23:54
這個(gè)和單片機(jī)的硬件有關(guān)的,很多人是以8051的C語(yǔ)言開(kāi)始學(xué)習(xí)的,8051的堆棧是程序自動(dòng)分配的軟件堆棧,理論上來(lái) ...

8051單片機(jī)即使把08H-FFH所有內(nèi)存都作為堆棧,也不會(huì)有200層,因?yàn)橹挥?40個(gè)存儲(chǔ)單元,而第一個(gè)斷點(diǎn)都有2個(gè)字節(jié)的地址需自動(dòng)存入,這樣也只有120層,如果程序真有120層調(diào)用,每一層的中間運(yùn)行數(shù)據(jù)將無(wú)存儲(chǔ)空間可用,一般編寫(xiě)程序都需要留出足夠的內(nèi)存空間供變量使用,堆棧移至內(nèi)存的尾部,大概占16-30個(gè)字節(jié)地址,程序嵌套建議不超過(guò)8層為好

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:391730 發(fā)表于 2019-12-9 18:32 | 只看該作者
正規(guī)007 發(fā)表于 2019-3-12 17:14
如果設(shè)計(jì)合理,N次嵌套都不是個(gè)事

胡說(shuō)!你試試最簡(jiǎn)單的遞歸看看!
回復(fù)

使用道具 舉報(bào)

地板
ID:391730 發(fā)表于 2019-12-9 18:30 | 只看該作者
親測(cè),5層棧溢出
回復(fù)

使用道具 舉報(bào)

板凳
ID:80221 發(fā)表于 2019-3-12 19:34 | 只看該作者
若是中斷嵌套,最好都不要寫(xiě)這種代碼。應(yīng)當(dāng)拒絕浪費(fèi)內(nèi)存這種無(wú)意義行為
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:277976 發(fā)表于 2019-3-12 18:47 | 只看該作者
堆棧應(yīng)該是跟C編譯器有關(guān)和開(kāi)辟的堆棧區(qū)空間的大小有關(guān)。因此,子程序能嵌套多少層是跟C編譯器有關(guān)和開(kāi)辟的堆棧區(qū)空間的大小有關(guān)。有的C編譯器在編譯時(shí),如果溢出會(huì)有警告或者出錯(cuò)的提示,但是也有的C編譯器如果溢出卻不會(huì)有警告或者出錯(cuò)的提示,畢竟C編譯器也是一種人為的軟件,不同的版本也可能存在差異。我自己也開(kāi)發(fā)過(guò)編譯器的子程序嵌套的功能,因此我深知子程序的嵌套肯定是有層數(shù)限制的,嵌套越少越安全。我平時(shí)用keil4 編譯M3和M4核的單片機(jī),一般是把嵌套數(shù)控制在4層左右以內(nèi)。應(yīng)該以實(shí)際為準(zhǔn),如果程序出現(xiàn)了莫名其妙的明顯錯(cuò)誤,可以考慮是不是嵌套層數(shù)太多或者堆棧溢出的問(wèn)題。

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

樓主
ID:483991 發(fā)表于 2019-3-12 17:14 | 只看該作者
如果設(shè)計(jì)合理,N次嵌套都不是個(gè)事

評(píng)分

參與人數(shù) 3黑幣 +26 收起 理由
areyouok + 6
Sawardeakar + 10 贊一個(gè)!
春風(fēng)十里吹 + 10 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表