熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2022-1-7 08:26
正文摘要:看單片機(jī)說明,中斷會(huì)干擾浮點(diǎn)運(yùn)算。問題來了,除法是浮點(diǎn)運(yùn)算嗎?開中斷時(shí)能用嗎?若不能用,顯示各位數(shù)字時(shí)怎么辦? |
看你自己定義的數(shù)據(jù)類型 而且中斷不干擾吧 |
風(fēng)158 發(fā)表于 2022-1-8 00:50 你在15樓發(fā)言中只有不可再入部分是對的,但是C51會(huì)給出錯(cuò)誤信息,無法通過編譯,所以即使這個(gè)知識點(diǎn)是對的也是毫無價(jià)值的。 其他知識點(diǎn)完全錯(cuò)誤。 |
188610329 發(fā)表于 2022-1-7 21:15 在標(biāo)準(zhǔn)c語言里面,函數(shù)局部變量是在堆棧上臨時(shí)分配的,這種函數(shù)可遞歸,可再入。但是對于8位單片機(jī)來說,這種做法消耗太大,尤其是RAM空前緊張的8051體系,所以編譯器用了非正規(guī)的快速簡潔的實(shí)現(xiàn)方法,分析函數(shù)間調(diào)用層級,給局部變量分配一個(gè)固定的地址,比如25H吧,這種函數(shù)就是不遞歸的,一旦發(fā)生了重入,被打斷的函數(shù)的局部變量被重進(jìn)函數(shù)給徹底破壞了。 |
風(fēng)158 發(fā)表于 2022-1-7 20:58 你看到的教程的說法全都是錯(cuò)誤的。 |
風(fēng)158 發(fā)表于 2022-1-7 20:58 你 C 語言編程,還真編不出 不可再入函數(shù)來…… 也許是我C語言太渣吧,反正,我C語言寫的代碼,編譯后察看M51文件,所有函數(shù)都是以?開頭的可再入函數(shù),要想編一個(gè)不可再入函數(shù),不得不通過匯編去寫。 你如果有辦法在 C 語言環(huán)境下編出不可再入函數(shù),麻煩指點(diǎn)一二,真的想學(xué)。 |
謝謝各位積極發(fā)言。 經(jīng)過查找發(fā)現(xiàn),兩整數(shù)模擬除法運(yùn)算并不產(chǎn)生小數(shù),而是產(chǎn)生整數(shù)的商和余數(shù),不是浮點(diǎn)運(yùn)算。但是模擬除法運(yùn)算非常耗時(shí),提倡盡量少用。 |
MCU_FANS 發(fā)表于 2022-1-7 14:20 有的教程明確指出,單片機(jī)浮點(diǎn)運(yùn)算以及不可再入函數(shù)可能會(huì)被中斷打斷終止,產(chǎn)生不可預(yù)料結(jié)果,一般不提倡使用浮點(diǎn)運(yùn)算。特別指出使用sin()前必須關(guān)閉中斷。 至于中斷程序,不要說非常耗時(shí)的浮點(diǎn)運(yùn)算,就是整數(shù)運(yùn)算也必須盡量減少。倒不是影響中斷,而是無法得到正確結(jié)果。 |
如果堆棧出現(xiàn)了問題,別說干擾浮點(diǎn)計(jì)算,PC指針都能彈飛。 |
除法是不是浮點(diǎn)運(yùn)算跟你定義的變量類型有關(guān)系的,需要是定義浮點(diǎn)數(shù)才是浮點(diǎn)運(yùn)算 |
目前應(yīng)該沒有單片機(jī)的中斷會(huì)干擾浮點(diǎn)運(yùn)算,因?yàn)檫M(jìn)中斷和出中斷都有對應(yīng)的現(xiàn)場保護(hù)和現(xiàn)場恢復(fù)。相反,如果浮點(diǎn)運(yùn)算是在中斷服務(wù)函數(shù)里邊運(yùn)算的話,浮點(diǎn)運(yùn)算是會(huì)影響中斷的時(shí)序。 而像樓主說的顯示,比如數(shù)碼管,LCD,OLED等等等顯示一些數(shù)據(jù),絕大部分環(huán)境都可以不用浮點(diǎn)數(shù),以免給CPU增加不必要的負(fù)擔(dān)!比如數(shù)碼管顯示37.8,可以用378來代替,自己軟件上記住數(shù)據(jù)被放大10倍就可以了。 |
能用除法,一般沒什么問題,肯定是哪里耦合,而不是除法耦合,除法的運(yùn)算時(shí)間比較長也是存在的事實(shí) |
wufa1986 發(fā)表于 2022-1-7 11:59 看來只有這位朋友知道我說的是什么。 不過,有些時(shí)候是不允許停止中斷的,例如使用外中斷計(jì)數(shù)。 最好能知道軟件除法的代碼,待我上網(wǎng)搜搜看。 |
看單片機(jī)說明,中斷會(huì)干擾浮點(diǎn)運(yùn)算。問題來了,你是在哪里看到這個(gè)說明的? 在中斷中用大量浮點(diǎn)運(yùn)算會(huì)干擾中斷才是的,所以,不要在中斷中使用大量浮點(diǎn)運(yùn)算 你說反了 |
你沒搞明白是怎么回事,影響是中斷在變量運(yùn)算半途進(jìn)入中斷又改變了你運(yùn)算的變量,要軟件處理,比如運(yùn)算結(jié)束前禁止中斷或者運(yùn)算的變量不要用中斷的變量,而是重新賦值新變量去運(yùn)算 |
模擬一次浮點(diǎn)運(yùn)算需要幾百上千條指令,中斷觸發(fā)后會(huì)將一些運(yùn)算有關(guān)的寄存器push進(jìn)去,返回后再全部pop出來繼續(xù)運(yùn)算。 |
你要先明白什么叫浮點(diǎn)運(yùn)算,如果你單片機(jī)沒有硬件浮點(diǎn)運(yùn)算器,是無法進(jìn)行浮點(diǎn)遠(yuǎn)算的。所謂的模擬浮點(diǎn)運(yùn)算,也不是浮點(diǎn)運(yùn)算,而是用整形運(yùn)算,來幫你算出用浮點(diǎn)運(yùn)算才能得到的結(jié)果。 |
wuwei520 發(fā)表于 2022-1-7 10:13 你說的是運(yùn)算結(jié)果還是運(yùn)算過程? |
城夫子 發(fā)表于 2022-1-7 09:37 謝謝回復(fù)。 不過,有關(guān)說明指出,不支持浮點(diǎn)運(yùn)算的單片機(jī)可以用軟件模擬運(yùn)算,但是如果運(yùn)算中被中斷打斷,是無法恢復(fù)的,這樣連結(jié)果都無法得到,就不用說結(jié)果取整了。 |
除法是不是浮點(diǎn)運(yùn)算跟你定義的變量類型有關(guān)系的,如果是定義浮點(diǎn)數(shù)才是浮點(diǎn)運(yùn)算~~~ |
看變量類型,整型變量除法的就是整型 |
Powered by 單片機(jī)教程網(wǎng)