1.3單片機(jī)和Linux都想學(xué)_換個(gè)兩全的方法學(xué)習(xí)單片機(jī)

來源:百問網(wǎng)_嵌入式Linux wiki_jz2440 新1期視頻維基教程 (視頻文字版)
作者:韋東山
本文字?jǐn)?shù):2653,閱讀時(shí)長:3分鐘
本節(jié)教你如何學(xué)習(xí)單片機(jī),如何選擇合適的開發(fā)板和開發(fā)工具。
現(xiàn)在我們知道單片機(jī)是要學(xué)習(xí)的,那么怎么去學(xué)習(xí)單片機(jī)?在上一課我們說不要使用老一套的方法學(xué)習(xí),實(shí)際上是指的兩個(gè)問題。
第一:選擇什么開發(fā)板;
第二:使用什么開發(fā)工具;
我們學(xué)習(xí)單片機(jī)的目的是干嘛?目的是為后續(xù)嵌入式Linux學(xué)習(xí)服務(wù)。 在這條學(xué)習(xí)線路上:
單片機(jī)->bootloader->Linux系統(tǒng)/驅(qū)動(dòng)->APP(QT) 可以使用同一套開發(fā)板。
我們選擇開發(fā)板的原則是:資料豐富。

開發(fā)板首推三星 (SAMSUNG)系列的,資料最開放,
有S3C2440、S3C6410、S5PV210、Exynos4412;
然后是德州儀器 (TI)的,TI開始不開放資料,現(xiàn)在逐漸公開了,有AM437X、AM335X;
然后是飛思卡爾(freescale),有iMX6;
還有其它國產(chǎn)芯片:全志、瑞芯微;
我們用百度進(jìn)行搜索,看哪個(gè)資料最豐富。結(jié)果如下:

再在搜索關(guān)鍵詞中加入“教程”后,S3C2440的搜索結(jié)果比AM335X更多,因此S3C2440的資料仍是最多的,TI的營銷更好,當(dāng)然,TI作為工控板,其用戶也是很多的。
所以,從教程的豐富程度來看,S3C2440為首選開發(fā)板;
我們后面會(huì)考慮使用TI的芯片重新錄制一套視頻,但需要2-3年的功夫,所以,現(xiàn)在還是使用S3C2440吧。
現(xiàn)在普遍有個(gè)錯(cuò)誤觀點(diǎn):S3C2440過時(shí)了,它還是ARM9內(nèi)核,現(xiàn)在Cortex-A7、 Cortex-A8、 Cortex-A9、 Cortex-A15都出來了,它的性能太差了。 性能差沒錯(cuò),但它是否過時(shí)了呢?
那要看學(xué)到的知識(shí)是否過時(shí)。
我們首先來看看一個(gè)芯片是怎么組成的,里面有CPU、外設(shè)串口、I2C、SPI、LCD等。

我們寫程序的時(shí)候,是去操作這些模塊的寄存器,訪問這些模塊,并不是去操作CPU。 等你工作的時(shí)候,你使用不同的芯片,那么差別在于這些模塊,這些硬件的操作,差別不在CPU操作,你寫程序的時(shí)候,根本不涉及CPU的內(nèi)部機(jī)制。
不同芯片的差別:在于外設(shè)操作,不在于CPU,寫程序幾乎不涉及CPU,只有涉及中斷時(shí),才會(huì)跟CPU的機(jī)制有點(diǎn)關(guān)系,但是不同CPU的架構(gòu)差異很小,并且我們后面開發(fā)Linux驅(qū)動(dòng)時(shí),內(nèi)核已經(jīng)幫我們做好了這些處理,根本不需要去關(guān)心。
從上一課我們知道,驅(qū)動(dòng)=軟件框架+硬件操作。這個(gè)軟件框架對于所有的芯片都是一樣的,因?yàn)槎际怯肔inux內(nèi)核。 而這個(gè)硬件操作,你在2440上掌握了串口操作,I2C操作、SPI操作,掌握了這些硬件的語言,你換一種芯片,是完全類似的。

我假設(shè)你選擇了2440開發(fā)板,那么怎么使用2440開發(fā)板來學(xué)習(xí)單片機(jī)的開發(fā)呢?又使用什么開發(fā)工具呢? 以前在Windows開發(fā)的時(shí)候,我們使用ADS、Keil、MDK等,你直接寫個(gè)main()函數(shù),所有的細(xì)節(jié)都幫你實(shí)現(xiàn)了,誰來調(diào)用main()函數(shù),有他幫你做了。這main()所生成出來的代碼,怎么放入到內(nèi)存里面,這工具也幫你做了,我們基本上只需要寫main()函數(shù),只需要寫C語言就行了。但是這里掩蓋了太多的技術(shù)細(xì)節(jié),你看看我們[官網(wǎng)->學(xué)習(xí)路線](http://www.100ask.net/a/howtostudy/) 的這篇文章,里面有個(gè)比較:
① Windows下的單片機(jī)學(xué)習(xí),深度不夠
Windows下有很好的圖形界面單片機(jī)開發(fā)軟件,比如keil、MDK等。
它們封裝了很多技術(shù)細(xì)節(jié),比如:
你只會(huì)從main函數(shù)開始編寫代碼,卻不知道上電后第1條代碼是怎么執(zhí)行的;
你可以編寫中斷處理函數(shù),但是卻不知道它是怎么被調(diào)用的;
你不知道程序怎么從Flash上被讀入內(nèi)存;
也不知道內(nèi)存是怎么劃分使用的,不知道棧在哪、堆在哪;
當(dāng)你想裁剪程序降低對Flash、內(nèi)存的使用時(shí),你無從下手;
當(dāng)你新建一個(gè)文件時(shí),它被自動(dòng)加入到工程里,但是其中的機(jī)理你完全不懂;
等等等。
② 基于ARM+Linux裸機(jī)學(xué)習(xí),可以學(xué)得更深,并且更貼合后續(xù)的Linux學(xué)習(xí)。
實(shí)際上它就是Linux下的單片機(jī)學(xué)習(xí),只是一切更加原始:所有的代碼需要你自己來編寫;哪些文件加入工程,需要你自己來管理。
在工作中,我們當(dāng)然傾向于使用Windows下更便利的工具,但是在學(xué)習(xí)階段,我們更想學(xué)習(xí)到程序的本質(zhì)。
一切從零編寫代碼、管理代碼,可以讓我們學(xué)習(xí)到更多知識(shí):
你需要了解芯片的上電啟動(dòng)過程,知道第1條代碼如何運(yùn)行;
你需要掌握怎么把程序從Flash上讀入內(nèi)存;
需要理解內(nèi)存怎么規(guī)劃使用,比如棧在哪,堆在哪;
需要理解代碼重定位;
需要知道中斷發(fā)生后,軟硬件怎么保護(hù)現(xiàn)場、跳到中斷入口、調(diào)用中斷程序、恢復(fù)現(xiàn)場;
你會(huì)知道,main函數(shù)不是我們編寫的第1個(gè)函數(shù);
你會(huì)知道,芯片從上電開始,程序是怎么被搬運(yùn)執(zhí)行的;
你會(huì)知道,函數(shù)調(diào)用過程中,參數(shù)是如何傳遞的;
你會(huì)知道,中斷發(fā)生時(shí),每一個(gè)寄存器的值都要小心對待;
等等等。
你掌握了ARM+Linux的裸機(jī)開發(fā),再回去看Windows下的單片機(jī)開發(fā),會(huì)驚呼:怎么那么簡單!并且你會(huì)完全明白這些工具沒有向你展示的技術(shù)細(xì)節(jié)。
如果我們基于ARM+Linux,不使用這些Windows工具,你可以學(xué)得更深,并且單片機(jī)的大全Bootloader,他就是ARM+Linux開發(fā)的,他并不使用Windows下的工具。 你基于ARM+Linux學(xué)裸板、學(xué)單片機(jī),你可以學(xué)得更多,因?yàn)槲覀円磺卸紡牧汩_始的。我們既管理這些代碼,也可以知道芯片上電的時(shí)候做了什么事情,知道程序自己怎么把自己讀到內(nèi)存,且知道怎么去規(guī)劃內(nèi)存,知道怎么代碼重定位……
我說的這些概念,你可能聽都沒聽過,這是因?yàn)閃indows下這些好用的工具把這些統(tǒng)統(tǒng)都給屏蔽了。 我們使用ARM+Linux進(jìn)行裸板開發(fā),一旦掌握了ARM+Linux開發(fā)這套機(jī)制,再回過頭去看這些Windows工具、看STM32的話,你只需要幾分鐘就可以搞定。 并且你可以無縫進(jìn)入后續(xù)的學(xué)習(xí),因?yàn)槟阋呀?jīng)熟練掌握了Linux的操作環(huán)境,后面的Bootloader是在Linux下開發(fā)的,后面的Linux驅(qū)動(dòng)也是在Linux下開發(fā)的。

所以我們怎么去學(xué)習(xí)單片機(jī)的開發(fā)呢?
使用S3C2440開發(fā)板,在Linux環(huán)境(Ubuntu)下使用arm-Linux-gcc工具來編譯程序。
你編寫代碼的時(shí)候,可以使用Windows下各種好用的工具,文本工具等,但便宜的時(shí)候,使用arm-Linux-gcc來編譯。?