單片機和Linux都想學_換個兩全的方法學習單片機
首發平台:微信公眾號baiwenkeji
arm裸機1期加強版第1課第3節。
本節教你如何學習單片機,如何選擇合適的開發板和開發工具。
現在我們知道單片機是要學習的,那麼怎麼去學習單片機?在上一課我們說不要使用老一套的方法學習,實際上是指的兩個問題。
第一:選擇什麼開發板;
第二:使用什麼開發工具;
我們學習單片機的目的是幹嘛?目的是為後續嵌入式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來編譯
推薦閱讀:
※重磅!中國科學家最新醫學AI成果榮登《細胞》雜誌
※DeepMind在醫療領域再下一城,用人工智慧預測急性腎損傷
※單片機如何入門,先搞清這幾個問題。
※嵌入式:一文看懂ASIC和FPGA的區別
TAG:嵌入式開發 |