總網頁瀏覽量

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這種在此些方面複雜度不算太高的平台是再適合不過了。


2020年9月9日 星期三

市場上最流行的嵌入式平台(Raspberry Pi/Arduino/STM32)都是外國貨? 台灣的去哪了?


台灣有聯發科、聯詠、瑞昱等這些有擅長做網路多媒體類的SoC晶片的公司;也有新唐、盛群、笙泉、松翰等擅長做 MCU晶片的公司

結果台灣自己的學校,特別是許多大學校院,不管是系所開課、研究單位或者起碼九成以上的學校實驗室用到網路多媒體類的嵌入式平台大多都選用Raspberry Pi(板子是英國廠商的,而上面的SoC晶片是博通的);用到MCU類的嵌入式平台時大多選擇用STM32(ST的MCU) 或Arduino(最普遍的款式的板子上面的MCU是Atmel的,Atmel已經在幾年前被Microchip併購),全都是用國外的晶片,且這不是在學界才有的現象,這幾年來也開始有了不少系統廠公司直接或間接地去使用這些平台之中的相關元素來做成自家的產品或者產品其中的一部分(特別是指Raspberry Pi和Arduino板子,而STM32則是本來就是業界愛用的晶片)
上述這狀況代表什麼呢?代表這些國外的平台比較先進或好用,而且因為已經太多人在使用和討論,正向循環之下,其技術資料很多,會造成更多屬於正循環結果的現象。而台灣的廠商大多可能還是只能辛苦地緊跟其後,辛苦地做costdown,要求員工辛苦地增加工時以即時達成客戶的各種要求
在台灣學術界每年產出一大堆論文之後還是如此,只有提到代工成果時才會明顯地想到其代工是由台灣廠商所負責的。這表示台灣的學術和產業發展很成功嗎??為何多數的自己人的第一選擇就不會是台灣自家研發的平台?
事實上,與Arduino系列之中最普及的uno/nano/mini/micro等板子上面的MCU主晶片也就是Atmega328相關的Atmega8 MCU晶片(一樣是基於AVR CPU的Atmega系列MCU,有內建ADC和SPI、I2C等周邊IP)是早在Arduino平台開始流行的很久之前就已經存在很久了的MCU晶片(按照datasheet的資訊顯示這款MCU在2002年就已經在市場上賣了(*參考資料1),被拿來開發Arduino初期的版本(*參考資料2與*參考資料3),也有不少公司將Atmega系列MCU用來開發產品。晶片都有了,就缺乏好的開發生態系去提升其開發便利性和普及性,但這樣的開發平台的生態系就是無法先由台灣的學術界去整合開創出來,所以最後Arduino這類的東西還是外國人先搞出來,而這樣的平台也確實影響了世界,畢竟這確實大大降低了多數初學者對於MCU的入門應用門檻
台灣從來不缺乏濫用創新這個詞的人,真正的實用創新絕對不是不懂專業技術且光喊口號就能做得到的 *參考資料1: ATmega8 datasheet, https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf *參考資料2: https://www.arduino.cc/en/Main/ArduinoBoardSerialSingleSided3 *參考資料3: https://www.arduino.cc/en/Main/ArduinoBoardSerial