第二部分 ARM裸機之體系架構介紹一
一、CPU是如何運作的?
1、CPU的運作需要固定的頻率時鐘,就類似人一樣需要心髒跳動。
2、CPU是通過總線的方式通路外部存儲器中的二進制指令集(由ARM公司設計CPU規定了的指令集),然後進行解碼執行完成一些列的輸入輸出動作。
二、程式是如何從代碼轉換為機器可是識别的可執行語言的?
1、彙編程式設計模式步驟
(1)彙編指令程式設計
(2)通過彙編器将其轉換為二進制可執行檔案
(3)CPU經過總線讀取二進制可執行檔案
(4)CPU内部電路進行解碼
(5)依據解碼結果執行指令的動作
2、進階語言程式設計模式步驟
(1)進階語言(C、java…)先是通過編譯器編譯為彙程式設計式
(2)執行彙編模式的步驟
3、從代碼轉換為機器語言的流程

三、指令集對CPU的意義
我們知道程式設計語言有很多機器語言、彙編、C、java、C++等..它們之間有什麼關系和特點呢?
在早期計算機識别的都是二進制機器語言,打孔紙帶,效率很低。後來就發明了彙編語言,作為機器指令的助記符,但是很快人們就發現彙編語言移植性差,于是推出了C語言。當項目工程發展到一定階段C語言這種面向過程的語言開始出現不适合工程管理,于是産生了面向對象語言C++等進階語言。
事實上,機器指令集是一款CPU的程式設計特征,是這款CPU的設計者制定的。CPU的内部電路設計就是為了實作這些指令集的功能。也就是說不同CPU的指令集是不一樣的,51和avr單片機的CPU指令是不同的。這樣移植性就很差!
編譯器的發明就是解決了這個問題,通過不同的編譯器将同一C語言程式根據CPU型号編譯适用于不同CPU的可執行彙編指令。那有童鞋就會問,移植性這麼差,為什麼還要用彙編呢?因為它的執行效
率是最高的,在核心中使用很多,而且C語言的調用是需要建立在棧的基礎上,一開始都是通過彙編指令為C語言的運作提供環境。以後會講到哦~~大概先了解一下。
四、CISC和RISC是什麼東東?
大家可能聽過這個名詞,但是不知道是怎麼來的?筆者在這裡将學到的給大家講講。
CISC體系:英文名稱complex instruction set computer複雜指令集。設計理念:用最少的指令完成任務,比如51單片機中的乘法指令MUL DIV。功能的擴充是依靠CPU内部組合邏輯電路的擴充。
RISC體系:英文名稱Reduced Instruction-Set Computer精簡指令集CPU。設計理念:CPU提供基本的指令集,具體任務由軟體完成。功能的擴充是依靠使用CPU的設計人員實作。
Intel、IBM的CPU大部分是CISC架構,ARM的CPU基本都是RISC架構。說來也巧合,CISC是當時最流行的體系架構,CPU的内部電路設計是很複雜的,隻有幾個大巨頭Intel、IBM才能進行生産。而ARM那時候隻是小羅羅,沒有資金加工這麼龐大複雜的IC,是以CPU就采用簡單的設計理念。說到這裡,大家就明白了為什麼電腦的CPU都是CISC架構,而手機、平闆等消費電子基本都是RISC架構。RISC架構不僅是價格低,而且由于電路簡單功耗也更低。所有随着近年來的嵌入式的發展,ARM憑借這個優勢發展特别迅速。有時候的劣勢,經過時間的推移往往成為優勢!(老朱說的話,借用一下)
五、統一編址和獨立編址
1、神馬是IO、記憶體和外存?
IO:輸入輸出裝置 通常意義也就是CPU的内部或者外部裝置。
記憶體:程式運作的場所,一般就是RAM。CPU通過位址總線通路記憶體單元,再通過資料總線讀寫資料。例如SRAM 靜态記憶體 (上電不需要初始化) DRAM(SDRAM)動态記憶體。
外存:是外部儲存設備的簡稱,類似與電腦的硬碟,也就是我們經常說的ROM。
下面舉些例子,讓大家了解一下SoC常用外存:
NorFlash :總線式通路,接到SROM bank,優點是可以直接總線通路,一般用來啟動。價格高
NandFlash:分為SLC和MLC(有壞塊,需要進行壞塊管理,但是便宜)
eMMC/iNand/moviNand:其中eMMC(embeded MMC)iNand是SanDisk公司出産的eMMC,moviNand是三星公司出産的eMMC。
oneNAND:oneNand是三星公司出的一種Nand
SD卡/TF卡/MMC卡:筆記本的插孔那種SD卡
eSSD:固态硬碟
2、CPU通路記憶體和外存方式
記憶體需要直接位址通路,是以CPU是通過位址總線和資料總線的通路方式連接配接的(好處是直接通路,随機通路;壞處是占用CPU的位址空間,大小受限);
外存是通過CPU的外存接口來連接配接的(好處是不占用CPU的位址空間,壞處是通路速度沒有總線式快,通路時序較複雜,如SDIO)
3、CPU通路外設的2種方式
(1)是類似于通路記憶體的方式,即把外設的寄存器當作一個記憶體位址來讀寫,進而以通路記憶體相同的方式來操作外設,叫IO與記憶體統一編址方式。(RICS)
(2)是使用專用的CPU指令來通路某種特定外設,叫IO與記憶體獨立編址。(CISC)
4、統一與獨立編址的好壞分析
IO與記憶體統一編址方式:優勢是IO當作記憶體來通路,程式設計簡單;缺點是IO也需要占用一定的CPU位址空間,而CPU的位址空間是有限資源。例如讀取ADC外設是通過讀SFR寄存器實作的,而SFR是占用位址空間的。
IO與記憶體獨立編址方式:優勢是不占用CPU位址空間,缺點是CPU設計變複雜了,CPU需要設計複雜的指令集。
六、馮諾依曼結構與哈佛結構
1、馮諾依曼結構:程式和資料都放在記憶體(桌面電腦就是這麼搞的)
這樣設計的話,程式和資料不好處理。CPU都可以進行讀寫操作,
安全和穩定就會出現問題。是以計算機經常會導緻被病毒攻擊。
2、哈佛結構:程式和資料分開獨立放在不同的記憶體塊中,彼此完全分離的結構(例如MCS51 ARM都是這種結構)
程式放在ROM、flash中,資料存放在RAM。ROM是不能寫的是以不會被改變,嵌入式控制安全性能得到保證。
七、軟體程式設計如何控制硬體?
不知道大家有沒有這樣的疑問?為什麼我們通過軟體程式設計對GPIO口操作的時候,這個引腳會拉高拉低呢?軟體是如何去影響硬體的呢?
首先,寄存器屬于CPU外設的硬體組成部分,我們對GPIO操作是對這個寄存器進行控制,其次,需要知道的是寄存器是CPU的硬體設計者制定的,目的是留作外設被程式設計控制的“活動開關” 。也就實作了通過軟體改變CPU的内部電路運作狀态。最後,當我們需要通路某個硬體時(uart),其實就是對與該硬體相關的SFR進讀寫操作。
那麼通過程式設計如何去操作寄存器呢?有兩種方式,彙編和C語言操作:
ldr r1, =0xE0200280 //GPJ2CON的位址送給r1
str r0, [r1] //将r0中的内容寫入到以0xE0200280為位址的記憶體單元
int p = (int )0x30008000;//指針p指向記憶體單元位址
*p = 16;
八、什麼叫位址映射?
筆者所用的開發闆晶片型号是S5PV210屬于ARM Cortex-A8架構,32位CPU,CPU設計時就有32根位址線和32根資料線。
32根位址線決定了CPU的位址空間為4G,那麼這4G空間如何配置設定使用?這個問題就是記憶體映射問題。其實對于IO與記憶體統一編址的ARM體系來說,其32位的位址總線尋址是達不到4G的,因為寄存器SFR是需要占空間的。上X210資料手冊,關于位址空間的分布如下所示。
我們可以看到,210的記憶體RAM是從0x2000_0000—0x7FFF_FFFF的,也就是1.5G(技巧:1FFF_FFFF = 2^29=2^30/2 = 1G/2=512M)
不知不覺寫了這麼多了。。。希望對初學者有些幫助~~學習愉快!