第001課 不要再用老方法學習單片機和ARM


原文地址: http://wiki.100ask.org

單片機程序員發展的必選之路: Linux#

我們的第一期是教大家如何將ARM開發板當作單片機來用,但在這期視頻的第一節,我告訴你們,學習單片機是沒有前途的

話說得非常狠,因為不這樣說,沒法警醒你們。我說這句話,是冒着生命危險的,因為很多人依靠單片機來生活,淘寶上有一大堆售賣單片機開發板的,像51、STM32等。

工資方面

我們學習這些不就是為了賺錢嗎?在51job上,搜索“單片機”,工資平均下來是幾千塊錢。然后搜搜“Linux系統工程師”,平均工資是上萬左右。

職業發展

這里我有切實的體會,我2003年畢業,2005年進入一個小公司,當時做的是車載電話,我們先是用51單片機來做的。當時我的李姓同事,用兩個3000多行的C文件,實現了車載電話的功能。
另一個魏姓同事,將功能拆分成各種模塊,使用了50多個C文件,以操作系統的思想,重新寫了這個程序。這兩個牛人,都跳槽了,都不做單片機了。
李姓同事去了美國,深造了機器人視覺,現在是百度的搜索專家,魏姓同事和我一起去了中興,現在在廈門聯想公司負責手機的開發,而我給你們錄視頻,但我們都不玩單片機了。
我在2005發表了一個2440開發板上仿照ucos寫了一個操作系統,10年前,我們已經把單片機玩得登峰造極了。但是我們還需要升級,為什么?
因為單片機非常簡單,稍微認真學習2-3個月就可以達到中等的水平,你工作十年和工作兩年技能差別不大,對一個公司,現實一點,他肯定喜歡使用工資更低還更願意加班的新人,所以說,我們必須升級。

應用方面

在嵌入式領域,單片機位於哪個位置。我們看看一個自動化的機床,在這條生產線上面,比如說在這傳輸帶上,會有一些單片機來檢測物品傳輸的位置,觸發某些信號。
但其總控肯定運行操作系統,以處理更加復雜的事情。
這里寫圖片描述

再看看Google的機器人,他的手臂、腳趾,也許有些單片機來控制其動作,但他的核心大腦,肯定運行操作系統,才能處理各種復雜的事情。
也就是說,在一個復雜的系統,操作系統是大腦,單片機是可以實現手指的功能。那么你想去做大腦還是想去做手指?
這里寫圖片描述

並且單片機的產品升級換代比較慢,一個產品使用單片機的話,他追求的是穩定與成本,那顯然,日常的工作的活少,並且也不需要你有太新的技能,既然如此,公司干嘛要花2~3萬來請人做單片機,直接花幾千元請個新人不就完了嗎?

並且單片機的價格優勢正在逐漸消失,我們在淘寶搜索一下,STM32開發板的基本都是1-200元,而一個能夠運行Linux系統的板子,nanopi的價格卻在100元左右。
一個能夠運行Linux操作系統,有512M DDR內存,有四核處理的的ARM開發板,他只需要99元。所以說,現在單片機的價格優勢正逐漸消失,他只能保持微弱的優勢就是穩定性這一特點。

下面來看看使用的單片機和使用操作系統開發的產品,比如鬧鍾、自動售貨機就是單片機做的。

但自動售賣機,他一旦需要連接網絡,需要WiFi,他很可能就需要操作系統。現在的新型自動售賣機,上面有微信支付,就必須要操作系統。

像無人機,既用單片機也用Linux操作系統。單片機可以更加及時的處理一些信息。看這些產品,你更想做哪些產品?
這里寫圖片描述

技術方面

我們的操作系統Linux,他需要一個Bootloader,這個Bootloader就是一個單片機裸板程序的大全,只要掌握了Linux的Bootloader,對單片機是輕而易舉。
在后面視頻,我會講解這點。所以說,我告訴你們,學單片機沒前途了。

當然我說的是一般情況,你說特例我就完蛋了,周立功做單片機的,年收入幾億,這沒辦法說。注意,我說的是學習,在學習上,你不需要用單片機來學習,但是在工作中,我們設計產品的時候,如果單片機的性能更好,我們就要選擇單片機。
就比如說小米的智能插座,他就是使用單片機來做的,如果同一個功能,用單片機可以省成本,我干嘛不用單片機呢?賣出幾百萬台設備,每一個省一毛錢,就可以省幾十萬。我只告訴你,在技術方面,一旦我們掌握了Linux的bootloader,反過來,對單片機來說,他是小菜一碟。

為了嵌入式Linux, 換個兩全的方法學習單片機#

為什么沒前途也要學習單片機?

因為它是個很好的入口。

單片機的學習可以讓我們拋開復雜的軟件結構,先掌握硬件操作,如:看原理圖、芯片手冊、寫程序操作寄存器等。
在上一節視頻里,我剛把單片機貶得一無是處,說單片機沒前途了,這節視頻,我又要告訴你們,沒有前途,也要學習單片機。為什么?

首先,我說不用學習單片機,是指不要使用老一套得學習方法學習單片機。什么叫老一套的方法?

  • 硬件上:不要使用C51、STM32這些專用的單片機開發板。如果以后,你不打算從事單片機開發,你用這些芯片干嘛,研究了兩三個月,把這些寄存器都用清楚了,你又用不上,沒必要啊。
  • 軟件上:不要使用Keil、MDK等集成度太高的軟件。你用這些軟件,你寫個main()就可以了,然后調用各種庫,進行傻瓜式操作。這些好用的工具,封裝了很多技術細節,使得我們沒法了解裸機、單片機的本質。

以后我們會使用新一套的方法來進行單片機的開發。新一套的方法,我們后面再介紹。
這里寫圖片描述

我們之所以還要學習單片機,是因為他里面的知識,對我們后續學習Linux還是有用的。我們首先來看看,一個Linux系統是怎么一回事。
一個嵌入式Linux系統的軟件組成:
單片機大全Bootloader-->Linux驅動-->Linux APP-->Linux GUI(Android/QT)
我們PC機一上電的時候,黑色屏幕上會顯示BIOS,這個BIOS目的是去啟動Windows內核。Windows內核再掛載C盤(系統盤)、D盤(應用盤),最后再去啟動應用程序,像QQ、網游等。
同樣的道理,我們的Android手機或者工控設備,也有BIOS,但嵌入式Linux系統里面不叫BIOS,叫Bootloader,他的目的是去啟動Linux內核。
他首先也是識別應用程序所在的存儲設備,掛載根文件系統(在Windows系統里面的C盤、D盤,在Linux里面稱為根文件系統)。最后去啟動應用程序。
這里寫圖片描述

仔細的分析下Bootloader,他去啟動內核,他去哪里啟動內核呢?
顯然是去某個地方讀出內核,就比如說BIOS是去C盤上讀出Windows內核,我們的Bootloader是去Flash或者SD卡讀取內核。
因此Bootloader要擁有讀取Flash或者SD卡的能力。有些Bootloader還要顯示logo,因此還要具有操作LCD的能力。Bootloader還要設置開發板的環境,比如,初始化時鍾、初始化內存、還要設置網卡等。
這么多事情,都是在Bootloader里面實現的,太復雜了,如果你一來就分析整個Bootloader是非常困難的。

那我們怎么學習呢?
把他拆開,寫出單獨的程序,比如:LED點燈、時鍾、網卡、Flash都單獨寫個程序來練習,這些不就是單片機程序嗎?所以說,Bootloader是單片機程序的大全。我們為了更好的學習Bootloader,我們應該事先一個一個練習硬件,當我們熟悉每個硬件后,再組合起來,就是一個Bootloader。

這里寫圖片描述

我們再來看看Bootloader啟動內核之后,內核再去掛載根文件系統,意味着內核也要有操作硬件的能力,這就是驅動程序。我們首先來看看一個簡單的驅動程序是什么樣子。
首先我們的應用程序是調用open()、read()、write()這些標准的接口去訪問硬件。那么就進入驅動程序里面,驅動程序里面有對應的drive_open()、drive_read()、drive_write()。最后在驅動程序里面,去配置硬件。
這里以如果是一個LED點燈驅動,那么drive_open()要把GPIO設置為輸出引腳,drive_read(),返回GPIO狀態,driver_write()則寫GPIO,讓引腳輸出高電平或者低電平。

這里寫圖片描述

對於我們的LED驅動程序,你需要提供drive_open()、drive_read()、drive_write()這些接口,這就是他的框架。具體的怎么操作硬件,就是硬件操作。
所以說,我們事先在單片機里面,熟悉熟練的掌握硬件操作。即驅動程序的組成:

驅動程序=軟件框架+硬件操作

你需要學會看原理圖、看硬件怎么連接、看芯片手冊、知道怎么讀寫寄存器。這一切都可以先在單片機里面學習,去掌握。以后學習Linux驅動時,把重點放在軟件框架就行了。

我們可以事先學習單片機,單片機的學習可以讓我們先拋開復雜的軟件結構,先掌握硬件的操作,如:看原理圖、芯片手冊、寫程序操作寄存器等。
這就是為什么單片機沒有前途,我們也要學習。是因為他里面涉及的硬件操作,對我們后續的學習,非常有用處。

現在我們知道了,我們學習單片機,不是為了掌握單片機的開發技能,而是為了掌握Bootloader,掌握硬件操作
這里寫圖片描述

單片機和Linux都想學_換個兩全的方法學習單片機

本節教你如何學習單片機,如何選擇合適的開發板開發工具

現在我們知道單片機是要學習的,那么怎么去學習單片機?在上一課我們說不要使用老一套的方法學習,實際上是指的兩個問題。

第一:選擇什么開發板;

第二:使用什么開發工具;

我們學習單片機的目的是干嘛?目的是為后續嵌入式Linux學習服務
在這條學習線路上:

單片機->bootloader->Linux系統/驅動->APP(QT) 可以使用同一套開發板

我們選擇開發板的原則是:資料豐富

這里寫圖片描述

開發板首推三星 (SAMSUNG)系列的,資料最開放,

  • 有S3C2440、S3C6410、S5PV210、Exynos4412;
  • 然后是德州儀器 (TI)的,TI開始不開放資料,現在逐漸公開了,有AM437X、AM335X;
  • 然后是飛思卡爾(freescale),有iMX6;
  • 還有其它國產芯片:全志瑞芯微

我們用百度進行搜索,看哪個資料最豐富。結果如下:

這里寫圖片描述

再在搜索關鍵詞中加入“教程”后,S3C2440的搜索結果比AM335X更多,因此S3C2440的資料仍是最多的,TI的營銷更好,當然,TI作為工控板,其用戶也是很多的。

所以,從教程的豐富程度來看,S3C2440為首選開發板

我們后面會考慮使用TI的芯片重新錄制一套視頻,但需要2-3年的功夫,所以,現在還是使用S3C2440吧。

現在普遍有個錯誤觀點:S3C2440過時了,它還是ARM9內核,現在Cortex-A7、 Cortex-A8、 Cortex-A9、 Cortex-A15都出來了,它的性能太差了。
性能差沒錯,但它是否過時了呢?

那要看學到的知識是否過時。

我們首先來看看一個芯片是怎么組成的,里面有CPU、外設串口、I2C、SPI、LCD等。

這里寫圖片描述
我們寫程序的時候,是去操作這些模塊的寄存器,訪問這些模塊,並不是去操作CPU。
等你工作的時候,你使用不同的芯片,那么差別在於這些模塊,這些硬件的操作,差別不在CPU操作,你寫程序的時候,根本不涉及CPU的內部機制。

不同芯片的差別:
在於外設操作,不在於CPU,寫程序幾乎不涉及CPU,只有涉及中斷時,才會跟CPU的機制有點關系,但是不同CPU的架構差異很小,並且我們后面開發Linux驅動時,內核已經幫我們做好了這些處理,根本不需要去關心。

從上一課我們知道,驅動=軟件框架+硬件操作。這個軟件框架對於所有的芯片都是一樣的,因為都是用Linux內核。
而這個硬件操作,你在2440上掌握了串口操作,I2C操作、SPI操作,掌握了這些硬件的語言,你換一種芯片,是完全類似的。

這里寫圖片描述

我假設你選擇了2440開發板,那么怎么使用2440開發板來學習單片機的開發呢?又使用什么開發工具呢?
以前在Windows開發的時候,我們使用ADS、Keil、MDK等,你直接寫個main()函數,所有的細節都幫你實現了,誰來調用main()函數,有他幫你做了。這main()所生成出來的代碼,怎么放入到內存里面,這工具也幫你做了,我們基本上只需要寫main()函數,只需要寫C語言就行了。但是這里掩蓋了太多的技術細節,你看看我們官網->學習路線 的這篇文章,里面有個比較:

① Windows下的單片機學習,深度不夠

  • Windows下有很好的圖形界面單片機開發軟件,比如keil、MDK等。
  • 它們封裝了很多技術細節,比如:
  • 你只會從main函數開始編寫代碼,卻不知道上電后第1條代碼是怎么執行的;
  • 你可以編寫中斷處理函數,但是卻不知道它是怎么被調用的;
  • 你不知道程序怎么從Flash上被讀入內存;
  • 也不知道內存是怎么划分使用的,不知道棧在哪、堆在哪;
  • 當你想裁剪程序降低對Flash、內存的使用時,你無從下手;
  • 當你新建一個文件時,它被自動加入到工程里,但是其中的機理你完全不懂;
  • 等等等。

② 基於ARM+Linux裸機學習,可以學得更深,並且更貼合后續的Linux學習。

  • 實際上它就是Linux下的單片機學習,只是一切更加原始:所有的代碼需要你自己來編寫;哪些文件加入工程,需要你自己來管理。
  • 在工作中,我們當然傾向於使用Windows下更便利的工具,但是在學習階段,我們更想學習到程序的本質。
  • 一切從零編寫代碼、管理代碼,可以讓我們學習到更多知識:
  • 你需要了解芯片的上電啟動過程,知道第1條代碼如何運行;
  • 你需要掌握怎么把程序從Flash上讀入內存;
  • 需要理解內存怎么規划使用,比如棧在哪,堆在哪;
  • 需要理解代碼重定位;
  • 需要知道中斷發生后,軟硬件怎么保護現場、跳到中斷入口、調用中斷程序、恢復現場;
  • 你會知道,main函數不是我們編寫的第1個函數;
  • 你會知道,芯片從上電開始,程序是怎么被搬運執行的;
  • 你會知道,函數調用過程中,參數是如何傳遞的;
  • 你會知道,中斷發生時,每一個寄存器的值都要小心對待;
  • 等等等。
  • 你掌握了ARM+Linux的裸機開發,再回去看Windows下的單片機開發,會驚呼:怎么那么簡單!並且你會完全明白這些工具沒有向你展示的技術細節。

如果我們基於ARM+Linux,不使用這些Windows工具,你可以學得更深,並且單片機的大全Bootloader,他就是ARM+Linux開發的,他並不使用Windows下的工具。
你基於ARM+Linux學裸板、學單片機,你可以學得更多,因為我們一切都從零開始的。我們既管理這些代碼,也可以知道芯片上電的時候做了什么事情,知道程序自己怎么把自己讀到內存,且知道怎么去規划內存,知道怎么代碼重定位……

我說的這些概念,你可能聽都沒聽過,這是因為Windows下這些好用的工具把這些統統都給屏蔽了。
我們使用ARM+Linux進行裸板開發,一旦掌握了ARM+Linux開發這套機制,再回過頭去看這些Windows工具、看STM32的話,你只需要幾分鍾就可以搞定。
並且你可以無縫進入后續的學習,因為你已經熟練掌握了Linux的操作環境,后面的Bootloader是在Linux下開發的,后面的Linux驅動也是在Linux下開發的。

這里寫圖片描述

所以我們怎么去學習單片機的開發呢?

使用S3C2440開發板,在Linux環境(Ubuntu)下使用arm-Linux-gcc工具來編譯程序。
你編寫代碼的時候,可以使用Windows下各種好用的工具,文本工具等,但便宜的時候,使用arm-Linux-gcc來編譯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM