最近瀏覽一個挺流行的視頻——X天學會單片機。內容確實通俗易懂,制作的比較用心。但其中的有個觀點筆者不敢茍同,就是現在 C 語言已經強大到勝任所有任務,大家沒有必要再去學習匯編語言了,直接從 C 學起就行了。
這種觀點似乎有一定道理,我甚至懷疑現在是不是真的有很多同學不再學習匯編了。特別是現在大多數廠商都提供了完備的驅動代碼的情況下,我們做項目基本上用不到寫 ASM 代碼了。
ASM 就要被時代淘汰了!可真的是這樣嗎?
下面我們結合兩個實際工程中碰到的例子談一下,掌握 ASM 語言對我們寫出穩定高效代碼的必要性。
我們看代碼,主程序翻轉 PORTA 的引腳 0,定時中斷服務程序翻轉 PORTA 的引腳 1。乍一看很難看出有什么問題。有不少同學就是這么中招兒的。這要是控制一些 LED 指示燈或蜂鳴器之類的還好,最多就是偶爾看著有點亂,或出點兒噪音。要是控制設備沒準兒就要出大問題了。
有什么問題呢?因為中斷發生時,主程序將在上一條正在執行中的語句執行完后中止運行。這里一定要注意,這里說的語句,不是一條 C 語句,而是一條 ASM 語句。我們在調試環境看一下反匯編。一條 C 語句被編譯成了多條 ASM 語句。
LDRH r1, [r5,#0x14] (1)
EORS r1,r1,r4 (2)
STRH r1,[r5,#0x14] (3)
我們看到一條 C 語句實際上編譯為 3 句 ASM,(1)把 PORTA 當前內容讀進 r1,(2)最低位通過異或取反,(3)把取反后的值輸出至 PORTA。如果中斷恰好發生在 (1)或 (2)的執行期間,那么中斷服務程序對 PORTA 引腳 1 的操作,會被主程序中語句(3)覆蓋掉。
要避免這種情況,可以在操作 IO 端口(或其它類似的操作)前禁止中斷,操作完之后再允許中斷。在一些有位帶(Bit Map)的單片機里,對單個引腳的操作可以通過位帶區操作,避免各引腳之間互相影響。
匯編語言的使用,還可以大幅度的提高代碼的效率。即使現在編譯器的效率已經挺高了,但畢竟機器還是要比人笨一點兒。
舉個例子,有不少工程里面需要用到浮點運算。如果直接調用浮點運算庫,可以輕松的完成任務。但這樣有一個限制,就是運算過程一直以最大的精度來運算,相當浪費 MCU 的時間。
我們的應用可能并不需要這么高的精度,而是需要盡快的完成運算并保留一定精度即可。在此情況下,如果我們用嵌入 ASM 做運算,可以通過減少迭代運算次數 (精度和迭代運算次數成正比)達到快速完成運算。在發動機控制等分秒必爭的領域,有時候這樣做是很有必要的。
責任編輯:haq
-
單片機
+關注
關注
6043文章
44621瀏覽量
638626 -
C語言
+關注
關注
180文章
7614瀏覽量
137739 -
ASM
+關注
關注
1文章
69瀏覽量
19104
原文標題:ASM真要被掃進歷史的垃圾堆了嗎?
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
數據庫數據恢復—Oracle ASM實例無法掛載的數據恢復案例
![數據庫數據恢復—Oracle <b class='flag-5'>ASM</b>實例無法掛載的數據恢復案例](https://file.elecfans.com/web2/M00/6D/03/pYYBAGMxGQOAIdT9AAEmCgX8OAo311.png)
Purepath studio生成的ASM文件有好幾個 ,應該選擇哪個文件加載到工程文件中?
ASM推出全新PE2O8碳化硅外延機臺
![<b class='flag-5'>ASM</b>推出全新PE2O8碳化硅外延機臺](https://file1.elecfans.com//web1/M00/F3/1D/wKgaoWcQn8qAWdgMAAFIoCIi1r8590.jpg)
ASM推出全新PE2O8碳化硅外延機臺
![<b class='flag-5'>ASM</b>推出全新PE2O8碳化硅外延機臺](https://file1.elecfans.com//web1/M00/F3/1D/wKgaoWcQn8iAd_bPAABq829yqXE083.png)
PCM5101在ASM3M項目上的問題?
換電要被超快充淘汰了?
ASM330LHH使用FIFO閾值中斷輸出時工作異常的原因?
車路云協同,這次它真的來了嗎?
![車路云協同,這次它真的來<b class='flag-5'>了嗎</b>?](https://file.elecfans.com/web2/M00/50/DA/pYYBAGLH6TyAB71EAAAPQ7KgtYA038.png)
意法半導體推出了汽車級慣性模塊ASM330LHBG1
![意法半導體推出了汽車級慣性模塊<b class='flag-5'>ASM</b>330LHBG1](https://file1.elecfans.com/web2/M00/E5/43/wKgZomZCuPGAWVwkAAAlw72Bm3g203.png)
采用ASM330LHH慣導模塊輸出異常的原因?
不會用AI的人被淘汰?訊飛AI鼠標AM30助你迎接AI時代
![不會用AI的人被<b class='flag-5'>淘汰</b>?訊飛AI鼠標AM30助你迎接AI<b class='flag-5'>時代</b>](https://file1.elecfans.com//web2/M00/C5/87/wKgZomX-bFaAXjP0AADS60_oYzQ38.jpeg)
評論