![]() |
發布時間: 2021-10-30 15:29
正文摘要:使用unsigned int時為啥出現了圖片的兩種情況,1、用unsigned int cnt時判斷表達式>=時計數到768就進入if里了 2、用unsigned int cnt時判斷表達式==時計數到1000就進入if里了。二者理論上都應該是計數到1000進入if ... |
謝謝各位的解答![]() |
Hephaestus 發表于 2021-10-30 23:06 謝謝大佬解決了我的疑問 ![]() |
Hephaestus 發表于 2021-10-30 23:06 好的,你是對的. |
Y_G_G 發表于 2021-10-30 22:37 都不對,你沒理解什么是原子操作。 對于8位單片機,16位的cnt不管是>=1000還是==1000都需要兩步比較,如果兩次中間插入中斷cnt++會破壞cnt的值,或者改變CY等標志位的狀態,導致比較結果錯誤。 避免這種錯誤有兩種解決辦法。1)比較前關中斷,比較后開中斷。2)把定時中斷時間間隔改成4ms,這樣cnt就可以用unsigned char類型,不管是比較還是++都可以在一個指令內完成,不怕被中間打斷。 |
unsigned int cnt是全局變量,而且cnt是在中斷中改變的 if (cnt==1000)雖然在仿真時候能給你想要的結果 但實際使用中,if (cnt>=1000)才是正確的 |
188610329 發表于 2021-10-30 18:59 那就是原子操作的問題,樓主應該檢查中斷里面用到cnt沒有。 |
當使用8位機系統的時候, 如果 中斷 和 主程序 都會操作同一個變量的時候, 那么, 這個變量應該避免 超過一個字節(8位)。尤其是當你使用的C語言,而不是匯編的話, 會有不可控的情況發生。 |
個人覺得,你應該再審一下題,1和2是一樣的unsigned int cnt |