C語言哪些變量可能導(dǎo)致棧溢出?
開發(fā)者要問的是單片機應(yīng)用中變量定義多導(dǎo)致的堆棧溢出問題。單片機的臨時變量存儲區(qū)分內(nèi)部變量存儲區(qū)ram和外部變量擴展區(qū)xram/sram。應(yīng)用程序中堆棧的空間占用了內(nèi)部ram區(qū)域的空間。如果由開發(fā)者定義的變量s應(yīng)用程序占用內(nèi)部ram區(qū)域過多,就容易導(dǎo)致應(yīng)用程序中的堆棧溢出。所以建議開發(fā)者在對程序運行時間沒有嚴(yán)格要求的情況下,盡量限制在外部ram中定義變量。
單片機堆棧溢出后會怎樣工作,是不是會復(fù)位?
單片機的堆棧溢出后,根據(jù)其位置不同,會不同程度地影響運行,或進(jìn)入死循環(huán)或產(chǎn)生不可預(yù)知的結(jié)果。如果看門狗沒有開啟,它不太可能被復(fù)位。第一,如果棧頂設(shè)置為低級,比如兩個FH,預(yù)期的棧空間是一個或六個字節(jié),如果溢出,如果用戶使用40h,用戶寄存器的值可能會改變。這種影響是雙重的。首先,它改變了用戶的運行結(jié)果。第二,堆棧存儲子程序地址時,會出現(xiàn)不可預(yù)知的結(jié)果,執(zhí)行后回不去。第二,如果棧頂設(shè)置在高位,比如FH,如果溢出,那么推入棧的值會保存在一個虛擬空間,也就是0小時后的RAM空間。這個RAM空間不存在,所以結(jié)果會不正確。如果保存了地址,它將無法返回到保存的位置。
8051單片機里的計數(shù)器溢出后會申請中斷嗎?
計數(shù)器溢出后會產(chǎn)生中斷請求,但單片機是否產(chǎn)生中斷,即是否響應(yīng)這個中斷,取決于程序如何配置計數(shù)器溢出中斷。如果允許計數(shù)器溢出中斷,即I
單片機運行一段時間后,不按原程序執(zhí)行怎么回事/?
根據(jù)我多年的經(jīng)驗,這個問題一般有三個原因:1你的軟件是編寫中的BUG,比如你想實現(xiàn)功能A,但是因為你的程序在編寫中有問題,比如算法有問題,語法有漏洞,你的思考不全面,在一定條件下可以實現(xiàn)功能A,但是當(dāng)條件稍有變化,程序就和你的執(zhí)行不一致了。
單片機硬件被干擾,比如單片機周圍有強電,或者單片機使用的繼電器,但是電路處理不好等等。,導(dǎo)致程序跑偏。
3內(nèi)存溢出比如你聲明了一個數(shù)組A[],但是在程序執(zhí)行的過程中,你的程序不夠嚴(yán)謹(jǐn),在調(diào)用A[],不小心讓它超出了自己的極限,等等。以我個人的經(jīng)驗,第一個原因是你出現(xiàn)這種現(xiàn)象的主要原因,其次是第三個原因。第二個原因一般不容易出現(xiàn),除非硬件是新手做的。建議你從第1、2項入手,找出原因。