標(biāo)題: 請(qǐng)教各位單片機(jī)開中斷能用除法嗎? [打印本頁]

作者: 風(fēng)158    時(shí)間: 2022-1-7 08:26
標(biāo)題: 請(qǐng)教各位單片機(jī)開中斷能用除法嗎?
看單片機(jī)說明,中斷會(huì)干擾浮點(diǎn)運(yùn)算。問題來了,除法是浮點(diǎn)運(yùn)算嗎?開中斷時(shí)能用嗎?若不能用,顯示各位數(shù)字時(shí)怎么辦?

作者: 城夫子    時(shí)間: 2022-1-7 09:37
看變量類型,整型變量除法的就是整型
作者: wuwei520    時(shí)間: 2022-1-7 10:13
除法是不是浮點(diǎn)運(yùn)算跟你定義的變量類型有關(guān)系的,如果是定義浮點(diǎn)數(shù)才是浮點(diǎn)運(yùn)算~~~
作者: 風(fēng)158    時(shí)間: 2022-1-7 10:39
城夫子 發(fā)表于 2022-1-7 09:37
看變量類型,整型變量除法的就是整型

謝謝回復(fù)。
不過,有關(guān)說明指出,不支持浮點(diǎn)運(yùn)算的單片機(jī)可以用軟件模擬運(yùn)算,但是如果運(yùn)算中被中斷打斷,是無法恢復(fù)的,這樣連結(jié)果都無法得到,就不用說結(jié)果取整了。
作者: 風(fēng)158    時(shí)間: 2022-1-7 10:41
wuwei520 發(fā)表于 2022-1-7 10:13
除法是不是浮點(diǎn)運(yùn)算跟你定義的變量類型有關(guān)系的,如果是定義浮點(diǎn)數(shù)才是浮點(diǎn)運(yùn)算~~~

你說的是運(yùn)算結(jié)果還是運(yùn)算過程?
作者: 188610329    時(shí)間: 2022-1-7 11:12
你要先明白什么叫浮點(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é)果。
作者: npn    時(shí)間: 2022-1-7 11:54
模擬一次浮點(diǎn)運(yùn)算需要幾百上千條指令,中斷觸發(fā)后會(huì)將一些運(yùn)算有關(guān)的寄存器push進(jìn)去,返回后再全部pop出來繼續(xù)運(yùn)算。
作者: wufa1986    時(shí)間: 2022-1-7 11:59
你沒搞明白是怎么回事,影響是中斷在變量運(yùn)算半途進(jìn)入中斷又改變了你運(yùn)算的變量,要軟件處理,比如運(yùn)算結(jié)束前禁止中斷或者運(yùn)算的變量不要用中斷的變量,而是重新賦值新變量去運(yùn)算
作者: Y_G_G    時(shí)間: 2022-1-7 12:51
看單片機(jī)說明,中斷會(huì)干擾浮點(diǎn)運(yùn)算。問題來了,你是在哪里看到這個(gè)說明的?
在中斷中用大量浮點(diǎn)運(yùn)算會(huì)干擾中斷才是的,所以,不要在中斷中使用大量浮點(diǎn)運(yùn)算
你說反了

作者: 風(fēng)158    時(shí)間: 2022-1-7 14:03
wufa1986 發(fā)表于 2022-1-7 11:59
你沒搞明白是怎么回事,影響是中斷在變量運(yùn)算半途進(jìn)入中斷又改變了你運(yùn)算的變量,要軟件處理,比如運(yùn)算結(jié)束 ...

看來只有這位朋友知道我說的是什么。
不過,有些時(shí)候是不允許停止中斷的,例如使用外中斷計(jì)數(shù)。
最好能知道軟件除法的代碼,待我上網(wǎng)搜搜看。
作者: aa62241122    時(shí)間: 2022-1-7 14:07
能用除法,一般沒什么問題,肯定是哪里耦合,而不是除法耦合,除法的運(yùn)算時(shí)間比較長也是存在的事實(shí)
作者: MCU_FANS    時(shí)間: 2022-1-7 14:20
目前應(yīng)該沒有單片機(jī)的中斷會(huì)干擾浮點(diǎn)運(yùn)算,因?yàn)檫M(jìn)中斷和出中斷都有對(duì)應(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倍就可以了。
作者: 851364143    時(shí)間: 2022-1-7 15:27
除法是不是浮點(diǎn)運(yùn)算跟你定義的變量類型有關(guān)系的,需要是定義浮點(diǎn)數(shù)才是浮點(diǎn)運(yùn)算
作者: npn    時(shí)間: 2022-1-7 15:43
如果堆棧出現(xiàn)了問題,別說干擾浮點(diǎn)計(jì)算,PC指針都能彈飛。
作者: 風(fēng)158    時(shí)間: 2022-1-7 20:58
MCU_FANS 發(fā)表于 2022-1-7 14:20
目前應(yīng)該沒有單片機(jī)的中斷會(huì)干擾浮點(diǎn)運(yùn)算,因?yàn)檫M(jìn)中斷和出中斷都有對(duì)應(yīng)的現(xiàn)場保護(hù)和現(xiàn)場恢復(fù)。相反,如果浮 ...

有的教程明確指出,單片機(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é)果。

作者: 風(fēng)158    時(shí)間: 2022-1-7 21:06
謝謝各位積極發(fā)言。
經(jīng)過查找發(fā)現(xiàn),兩整數(shù)模擬除法運(yùn)算并不產(chǎn)生小數(shù),而是產(chǎn)生整數(shù)的商和余數(shù),不是浮點(diǎn)運(yùn)算。但是模擬除法運(yùn)算非常耗時(shí),提倡盡量少用。
作者: 188610329    時(shí)間: 2022-1-7 21:15
風(fēng)158 發(fā)表于 2022-1-7 20:58
有的教程明確指出,單片機(jī)浮點(diǎn)運(yùn)算以及不可再入函數(shù)可能會(huì)被中斷打斷終止,產(chǎn)生不可預(yù)料結(jié)果,一般不提倡 ...

你 C 語言編程,還真編不出 不可再入函數(shù)來……

也許是我C語言太渣吧,反正,我C語言寫的代碼,編譯后察看M51文件,所有函數(shù)都是以?開頭的可再入函數(shù),要想編一個(gè)不可再入函數(shù),不得不通過匯編去寫。
你如果有辦法在 C 語言環(huán)境下編出不可再入函數(shù),麻煩指點(diǎn)一二,真的想學(xué)。
作者: Hephaestus    時(shí)間: 2022-1-7 22:49
風(fēng)158 發(fā)表于 2022-1-7 20:58
有的教程明確指出,單片機(jī)浮點(diǎn)運(yùn)算以及不可再入函數(shù)可能會(huì)被中斷打斷終止,產(chǎn)生不可預(yù)料結(jié)果,一般不提倡 ...

你看到的教程的說法全都是錯(cuò)誤的。

作者: Hephaestus    時(shí)間: 2022-1-7 22:52
188610329 發(fā)表于 2022-1-7 21:15
你 C 語言編程,還真編不出 不可再入函數(shù)來……

也許是我C語言太渣吧,反正,我C語言寫的代碼,編譯后 ...

在標(biāo)準(zhǔn)c語言里面,函數(shù)局部變量是在堆棧上臨時(shí)分配的,這種函數(shù)可遞歸,可再入。但是對(duì)于8位單片機(jī)來說,這種做法消耗太大,尤其是RAM空前緊張的8051體系,所以編譯器用了非正規(guī)的快速簡潔的實(shí)現(xiàn)方法,分析函數(shù)間調(diào)用層級(jí),給局部變量分配一個(gè)固定的地址,比如25H吧,這種函數(shù)就是不遞歸的,一旦發(fā)生了重入,被打斷的函數(shù)的局部變量被重進(jìn)函數(shù)給徹底破壞了。
作者: 風(fēng)158    時(shí)間: 2022-1-8 00:50
好吧,我看到的教程可能是錯(cuò)誤的,但是我編的程序會(huì)遵守這個(gè)教程的。另外把我看到的教程貼出來,有興趣的朋友繼續(xù)研究吧。

無標(biāo)題.png (127.09 KB, 下載次數(shù): 56)

無標(biāo)題.png

作者: Hephaestus    時(shí)間: 2022-1-8 01:11
風(fēng)158 發(fā)表于 2022-1-8 00:50
好吧,我看到的教程可能是錯(cuò)誤的,但是我編的程序會(huì)遵守這個(gè)教程的。另外把我看到的教程貼出來,有興趣的朋 ...

你在15樓發(fā)言中只有不可再入部分是對(duì)的,但是C51會(huì)給出錯(cuò)誤信息,無法通過編譯,所以即使這個(gè)知識(shí)點(diǎn)是對(duì)的也是毫無價(jià)值的。

其他知識(shí)點(diǎn)完全錯(cuò)誤。
作者: 123456ZXC1    時(shí)間: 2022-1-8 15:01
看你自己定義的數(shù)據(jù)類型  而且中斷不干擾吧




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1