這是arm裸機1期加強版第1課第2、3節課程的wiki文字版。
為什么沒前途也要學習單片機?
因為它是個很好的入口。
學習單片機可以讓我們拋開復雜的軟件結構,先掌握硬件操作,如:看原理圖、芯片手冊、寫程序操作寄存器等。在上一節視頻里,我剛把單片機貶得一無是處,說單片機沒前途了,這節視頻,我又要告訴你們,沒有前途,也要學習單片機。為什么?
首先,我說不用學習單片機,是指不要使用老一套得學習方法學習單片機。什么叫老一套的方法?
·硬件上:不要使用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來編譯。