官术网_书友最值得收藏!

1.3 軟件控制硬件方法

作為一個嵌入式軟件開發人員,必須熟悉如何控制硬件。

首先從技術上要確定項目開發采用哪種CPU,這取決于項目人員的技術背景、產品、以前的經驗、技術特點等。一般公司會盡可能采用同一種CPU來開發不同產品,這樣可以最大可能節約成本,并且技術風險比較小。當確定了CPU后,研發人員就要研究CPU的相關文件、指令集和測試程序,這些都要在項目開始前完成。硬件IC的手機通常是PDF格式的,稱為DataSheet。CPU的DataSheet相當于一本厚厚的技術詞典,如S3C2440的DataSheet有596頁。如果要控制比較復雜的外部設備,通常還需要閱讀相應的手冊。因此在開發前,最好閱讀盡可能多的手冊。

以S3C2440 CPU為例,首先要通過了解S3C2440 CPU的框圖(如圖1.6所示)來了解這款CPU的大致部件。

圖1.6 S3C2440 CPU框圖

由圖1.6 可以看出,這一款CPU具備的基本硬件包括內存、LCD、串行端口、電源等,這些也是嵌入式系統中最常見的幾項裝置。另外這款CPU還提供了許多的GPIO(General Purpose I/O,通用I/O接口)引腳,讓設計者可以根據自己的需求來控制這些外圍設備,這是一個很典型的做法。如果這些外圍還是不夠的話,就要自己加控制芯片,拉到地址線(Address Line)及總線(Bus Line)上,通過這些線來控制外圍,如SDRAM或Flash就是通過地址線與總線來存取數據的。

以下三個概念要分清楚:存儲器、I/O端口、寄存器。

寄存器是指CPU和外設內部的存儲單元,數量有限,但速度快,分通用寄存器和特殊功能寄存器(如PC,SP等)。不同CPU寄存器寬度是不一樣的。8位單片機表示地址線和數據為8位大小,寄存器寬度也是8位,在C程序中正好可以用一個char數據類型來操作。主流32位CPU的寄存器就是32位寬度,正好用一個32位,在程序中可以用一個unsigned int來操作,CPU的寄存器或地址位的寬度稱為WORD(字)。

通常說的存儲器都是獨立于CPU之外的,如內存、硬盤、光盤等。

CPU本身幾乎每一種外設都是通過讀寫設備上的寄存器來進行操作的。外設寄存器也稱為“I/O端口”,通常包括控制寄存器、狀態寄存器和數據寄存器三大類,而且一個外設的寄存器通常被連續編址。CPU對外設I/O端口物理地址的編址方式有兩種:一種是I/O映射方式(I/O-mapped),另一種是存儲空間映射方式(Memory-mapped)。而具體采用哪一種則取決于CPU的體系結構。有些體系結構的CPU(如PowerPC、M68k等)通常只實現一個物理地址空間(RAM)。在這種情況下,外設I/O端口的物理地址就被映射到CPU的單一物理地址空間中,成為存儲空間的一部分。此時,CPU可以像訪問一個內存單元那樣訪問外設I/O端口,而不需要設立專門的外設I/O指令。這就是所謂的“存儲空間映射方式”(Memory-mapped),ARM體系的CPU均采用這一模式。而另外一些體系結構的CPU(如X86)則為外設專門實現了一個單獨的地址空間,稱為“I/O地址空間”或“I/O端口空間”。這是一個與CPU的RAM物理地址空間不同的地址空間,所有外設的I/O端口均在這一空間中進行編址。CPU通過設立專門的I/O指令(如X86的IN和OUT指令)來訪問這一空間中的地址單元(即I/O端口)。這就是所謂的“I/O映射方式”(I/O-mapped)。與RAM物理地址空間相比,I/O地址空間通常都比較小,如X86 CPU的I/O空間就只有64KB(0~0xffff),這是“I/O映射方式”的一個主要缺點,而且必須要專門的匯編語言才能處理。

Linux既在X86運行,也在ARM之類運行。為了簡化操作,Linux在所有CPU上都采用I/O端口概念。像ARM這樣的內存映射,也被模擬成端口。

提示:在非操作系統模式下,一般直接采用內存取讀模式。

在ARM下,所有外設的寄存器都被映射到一個4G空間,并且是有固定的映射地址(注意要與操作系統下的映射2G地址空間分開,那是操作系統給每個進程模擬的空間,I/O地址實際映射物理地址空間),如圖1.7所示為S3C2440的Nand/Nor空間映射圖。

圖1.7 S3C2440的Nand/Nor空間映射圖

所有S3C2440 寄存器地址映射在S3C2440 DataSheet中有詳細的描述,如表1.1所示為S3C2440內存控制器相關的寄存器地址設置。

表1.1 S3C2440內存控制器相關的寄存器地址設置

主站蜘蛛池模板: 霞浦县| 舟山市| 岳普湖县| 凭祥市| 永丰县| 阿克| 宜丰县| 花莲县| 微山县| 体育| 长汀县| 永济市| 南部县| 新沂市| 平邑县| 梁平县| 凯里市| 女性| 霸州市| 渝中区| 湾仔区| 柏乡县| 宕昌县| 汝州市| 上栗县| 古丈县| 裕民县| 元氏县| 隆德县| 阿克陶县| 宝兴县| 涞源县| 铁岭县| 苏尼特左旗| 化州市| 屯门区| 东乌珠穆沁旗| 济阳县| 久治县| 徐汇区| 三江|