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