總網頁瀏覽量

2020年9月16日 星期三

8051 MCU 錯誤觀念闢除 第二彈文章!

為了闢除許多人對於嵌入式系統基礎學習的一些錯誤觀念,之前有發表過一篇文章:


但發現還是有不少朋友無法完整理解上列文章內容,在這裡做一些常見的錯誤觀念迷思的Q&A給大家參考:

Q1: 32bits ARM based的MCU不是比較好嗎?何必學這麼老舊的8051 MCU?

A1: 雖然上面內容中已經有說明,但這裡再詳細解釋。

很多人都誤以為用規格比較強的學習教材(嵌入式硬體平台),就代表自己神功附體,以為這樣子就可以讓學習效率大增。事實上,許多人常迷信於表面,以為自己用所謂ARM based的平台就代表自己比較厲害? 但其實在MCU應用開發的這塊,有多少人有去了解ARM CPU架構和指令集?多數人包含開課的講師通常也只不過將這個平台當成一塊MCU去跑code去設定周邊的registers而已不是嗎?有真正摸到ARM CPU架構嗎? 終究不就只是在玩一塊比較複雜的MCU? 真的有因為用ARM based的MCU所以就有去實際接觸到ARM CPU嗎? 終究不也是只是一樣在應用MCU內的各式周邊(如UART、I2C、SPI等等)? 其實CPU這塊當然是要有人理解的,例如搞出這個MCU軟體編譯工具與開發環境的工程師們,但這塊大多數已經被開源社群與IC design house做掉了,但這塊大多數已經被IC design house做掉了,對於MCU應用開發者來說,這塊已經是現成的工具。舉個例子,多數人玩MCU的C語言程式起跑點是main function,但是事實上在code flow跑到main function之前早就已經必須先去做其他事(startup),例如針對堆疊進行初始化等等(否則哪有C語言裡面這樣可以呼叫到函數跳來跳去的流程可用呢?),這塊是必要的,但是多數MCU應用者是拿現成的。好,把話題拉回來,用32bits MCU給初學者學,初學者真的會去細細探究這些已經是現成但較深入的部分嗎? 不會的,反而會因為32bits MCU的周邊大多較新穎又比8051的周邊複雜許多,反而會去忽略一些重要的周邊操作員裡細節基礎,而且也會因此而不敢挑戰這裡所說的所謂現成的部分(如透過Assembly組合語言去熟悉指令集),畢竟ARM(即便是ARM Cortex-Mx系列)指令集對於多數的所謂MCU應用初學者來說太複雜了(當然做MCU系統應用開發也未必就一定要很懂CPU這部分,但是用簡單具體而微的平台來熟悉一次這些細節,其基礎不是會更紮實嗎? 而且也會包含一些重要的細節如中斷、堆疊等底層原理,這就是我說的為何MCU初學者應該要先以8051這類較簡單MCU來入門的原因。並不是拿8051來應用,而是透過較簡易的MCU來徹底的了解一次MCU底層的這些細節,在經歷過這樣的過程後,未來要再接觸較複雜的MCU基本上也不是太大的問題)。反過來,如果一開始就學32bits MCU,不但可能沒有真正學到什麼ARM CPU架構,而且反而可能會因為這類MCU周邊的複雜度而混淆初學者應該要學到的一些重點,反而未必會讓基礎紮實。例如某些32bits MCU的Timer模式眾多且其對應設定過程相對繁複,因為這是針對許多現代各式產品應用而生,但這對於多數初學者而言可能太複雜了,其實初學者只要從8051那類較簡易的Timer去理解什麼是Timer和實際上如何使用的原理就夠了,而往後如果需要了解更複雜的Timer相信也不會是太大的問題,寧可不要讓初學者因為太複雜的周邊導致觀念混淆或者提前放棄。

其實接觸國內名校的這些年來,我發現即便光是8位元的MCU,其實我沒看過有多少名校學生真正在第一次課程內就學得好的,至今依舊如此(MCU基礎範圍內其實還有基本介面電子電路等硬體觀念,並非只有MCU本身)。如果一開始就用複雜的MCU當教材,只是表面上好像用很新很強的平台在學習,但實際上並沒有讓初學者學得比較紮實,

就像樹莓派學其實是個非常非常龐大的系統,許多初學者或學生表面上都會用,但是這類平台下面的內容硬要說起來就多得跟大海一樣廣又深,表面上的功能會動並不代表學生已經掌握了這些內容,只是拿了很多現成的東西去做相當後續的應用而已...我的第一份工作的公司就是做這類平台的,從這種大SoC IC到上面的整個系統軟韌體,這個複雜度比MCU還高太多太多(所以這種公司的研發工程師人數也很多),而許多初學者或學生甚至規劃課程的老師們並沒有去了解以及看到這個面向。而自己曾經帶過的同學們也蠻多在國內知名的MCU IC設計公司服務,所以整體來說,從產業經驗來回頭看,我還是覺得8051蠻適合教學的。

--------

Q2: 8051時脈這麼慢,學這有用嗎?

A2: 其實這又是類似Q1的問題(千篇一律),我認為對於專業技術的學習效率應該不是硬體規格問題,學習一門技術所應該著重的是基礎,而不是在比較實驗教材的規格強弱(就像是使用個人電腦的人就代表懂個人電腦這麼複雜的系統設計嗎),何況MCU在多數的應用上通常本來就不是在比速度的呀(這是用途差異的問題),例如做許多I/O控制應用大多不需要太過於高速,畢竟需要等待例如馬達這些設備的反應,這些機電設備的反應動作速度是遠比不上MCU內的CPU的。如果在應用上需要複雜的演算,從系統設計的角度上來說,也未必適合在MCU端來做全部的演算,應由本身具備較強運算功能的平台專門做演算。(補充一下,近年來ST等大廠有一些很不像傳統MCU的較高速的MCU產品推出,通常用在某些具備多媒體應用功能的消費性電子產品裝置,但這類的MCU平台規格已經和網路多媒體類的SoC或Embedded Microprocessor這類通常具有MMU的CPU的平台的應用很相近了)。

--------

Q3: 近代新的MCU大多是32 bits,很多還是based on ARM Cortex-Mx CPU的MCU(如STM32/笙泉/盛群/新唐/松翰等廠商接有出產這類的MCU IC產品),若用8051會不會因為期開發環境太老舊而導致學習者在往後無法適應32 bits MCU呢?

A3: 這不太是問題,因為現代MCU應用開發,不論8051 MCU或者32bits MCU,其開發環境基本上都是使用現成的圖形介面IDE(整合開發環境,如KEILC、IAR、STM32Cube等等),其環境大同小異(應該說幾乎一樣)。真正與MCU開發環境差異大的是Embedded Linux或者更精確地說是Linux kernel space相關系統軟體的開發,幾乎全部都是透過terminal敲指令式的開發環境,這種環境下很可能根本沒有IDE這類現成的圖形化介面可用,且就開發文化/生態系而言大多還是指令式較多。

--------

Q4: 繼Q1,初學者或學生們會因為用ARM based的MCU或SoC板子而突然神功附體、學習效益突飛猛進嗎?

A4: 不會。因為初學者和學生的普遍學習狀況並不會因為硬體平台規格增強,所以就學得比較好和比較多。實際上,對於大多數的初學者來說,硬體平台複雜反而容易忽略很多重要的觀念,正因為複雜,為了能看到東西會動(功能會動),反而會使用表面或現成的內容草草帶過,其觀念容易零碎化。與其如此,那還不如用麻雀雖小五臟俱全、具體而微、易於學習掌握的平台,還比較能夠掌握到底層的細節基礎,雖然是具體而微的平台,但在學習體會過這些基礎內容之後,未來再去接觸複雜的平台也比較能接受,也比較有觀念,比較不會太過零碎。

--------

Q5: 那照上面這樣說,初學者學習MCU是否一定只能學8051不可?

A5: 當然不一定只能用8051不可! 我也不是要當什麼8051的死忠擁護愛戴者,這些東西(平台)都是死的,沒什麼好迷信或死忠的。關鍵是要能從這些東西(平台)學到紮實且能延伸融會貫通的技術經驗和專業知識,才是核心重點。
如果今天有一款平台像是8051這樣,擁有麻雀雖小五臟俱全且具體而微的特性,複雜度不至於太高(對初學者來說其實如果談細節的話還是不容易)的MCU,而且又有很多技術資料可參考(容易取得),那當然絕對不一定只能用8051。
會推薦8051的原因只不過是因為這是一顆快要40年的長青樹等級的MCU,除了擁有較容易入門的特性外(事實上如果是用assembly並且針對MCU硬體架構細節原理去琢磨也已經有一些複雜度了),其技術資料、書籍和各路技術高手與網友們的經驗非常多,初學者相當容易取得這些資料來做為學習教材,所以才會這麼推薦用8051 MCU來作為教學平台。
另外再次重申/強調,教學應該著重於基礎技術觀念的紮實度,而不該只是看重讓東西(功能)會動就好,既然應該著重的是基礎的紮實程度(如堆疊、中斷、常見周邊的運作基本原理特性等),所以用8051這種在此些方面複雜度不算太高的平台是再適合不過了。


沒有留言:

張貼留言