雷竞技推荐码怎么获得

 找回密碼
 raybet12
查看: 2158|回複: 0
打印 上一主題 下一主題

stm32單片機怎麼學

[複製鏈接]
跳轉到指定樓層
樓主
發表於 2022-2-15 21:17:41 | 隻看該作者 |隻看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
進入臨界就是關閉單片機總中斷,退出臨界就是恢複單片機中斷,記住最好是恢複,不是打開,因為進入臨界之前單片機總中斷未必是開著的。
那為什麼要進入臨界?有什麼作用?
我們假設一種場景:
stm32單片機怎麼學

我們來看這樣一段代碼。
假設我們程序執行到第12行,也就是a = 0的位置,*p的值肯定是等於2的對吧?
突然有個定時器中斷來了,然後在定時器中斷處理函數裏麵,我們執行了p++。
執行完以後回到主程序繼續執行,也就是會去執行13行代碼,這個時候*p的值你猜猜是多少?
沒錯,肯定不是2,而是3。
明明條件判斷是2,最後值卻變成了3,這種bug估計能調到你哭。
這個時候進入臨界就穩得一逼了,可以改成如下代碼。
stm32單片機怎麼學

STM32不像51單片機這樣直接EA=0就能關閉總中斷,而是通過__get_PRIMASK和__set_PRIMASK來做,當然也可以用__disable_irq和__enable_irq。
具體的可以在工程裏搜索,看注釋。
每個單片機關閉總中斷的方式都不一樣,所以進入臨界和退出臨界代碼也有所區別。
你隻需要記住本質就是關總中斷,執行完程序後,恢複總中斷就行了。
不用過於擔心單片機總中斷怎麼開關的問題,網上隨便都能搜到。
那繼續聊下我們上麵那個程序,很多人可能會說,我寫程序的時候規避這種問題,不在定時器裏對p指針進行操作不就行了?
如果你是做一些比較大的項目,幾乎不可能避免,比如說我們的隊列算法。
我們會在串口中斷裏接收到數據以後,把數據丟進隊列,然後在主函數進行解析。
stm32單片機怎麼學

用了隊列以後,數據傳輸穩定性可以大大提升,哪怕是數據傳輸很快,數據量很大也不會出現丟包的情況。
我們不妨來看下隊列算法的入列函數。
stm32單片機怎麼學

這種,如果不用指針,幾乎不可能實現,哪怕實現了靈活性和移植性也不高。
試想一下,如果這種在主函數和中斷裏都會頻繁去操作指針,不做臨界的話程序很容易因為指針指向異常導致死機或者數據錯亂導致的程序邏輯問題。
當然,進入臨界除了保護全局變量、數組、結構體等數據不錯亂以外,還能是硬件的數據,比如IO、SCI、SPI、flash。

回複

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即注冊

本版積分規則

雷竞技推荐码怎么获得 ( )

GMT+8, 2024-8-28 08:23

Powered by © 2011-2022 www.hazyshadow.com 版權所有 免責聲明 不良信息舉報

技術驅動未來! 雷竞技推荐码怎么获得—專業電工基礎知識雷竞技 pc版學習網站。

欄目導航: 工控家園 | 三菱plc | 西門子plc | 歐姆龍plc | plc視頻教程

快速回複 返回頂部 返回列表