{eval=Array;=+count(Array);}
C語言是發(fā)展趨勢,匯編可以幫助學(xué)生熟悉單片機(jī)內(nèi)部結(jié)構(gòu)。
首先匯編語言和C語言都是編程語言,匯編是一種機(jī)器語言直接面對底層,與單片機(jī)底層硬件構(gòu)架息息相關(guān),相對于C語言,是一門低級語言,C語言面向過程的語言,在編譯執(zhí)行會轉(zhuǎn)為匯編在生成單片機(jī)可執(zhí)行文件。是一門高級語言,兩種語言各有優(yōu)缺點。
1學(xué)習(xí)難度。
匯編因為的理解難度和開發(fā)難度比C語言大,所以學(xué)習(xí)難度大,都是對寄存器操作,學(xué)習(xí)匯編就要學(xué)習(xí)這個單片機(jī)的硬件結(jié)構(gòu)和基本組成、存儲器訪問方式、單片機(jī)I/O操作時序、定時計數(shù)器、中斷處理、指令系統(tǒng)、尋址方式等知識點;而且每個系列芯片的內(nèi)部寄存地址和寄存器都有差異,維護(hù)起來也十分困難。
2執(zhí)行效率
匯編實時性比C語言好,占用單片機(jī)資源少,生成的執(zhí)行文件更小,匯編語言程序直接被轉(zhuǎn)換成機(jī)器指令。而C語言編譯過程會先形成匯編,在轉(zhuǎn)為機(jī)器語言。
3移植性
C語言比匯編移植性好,程序可讀性比匯編要強(qiáng)。實現(xiàn)相同功能,C語言的代碼數(shù)量會比較短,對于匯編來說,每一種單片機(jī)匯編語言都不一樣。所以移植性差。
C語言通過結(jié)構(gòu)體,指針映射寄存器地址,當(dāng)有需要時候,只需要簡單更改寄存器地址,或者更改寄存器定義,即可滿足程序和工程的移植。
4,調(diào)試
C語言調(diào)試方便,例如STM32開發(fā)過程中,可以使用jlink通過SWD進(jìn)行在線仿真,調(diào)試各語法,語句執(zhí)行情況,還可以查看各變量值的變化,很容易就能定位到BUG問題。而匯編調(diào)試?yán)щy,很多時候難以很快定位問題。
單片機(jī)在上個世紀(jì)七十年代開始出現(xiàn),早期都使用匯編語言進(jìn)行開發(fā),隨著技術(shù)的發(fā)展進(jìn)步,制程工藝快速提升,單片機(jī)的處理速度越來越快,很多單片機(jī)的開發(fā)環(huán)境都使用C語言編譯,生產(chǎn)二進(jìn)制文件。
但因產(chǎn)品BOM成本要求,很多的低端單片機(jī)還是OTP一次性燒錄,程序空間小,許多的型號,還是在用匯編進(jìn)行開發(fā),如義隆,松翰等。
1,大學(xué)時學(xué)習(xí)匯編,有助于理解單片機(jī)系統(tǒng)構(gòu)架,指令集,和寄存器尋址等知識點,也促進(jìn)對于C語言的指針的用法。
2,目前的linux開發(fā)的部分底層bootload文件,或stm32的.s啟動文件就是使用匯編語言的文件,都使用匯編進(jìn)行底層引導(dǎo)。修改堆棧,或者程序起始運(yùn)行的位置,都需要在對應(yīng)文件中修改?;蛘邔W(xué)習(xí)UCOS也會涉及修改啟動文件內(nèi)相關(guān)數(shù)據(jù)。
當(dāng)前設(shè)備半導(dǎo)體的成本,隨著制程工藝的提升而降低,越來越多的低端8位單片機(jī)開始從匯編轉(zhuǎn)向到C語言,單片機(jī)也往更高集成度,更強(qiáng)大功能發(fā)展。
所以學(xué)習(xí)單片機(jī)不一定要精通匯編,但對匯編有一定了解,對學(xué)習(xí)單片機(jī)有幫助,只有在某一些功能需求時,可以適當(dāng)運(yùn)用匯編。
現(xiàn)在一般單片機(jī)都支持C語言和晦澀難懂的匯編語言,在許多介紹單片機(jī)應(yīng)用技術(shù)的教材中有相當(dāng)一部分是用匯編語言編寫的這說明匯編語言在學(xué)習(xí)單片機(jī)和編寫單片機(jī)程序時尤其獨特的優(yōu)勢,現(xiàn)在我把學(xué)習(xí)單片機(jī)使用匯編語言的一些優(yōu)勢來發(fā)表自己的看法,希望能夠通過我說的這幾點給學(xué)習(xí)單片機(jī)的朋友們一個參考意見并順便解答一下這個問題。
雖然單片機(jī)匯編語言在剛學(xué)初期會顯得“晦澀難懂”但也并不是“一無是處”,在有些方面是單片機(jī)C語言所不能企及的,比如匯編語言首先在機(jī)器碼生成方面其效率要比C語言高20%,所以用匯編語言編寫程序能夠減少占用單片機(jī)里的寄存器單元,特別是對于容量小的單片機(jī)而言很重要??傊畢R編語言要比C語言執(zhí)行效率更高。
我們知道任何編程語言最終都要生成單片機(jī)能夠“識別”和執(zhí)行的二進(jìn)制碼,由于匯編語言可以直接訪問單片機(jī)的內(nèi)部寄存器,所以單片機(jī)的匯編語言執(zhí)行速度要比C語言快的多,可以實施精細(xì)而準(zhǔn)確 的控制,在一些實時控制要求比較嚴(yán)格的控制場合一般要求用匯編語言。
由于匯編語言的每條指令與單片機(jī)的指令碼是一一對應(yīng)的,所以通過學(xué)習(xí)單片機(jī)的匯編語言有助于學(xué)習(xí)單片機(jī)內(nèi)部結(jié)構(gòu)組成以及它的外設(shè)。尤其是對熟悉單片機(jī)內(nèi)部的各種寄存器有很大的幫助。
鑒于以上三點我認(rèn)為,單片機(jī)C語言編程和匯編語言編程各有各的特點,要想學(xué)好單片機(jī)并運(yùn)用好單片機(jī)就要把這兩種單片機(jī)語言都要學(xué)好才行。
以上就是我對這個問題的看法,歡迎朋友們參與討論。敬請關(guān)注電子及工控技術(shù),歡迎大家點贊
要看是什么單片機(jī)。
如STM32。用C語言很合適,絕大多數(shù)工作都可以而且應(yīng)該用C或者更高級的語言完成。只有極少數(shù)對性能或代碼空間要求高的部分需要用匯編語言實現(xiàn)。
這類單片機(jī)在實際工作中也很少用到匯編,C語言基本能滿足開發(fā)各種功能的需求。
如51系列,部分AVR。性能低,C編譯器也不夠標(biāo)準(zhǔn)。尤其因為歷史上C編譯器較昂貴,所以在這些平臺上有大量匯編語言開發(fā)的積累。
另外,低端單片機(jī)往往實現(xiàn)的是簡單邏輯,用匯編語言開發(fā)慣了的人,也沒有太大動力改用C語言。
這樣以來,學(xué)校課程中使用匯編語言也就正常了:既體現(xiàn)了一定的歷史慣性、也有助于更深入的理解單片機(jī)系統(tǒng)。
從自己學(xué)習(xí)來說,匯編語言了解一下還是不錯的。深入學(xué)習(xí)還是選C,以后單片機(jī)上直接用匯編的會越來越少。
現(xiàn)在常見的用匯編的一些場合,往往有嚴(yán)格的時間要求。比如中斷,特別是arm的快速中斷,還比如一些對時間要求非常高的測控場合,可能要求微秒甚至納秒級別的響應(yīng)速度。這些應(yīng)用在編程的時候有可能會一條指令的執(zhí)行時間也會考慮。還有一些重復(fù)進(jìn)行的運(yùn)算函數(shù),如果重復(fù)的次數(shù)多,又對時間有要求,那函數(shù)的執(zhí)行時間又需要一條一條指令的扣。
還有一些場合,應(yīng)用的cpu ,比如有些pic單片機(jī),只有1k甚至512字節(jié)的空間,rom空間比較小,c語言優(yōu)化后的編譯代碼,可能還是不如純粹的匯編精簡,這就需要匯編。
還有一些其他場合也是對代碼空間有要求,比如linux啟動的bootloader,還有PC上常見的常見文件系統(tǒng)mbr代碼,也需要用匯編來編寫。
此外對于單純的學(xué)習(xí)來講,匯編語言跟硬件的關(guān)系更密切,更直接,學(xué)習(xí)匯編更有利于理解單片機(jī)的結(jié)構(gòu)。
因為很多廉價的芯片采用私有指令集,沒有C編譯器,只能用匯編。這類芯片價格便宜,用量遠(yuǎn)遠(yuǎn)超過stm avr stc這些。
目前很多主流單片機(jī)都是支持C語言編寫,廠商會提供相應(yīng)的C語言庫,編譯器也大都支持C語言開發(fā),C語言上手快學(xué)習(xí)成本低,只是應(yīng)用層面的話其實C語言就差不多夠用了。但是使用C編寫最后還是會被編譯器變成匯編代碼,實質(zhì)還是在寫匯編。匯編效率高,對機(jī)器直接操作,更加底層,所以想深入的學(xué)習(xí)單片機(jī),匯編是不可不學(xué)的,并且一般最底層設(shè)置都是匯編寫的,還有不少底層設(shè)置是無法用C去調(diào)用或者改寫的,這個時候看懂匯編和使用匯編就很重要了。
如果不涉及底層開發(fā),可以不學(xué)匯編語言。但最好懂一點。懂匯編,比較容易真正的理解計算機(jī)運(yùn)行的機(jī)理。
10
回答10
回答3
回答7
回答10
回答10
回答5
回答10
回答10
回答0
回答