最近瀏覽一個(gè)挺流行的視頻——X天學(xué)會(huì)單片機(jī)。內(nèi)容確實(shí)通俗易懂,制作的比較用心。但其中的有個(gè)觀點(diǎn)筆者不敢茍同,就是現(xiàn)在 C 語(yǔ)言已經(jīng)強(qiáng)大到勝任所有任務(wù),大家沒(méi)有必要再去學(xué)習(xí)匯編語(yǔ)言了,直接從 C 學(xué)起就行了。
這種觀點(diǎn)似乎有一定道理,我甚至懷疑現(xiàn)在是不是真的有很多同學(xué)不再學(xué)習(xí)匯編了。特別是現(xiàn)在大多數(shù)廠商都提供了完備的驅(qū)動(dòng)代碼的情況下,我們做項(xiàng)目基本上用不到寫(xiě) ASM 代碼了。
ASM 就要被時(shí)代淘汰了!可真的是這樣嗎?
下面我們結(jié)合兩個(gè)實(shí)際工程中碰到的例子談一下,掌握 ASM 語(yǔ)言對(duì)我們寫(xiě)出穩(wěn)定高效代碼的必要性。
我們看代碼,主程序翻轉(zhuǎn) PORTA 的引腳 0,定時(shí)中斷服務(wù)程序翻轉(zhuǎn) PORTA 的引腳 1。乍一看很難看出有什么問(wèn)題。有不少同學(xué)就是這么中招兒的。這要是控制一些 LED 指示燈或蜂鳴器之類的還好,最多就是偶爾看著有點(diǎn)亂,或出點(diǎn)兒噪音。要是控制設(shè)備沒(méi)準(zhǔn)兒就要出大問(wèn)題了。
有什么問(wèn)題呢?因?yàn)橹袛喟l(fā)生時(shí),主程序?qū)⒃谏弦粭l正在執(zhí)行中的語(yǔ)句執(zhí)行完后中止運(yùn)行。這里一定要注意,這里說(shuō)的語(yǔ)句,不是一條 C 語(yǔ)句,而是一條 ASM 語(yǔ)句。我們?cè)谡{(diào)試環(huán)境看一下反匯編。一條 C 語(yǔ)句被編譯成了多條 ASM 語(yǔ)句。
LDRH r1, [r5,#0x14] (1)
EORS r1,r1,r4 (2)
STRH r1,[r5,#0x14] (3)
我們看到一條 C 語(yǔ)句實(shí)際上編譯為 3 句 ASM,(1)把 PORTA 當(dāng)前內(nèi)容讀進(jìn) r1,(2)最低位通過(guò)異或取反,(3)把取反后的值輸出至 PORTA。如果中斷恰好發(fā)生在 (1)或 (2)的執(zhí)行期間,那么中斷服務(wù)程序?qū)?PORTA 引腳 1 的操作,會(huì)被主程序中語(yǔ)句(3)覆蓋掉。
要避免這種情況,可以在操作 IO 端口(或其它類似的操作)前禁止中斷,操作完之后再允許中斷。在一些有位帶(Bit Map)的單片機(jī)里,對(duì)單個(gè)引腳的操作可以通過(guò)位帶區(qū)操作,避免各引腳之間互相影響。
匯編語(yǔ)言的使用,還可以大幅度的提高代碼的效率。即使現(xiàn)在編譯器的效率已經(jīng)挺高了,但畢竟機(jī)器還是要比人笨一點(diǎn)兒。
舉個(gè)例子,有不少工程里面需要用到浮點(diǎn)運(yùn)算。如果直接調(diào)用浮點(diǎn)運(yùn)算庫(kù),可以輕松的完成任務(wù)。但這樣有一個(gè)限制,就是運(yùn)算過(guò)程一直以最大的精度來(lái)運(yùn)算,相當(dāng)浪費(fèi) MCU 的時(shí)間。
我們的應(yīng)用可能并不需要這么高的精度,而是需要盡快的完成運(yùn)算并保留一定精度即可。在此情況下,如果我們用嵌入 ASM 做運(yùn)算,可以通過(guò)減少迭代運(yùn)算次數(shù) (精度和迭代運(yùn)算次數(shù)成正比)達(dá)到快速完成運(yùn)算。在發(fā)動(dòng)機(jī)控制等分秒必爭(zhēng)的領(lǐng)域,有時(shí)候這樣做是很有必要的。
責(zé)任編輯:haq
-
單片機(jī)
+關(guān)注
關(guān)注
6032文章
44516瀏覽量
633035 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7598瀏覽量
136199 -
ASM
+關(guān)注
關(guān)注
1文章
68瀏覽量
19014
原文標(biāo)題:ASM真要被掃進(jìn)歷史的垃圾堆了嗎?
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論