《嵌入式設計及Linux驅動開發指南——基於ARM9處理器》讀書筆記


嵌入式設計及Linux驅動開發指南——基於ARM9處理器》

讀書筆記

第一章嵌入式系統基礎

1、 嵌入式系統定義:

“嵌入式系統是用來控制或者監視機器、裝置、工廠等大規模系統的設備。”

——電氣工程師協會

    “嵌入到對象體系中的專用計算機系統”

——北京航空航天大學何立民教授

    “嵌入性”、“專用性”與“計算機系統”是嵌入式系統的三個基本要素。

2、 嵌入式操作系統:

硬實時系統有一個剛性的、不可改變的時間限制,它不允許任何超出時限的錯誤超時錯誤會帶來損害甚至導致系統失敗、或者導致系統不能實現它的預期目標。

軟實時系統的時限是柔性靈活的,它可以容忍偶然的超時錯誤。失敗造成的后果並不嚴重,僅僅是輕微地降低了系統的吞吐量。

我們可以認為至少嵌入式系統都是軟實時系統,所有的嵌入式系統都是實時系統,但並不是所有的實時系統都是嵌入式系統。

常用的嵌入式操作系統有:Linux, uC/OS, Windows CE, VxWorks, Palm OS, QNX等。

3、 選擇Embedded OS的原則:

* 系統成本;

* 市場進入時間及技術支持;

* 可移植性;

* 可利用資源;

* 系統定制能力。



第二章 基於ARM9處理器的硬件開發平台

1、 ARM的歷史:

ARM(Advanced RISC Machine)公司於1990年11月在英國劍橋成立。

1991年,ARM推出第一個嵌入式RISC核心——ARM6系列處理器,VLSI、夏普、GEC Plessey、德州儀器、Cirrus Logic等公司相繼同ARM公司簽署了授權協議。

1998年4月,ARM在倫敦證券交易所和納斯達克交易所上市。

ARM中國安謀咨詢上海有限公司於2002年7月在中國上海成立。

目前基於ARM核的處理器有以下幾類:

* ARM7家族;

* ARM9家族;

* ARM9E家族;

* ARM10E家族;

* ARM11家族;

* SecurCore家族;

* OptimoDE數據引擎內核;

* MPCore多處理器家族;

* Intel公司的StrongARM/XScale。

  2、ARM7和ARM9處理器的主要區別:

    指令流水線:

ARM7:三級,(取指令,譯碼,執行);

ARM9:五級,(取指,譯碼,執行,緩沖/數據,回寫)。

3、三星S3C2410X處理器:

基於ARM920T核(由ARM9TDMI、存儲管理單元MMU和高速緩存三部分組成),片上資源包括:

* 1個LCD控制器(支持STN和TFT帶有觸摸屏的液晶顯示屏);

* SDRAM控制器;

* 3個通道的UART;

* 4個通道的DMA;

* 4個具有PWM功能的計時器和1個內部時鍾;

* 8通道的10位ADC;

* 觸摸屏接口;

* I2S總線接口;

* 2個USB主機接口,1個USB設備接口;

* 2個SPI接口;

* SD接口和MMC卡接口;

* 看門狗計數器;

* 117位通用I/O口和24位外部中斷源;



第三章 調試嵌入式系統程序

1、 嵌入式系統調試方法:

1) 實時在線仿真(In-Circuit Emulator, ICE)

* 優點:功能非常強大,軟硬件均可做到完全實時在線調試。

* 缺點:價格昂貴。

2) 模擬調試

* 優點:簡單方便,不需要目標板,成本低。

* 缺點:功能非常有限,無法實時調試。

3) 軟件調試

* 優點:純軟件,價格較低,簡單,軟件調試能力較強。

* 缺點:需要事先燒制監控程序(Monitor)(往往需多次實驗才能成功)且目標板工作正常,功能有限,特別是硬件調試能力較差。

4) JTAG調試

* 優點:方便、簡單,無需制作Monitor,軟硬件均可調適。

* 缺點:需要工作基本正常(至少CPU工作正常)的目標板,僅適用於有調試接口的芯片。

2、 ARM仿真器工作原理:

利用高速JTAG(Joint Test Action Group)串行掃描鏈,通過調試通信通道(Debug Communication Channel, DCC)連接ARM核心內嵌的名為“Embedded-ICE”的調試邏輯,調試邏輯實時監測ARM核心的寄存器、數據總線和地址總線。調試器設置Breakpoint及Watchpoint后,程序在ARM內核全速運行,調試程序實時監測地址與數據總線並與預設值比較,在吻合時產生異常中斷通知內核並把控制權交給調試器。這樣,在程序全速運行時,可以在斷點處停止,可以設置條件斷點、條件觀測斷點等,而又不占用CPU時間及內存資源。

3、 JTAG接口:

1985年制定的檢測PCB和IC的一個標准,1990年被修改后成為IEEE的一個標准,及IEEE1149.1-1990。通過這個標准,可對具有JTAG接口芯片的電路進行邊界掃描和故障檢測。



第四章 創建嵌入式系統開發環境

1、交叉編譯步驟:

(1) 創建編譯環境。在這個過程中,將設置一些環境變量,創建安裝目錄,安裝內核源代碼和頭文件等。



(2) 創建binutils。這個過程結束后,會創建類似arm-linux-ld等工具。

  Binutils是一組開發工具,包括鏈接器、匯編器以及其他用於目標文件和檔案的工具

  首先要安裝的軟件包使binutils。這非常重要,因為glibc和gcc會針對可用的連接器和匯編器進行多種測試,以決定打開某些特性。

  

(3) 創建一個交叉編譯版本的gcc。注意:在這個過程中只能編譯C程序,而不能編譯C++程序。

  創建交叉編譯版本的gcc,需要交叉編譯版本的glibc及其頭文件,而交叉編譯版本的glibc是通過交叉編譯版本的gcc創建的。面對這個先有雞還是先有蛋的問題,解決辦法是先只編譯對C語言的支持,並禁止支持線程。



(4) 創建一個交叉編譯版本的glibc。這里最容易出現問題。

glibc是一個提供系統調用和基本函數的C語言庫,比如open,malloc和printf等,所有動態鏈接的程序都要用到它。創建glibc需要的時間更長。 

(5) 創建一個交叉編譯版本的gdb。在這個過程結束后,會創建ARM-Linux-gdb。 



(6) 重新創建gcc。前面創建gcc的過程沒有編譯C++編譯器,現在glibc已經准備好了,所以這個步驟將完善gcc的交叉編譯。





(7) 重新創建glibc。如果成功執行了這個過程,那么你就擁有了一套屬於自己的交叉編譯工具鏈。



2、如果在交叉編譯過程中出現錯誤,那么請檢查:

* 版本選擇是否正確,以及是否安裝了相應的補丁;

* 庫文件路徑是否正確;

* 系統環境變量是否設置正確。



第五章 Bootloader

1、 Bootloader(引導加載程序)是系統加電后運行的第一段代碼。一般它只在系統啟動時運行非常短的一段時間,但對於嵌入式系統來說,這是一個非常重要的系統組成部分。



2、 嵌入式Linux系統從軟件的角度看通常可以分成4個層次:

(1) 引導加載程序。包括固化在固件(Firmware)中的啟動代碼(可選)和Bootloader兩大部分。

(2) 內核。特定於嵌入式板子的定制內核以及控制內核引導系統的參數。

(3) 文件系統。包括根文件系統和建立於Flash內存設備之上的文件系統。通常用Ramdisk作為根文件系統。它是提供管理系統的各種配置文件以及系統執行用戶應用程序的良好的運行環境的載體。

(4) 用戶應用程序。特定於用戶的應用程序。有時在用戶應用程序和內核層之間可能還會包括一個嵌入式圖形用戶界面。



3、 Bootloader包含兩種不同的操作模式:

1) 啟動加載(Bootloading)模式;

2) 下載(Downloading)模式。



4、 Bootloader的啟動流程:

第一階段:主要包含依賴於CPU的體系結構硬件初始化的代碼,通常都用匯編實現。這個階段的任務有:

* 基本的硬件設備初始化(屏蔽所有的中斷、關閉處理器內部指令/數據Cache等)

* 為第二階段准備RAM空間

* 如果是從某個固態存儲媒質中,則復制Bootloader的第二段代碼到RAM

* 設置堆棧

* 跳轉到第二階段的程序入口點

第二階段:通常用C語言完成,以便實現更復雜的功能,也使程序有更好的可讀性和可移植性。這個階段的任務有:

* 初始化本階段要使用到的硬件設備

* 檢測系統內存映射

* 將內核映像和根文件系統映像從FLASH讀到RAM

* 為內核設置啟動參數

* 調用內核



5、 常用U-Boot命令:

命令名

功能

help / ?

幫助命令。用於查詢U-Boot支持的命令並列出簡單說明,和“?”是同一個命令

bdinfo

察看目標系統參數和變量、目標板的硬件配置、各種變量參數

setenv

設置環境變量。比較常用的有:

setenv ipaddr *.*.*.*

setenv severip *.*.*.*

setenv gatewayip *.*.*.*

setenv ethaddr *.*.*.*.*.*

printenv

查看環境變量

saveenv

保存設置的環境變量到Flash

mw

寫內存

md

察看內存

mm

修改內存

flinfo

察看Flash的信息

erase [起始地址 結束地址]

搽除Flash內容,必須以扇區為單位進行搽除

cp [源地址 目標地址 大小]

內存復制,可以在Flash和ram中交換數據

imi [起始地址]

察看內核映像文件

bootm [起始地址]

從某個地址啟動內核

tftpboot [起始地址 鏡像名]

通過ftp從主機系統下載內核映像文件

reset

復位



第六章 Linux系統在ARM平台的移植

1、 使某一個平台的代碼運行在其它平台上的過程就叫做移植。

2、 Linux內核結構:

* /arch包含了所有硬件結構特定的內核代碼。

Linux系統能支持如此多平台的部分原因是因為內河把原程序代碼清晰的划分為體系結構無關部分和體系結構相關部分。對於任何平台,都必須包含以下幾個目錄:

* boot:包括啟動內核所使用的部分或全部平台特有代碼。

* kernel:存放支持體系結構特有的(如信號處理和SMP)特征的實現。

* lib:存放高速體系結構特有的(如strlen和memcpy)同用函數的實現。

* mm:存放體系結構特有的內存管理程序的實現。

* math-emu:模擬FPU的代碼。對於ARM處理器來說,此目錄用mach-xxx代替。

顯然,移植工作的重點就是移植arch目錄下的文件。

* /drivers包含了內核中所有的設備驅動程序。

* /fs包含了所有的文件系統的代碼。

* /include包含了建立內核代碼時所需的大部分庫文件,這個模塊利用其他模塊重建內核。該目錄也包含了不同平台需要的庫文件。比如,asm-arm是arm平台需要的庫文件。

* /init包含了內核的初始化代碼,內核從此處工作。

不是系統的引導代碼,由main.c和version.c兩個文件。這是研究核心如何工作的好起點。

* /ipc包含了進程間通信代碼。

* /kernel包含了主內核代碼。

* /mm包含了所有內存管理代碼。

* /net包含了和網絡相關的代碼。

3、 在移植過程中,定時器、中斷、CACHE管理、MMU等和硬件密切相關的地方都是要相關平台的底層代碼支持的,要特別注意。

4、 編譯內核:

1) 配置內核

make ARCH=arm CROSS_COMPILE=arm-Linux- menuconfig

2) 創建內核依賴關系

make dep

3) 創建內核鏡像文件

make zImage

4) 創建內核模塊

make modules

make modules_install

對每一個配置來說,內核生成以后包括4個文件:沒有壓縮的內核鏡像(zImage或bzImage),壓縮的內核鏡像(vmlinux),內核符號映射文件(System.map)以及配置文件(config)。



第七章 Linux設備驅動程序開發

1、 設備驅動的任務包括:

1) 自動配置和初始化子程序。這部分程序僅在初始化的時候被調用一次。

2) 服務於I/O請求的子程序。這部分是系統調用的結果。在執行這部分程序的時候,系統仍認為和進行調用的進程屬於同一個進程,只是由用戶態變成了核心態,並具有進行此系統調用的用戶程序的運行環境,所以可以在其中調用sleep()等與進程運行環境有關的函數。

2、 設備類型分類:

1) 字符設備(char device)。字符設備是Linux最簡單的設備,可以向文件一樣訪問。

  初始化字符設備時,它的設備驅動程序向Linux登記,並在字符設備向量表中增加一個device_struct數據結構條目,這個設備的主設備標識符用作這個向量表的索引。一個設備的主設備標識符是固定的。chrdevs向量表中的每一個條目,一個device_struct數據結構,包括兩個元素:一個登記的設備驅動程序的名稱的指針和一個指向一組文件操作的指針。參見include/linux/major.h。

2) 塊設備(block device)。是文件系統的物質基礎,它也支持像文件一樣被訪問。

  Linux用blkdevs向量表維護已經登記的塊設備文件。它像chrdevs向量表一樣,使用設備的主設備號作為索引。它的條目也是device_struct數據結構。與字符設備不同的是,塊設備分為SCSI類和IDE類。類向Linux內核登記並向河心提供文件操作。一種塊設備類的設備驅動程序向這種類提供和類相關的接口。參見fs/devices.c。

每一個塊設備驅動程序必須提供普通的文件操作接口和對於buffer cache的接口。每一個塊設備驅動程序填充blk_dev向量表中的blk_dev_struct數據結構。這個向量表的索引還是設備的主設備號。這個blk_dev_struct數據結構包括一個請求例程的地址和一個指針,指向一個request數據結構的列表,每一個都表達buffer cache向設備讀/寫一塊數據的一個請求。參見drivers/block/ll_rw_blk.c和include/linux/blkdev.h。

當buffer_cache從一個已登記的設備讀/寫一塊數據,或者希望讀寫一塊數據到其他位置時,他救災blk_dev_struct中增加一個request數據結構。每個request數據結構都有一個指向一個或多個buffer_head數據結構的指針,每一個都是讀/寫一塊數據的請求。如果buffer_head數據結構被鎖定(buffer_cache),可能會有一個進程在等待這個緩沖區的阻塞進成完成。每一個request數據結構都是從all_request表中分配的。如果request增加到空的request列表,就調用驅動程序的request函數處理這個request隊列,否則驅動程序只是簡單的處理request隊列中的每一個請求。

塊設備驅動程序和字符設備驅動程序的主要區別是:在對字符設備發出讀寫請求時,實際的硬件I/O一般緊接着就發生了,塊設備則不然,它利用一塊系統內存作為緩沖區,當用戶進程對設備請求能滿足用戶的要求時,就返回請求的數據,如果不能就調用請求函數來進行實際的I/O操作。塊設備是主要針對磁盤等慢速設備的,以免耗費過多地CPU時間來等待。

3) 網絡設備。

3、 設備驅動中關鍵數據結構:

1) file_operations:內核內部通過file結構識別設備,通過file_operations數據結構提供文件系統的入口點函數。file_operations定義在 中的函數指針表。這個結構的每一個成員的名字都對應着一個系統調用。從某種意義上說,寫驅動程序的任務之一就是完成file_operations中的函數指針。如果在2.4版本內核下開發的驅動很可能在2.6版本中無法使用,需要進行移植。

2) inode:文件系統處理的文件所需要的信息在inode(索引節點)中。

3) file:主要用於與文件系統對應的設備驅動程序使用。

 第八章 網絡設備驅動程序開發

1、 網絡設備使用網絡接口管理表dev_base。dev_base是一個指向device結構的指針,因為網絡設備是通過device數據結構來表示的。

2、 網絡驅動程序必須解決的兩個問題:

1) 不是所有建立在Linux內核的網絡設備驅動程序都會有控制的設備。

2) 系統中的以太網設備總是叫做/dev/eth0到/dev/eth7,而不管底層的設備驅動程序是什么。當驅動程序找到它的以太網設備時,它就填充它現在擁有的ethn的device數據結構。這時網絡驅動程序也要初始化它控制的物理硬件,並找出它使用的IRQ、DMA等。一旦所有的8個標准的/dev/ethn都分配了,就不會再探測更多的以太網設備。

3、 兩個重要的數據結構:

1) device:這個數據結構是在系統中每一個設備的代表,它提供了多個設備方法,供操作系統或協議層使用。這其中就包括設備初始化時調用的init函數、打開和關閉設備的open和stop函數、處理數據包發送的hard_start_xmit函數等。

2) sk_buff:Linux網絡各層之間的數據傳送都是通過sk_buff(套接字緩沖區)完成的。每個sk_buff包括一些控制方法和一塊數據緩沖區,這個區域存放了網絡傳輸的數據包。控制方法按功能分為兩種類型,一種是控制整個buffer鏈的方法,另一種是控制數據緩沖區的方法。sk_buff組成雙向鏈表的形式,對鏈表的操作主要是刪除鏈表頭的元素和添加到鏈表尾。sk_buff數據結構再include/linux/skbuff.h文件中定義。

4、 內核的驅動程序接口:

1) 打開函數net_open:執行“ifconfig eth0 up”命令時網絡層調用它,把設備連到線路上並啟用來接受/發送數據。open函數在網絡設備驅動程序里是網絡設備被激活的時候被調用的,即設備狀態由down至up。所以實際上很多在初始化的工作可以放到這里來做。

2) 關閉函數net_close:執行“ifconfig eth0 down”時使網卡進入一個清醒的狀態。如果硬件許可那么它會釋放中斷和DMA通道,並完全關閉以節約能源。

3) 探測函數probe/probe1:在啟動時調用以檢測網卡存在與否。如果可以通過讀取內存等非強制手段進行檢查最好,也可以從I/O端口讀取。在探測函數的最后它會填充device結構各域。

4) 發送函數:它與dev->hard_start_xmit()連接,在內核想通過設備傳送數據時調用它。如果發送成功,hard_start_xmit()方法里釋放sk_buff,返回0,否則返回1。如果dev->tbusy置為非0,則系統認為硬件忙,要等到dev->tbusy置0后才會再次發送;也可以不置dev->tbusy為非0,這樣系統會不斷嘗試重發。tbusy的置0任務一般由中斷完成,然后用mark_bh()調用通知系統可以再次發送。

5) 接收函數:它把數據從硬件移出,放在sk_buff結構中,執行netif_rx(sk_buff)告訴內核數據所在位置。真正的處理是在中斷返回之后,這樣可以減少中斷時間。在協議層,接收數據包的流程控制分兩個層次:首先,netif_rx()函數限制了從物理層到協議層的數據幀的數量;然后,每一個套接字都有一個隊列,限制從協議層到套接字層的數據幀的數量。

6) 中斷處理函數:需要了解相關的中斷狀態位以進行相應的操作。

7) 其他函數。



第九章 USB驅動程序開發

1、 OHCI簡介:

   OHCI規范定義了兩個主機控制器(HC)與主機控制器驅動(HDC)的通信通道(Communication Channel)。第一個為主機控制器操作寄存器,第二個為主機控制器通信域(Host Controller Communications Area, HCCA)。

   OHCI規范支持USB四種數據通信方式,並根據數據傳輸特定,將中斷數據傳輸和等時數據傳輸歸為同一類周期性數據傳輸方式。在HCCA中定義了4個鏈表。其中除完成數據鏈表外,其他的周期性數據鏈表、控制傳輸數據鏈表和批量傳輸數據鏈表都是二維鏈表。每個ED(Endpoint Descriptor)描述USB設備的一個端點的所有的數據傳輸,所有的ED被連接在一起,而TD(Transfer Descriptor)描述的才是最終要在USB總線上傳輸的數據包。屬於同一個USB設備的端點的TD被連接在一起,並掛在相應的ED上。

   主機控制器硬件通過寄存器訪問該鏈表來得到相關的USB傳輸數據包,並將其發送到USB總線上。主機控制器驅動程序則根據實際的數據傳輸需要,將要發送的數據包添加到相應的鏈表上。

   OHCI定義了兩類TD:通用TD(General TD)和等時TD(Isochronous TD)。通用TD被用來支持USB中斷、批量和控制三類傳輸方式,而等時TD被用來支持USB等時數據傳輸。用一個單獨類型的TD來實現USB等時數據傳輸的目的是為了方便實現DMA數據傳輸功能。

2、 Linux下USB系統文件節點:同其他外設一樣,上層應用軟件對連接在系統地USB設備訪問是通過文件系統的形式進行的。每個連接到系統總線上的USB設備可以同時對應有一個或者多個驅動程序。即一個USB設備可以在Linux系統上形成一個或多個設備節點,以供應用程序使用。在Linux系統上,每個設備節點都有其相關的主設備號和次設備號。

3、 USB主機驅動結構:Linux USB主機驅動由三部分組成:

1) USB主機控制器驅動(HCD):是USB主機驅動程序中直接與硬件交互的軟件模塊,其主要功能有:主機控制器硬件初始化;為USBD層提供相應的接口函數;提供根HUB(ROOT HUB)設備配置、控制功能;完成4種類型的數據傳輸等。

2) USB驅動(USBD):是整個USB主機驅動的核心,其主要實現的功能有:USB總線管理、USB總線設備、USB總線帶寬管理、USB的4種類型數據傳輸、USB HUB驅動、為USB設備類驅動提供相關接口、提供應用程序訪問的USB系統的文件接口等。

3) USB設備類驅動:是最終與應用程序交互的軟件模塊,其主要實現的功能有:訪問特定的USB設備、為應用程序提供訪問接口等。

   應用程序首先通過文件系統(POSIX)接口來訪問相應的USB設備類驅動程序和USBD;USB設備類驅動程序則通過USBD提供的相關接口將數據請求包傳遞給USBD;USBD通過HCD提供的接口,進一步將數據包傳遞給HCD;HCD最終將數據發送到USB總線上。Linux定義了通用的數據結構URB用來在USB設備類驅動和USBD,USBD和HCD間進行數據傳輸。統一的URB(Universal Request Block)結構為usb主機驅動程序的開發帶來了很大方便。

4、 USB時序:

1) 數據傳輸時序:在USB總線上,所有的數據傳輸都是由USB HOST發起的。每個USB設備通過地址過濾出自己要接受的數據包,並根據數據包請求的類型與USB HOST進行數據傳輸。由於數據傳輸的時序和總線帶寬問題,當應用程序通過設備類提供一個URB時,該數據包並不能立即被送到USB總線上,而只能在USB總線上有足夠帶寬的情況下,該數據請求才會被傳輸。因而,HCD層為不同類型的數據傳輸維護了相應的數據鏈,當數據鏈上的數據包傳輸結束后,HCD通過調用與該數據包相關聯的回調函數來通知設備類驅動程序。

2) 設備連接:當一個USB設備連接到USB總線上時,USB HUB驅動程序首先通過中斷數據傳輸獲得設備連接信息,然后通過調用USB內核模塊所提供的相關函數來完成對USB設備的配置工作。同時USBD不但要為新設備分配在USBD層所需要的資源,同時也要為USB設備分配在HCD層所需要的資源。接着,USBD通過調用所有USB設備類驅動程序提供的Probe函數來查找適合該USB設備的驅動程序。

3) 設備斷開:當一個USB設備斷開時,USB HUB驅動程序首先通過中斷數據傳輸獲得設備斷開信息,然后通過調用USB內核模塊所提供的相關函數來釋放USBD層和HCD層為該設備分配資源。同時通過調用該設備的相關驅動程序提供的Disconnect函數來通知設備驅動程序該設備已經斷開。



第十章 圖形用戶接口

1、 嵌入式系統中幾種流行的GUI:

1) MicroWindows;

2) MiniGUI:是我國為數不多的在國際比較知名的自由軟件之一。幾乎所有的MiniGUI代碼都采用C語言開發,提供了完備的多窗口機制和消息傳遞機制以及眾多空間和其他GUI元素。其引人注目的特性和技術創新主要有:

* 是一個輕量級的圖形系統;

* 完善的對中日韓文字、輸入法的多字體和多字符集支持

* 提供圖形抽象層(GAL)以及輸入抽象層(IAL)以適應嵌入式系統各種顯示和輸入設備

* 提供MiniGUI-Threads、MiniGUI-Lite、MiniGUI-standone三種不同架構的版本以滿足不同的嵌入式系統

* 提供了豐富的應用軟件,其商業版本提供了手機、PDA類產品、媒體及機頂盒類產品以及工業控制方面的諸多程序;

3) Qt/Embedded:是挪威Trolltech軟件公司的產品,Linux桌面系統的KDE就是基於Qt庫(不是QtE)開發的。使用QtE苦,開發者可以:

* 當移植QtE程序到不同平台時,只需要重新編譯代碼,而不需要對代碼進行修改;

* 隨意設置程序界面的外觀;

* 方便地為程序連接數據庫;

* 使程序本地化;

* 將程序與Java集成

同Qt一樣,QtE也是用C++寫的,雖然這樣會增加系統資源消耗,但是卻為開發者提供了清晰的程序框架,使開發者能夠迅速上手,並且可以方便的編寫自定義的用戶界面程序。



2、 MiniGUI編程:

  它采用類似WINDOWS SDK的窗口和事件驅動機制,MiniGUI的存儲空間占用情況如下:

項目

容量

備注

Linux內核

300~500KB

由系統決定

MiniGUI支持庫

500~700KB

由編譯選項確定

MiniGUI字體、位圖等資源

400KB

由應用程序確定,可縮小到200KB以內

GB2312輸入法碼表

200KB

不是必需的,由應用程序確定

應用程序

1~2MB

由應用程序決定

  

  MiniGUI層次:

FrameWork, MMI, Key Apps

MiniGUI

ANSIC Library

Portable Layer



Devices

Linux/uCLinux, eCos, uC/OS-II, VxWorks, Psos

ix86, ARM, MIPS, PowerPC, M68K

  MiniGUI是一個典型的消息驅動的GUI系統,每一個MiniGUI程序都從MiniGUIMain函數開始。應用程序先以CreatMainWindow函數創建一個主窗口,由於窗口創建的時候默認是不可見的,所以我們通過ShowWindow函數顯現該窗口,最后通過GetMessage(&Msg, hMainWnd)進入消息循環。

3、 Qt/Embedded編程:

  Qt是以工具開發包的形式提供給開發者的,這些工具開發包包括了圖形設計器、Makefile制作工具、字體國際化工具和Qr的C++類庫等。如果不考慮X窗口系統的需要,基於QrE的應用程序可以直接對緩沖幀進行寫操作。QtE提供了大約200個可配置的特征,由此再Intel X86平台上庫的大小范圍為700KB~5MB。大部分客戶選擇的配置使得庫的大小為1.5~4MB。Qt/Embedded與Qt/X11的Linux版本架構比較如下:

應用源代碼

Qt API

Qt/Embedded

Qt/X11



Qt/XLib



X Window sever

幀緩沖

Linux內核

  信號與插槽機制提供了對象間的通信機制。Qt的窗口在事件發生后會激發信號,程序員通過建立一個函數(稱作插槽)然后調用connect()函數把這個插槽和一個信號連接起來,這樣就完成了一個事件和響應代碼的連接。信號與插槽機制不需要類之間互相知道細節,這樣就可以相對容易地開發出代碼可高度重用的類。信號與插槽機制是類型安全的,它以警告的方式報告類型錯誤,而不會使系統產生崩潰。

  Qt擁有豐富的滿足不同需求的窗體(如按鈕、滾動條等)。窗體是QWidget類或它子類的實例,客戶自己的窗體類需要從QWidget的子類繼承。一個窗體可以包含任意數量的子窗體,子窗體可以顯示在父窗體的客戶區,一個沒有父窗體的窗體稱為頂級窗體(一個“窗口”),一個窗體通常有一個邊框和標題欄作為裝飾。在父窗體無效、隱藏或被刪除后,它的子窗體都會進行同樣的操作。



第十一章系統設計開發

1、 按照嵌入式系統的工程設計方法,嵌入式系統的設計可以分成7個階段:產品定義、硬件與軟件划分、迭代與實現、詳細的硬件與軟件設計、硬件與軟件集成、接受測試和維護與升級。前三個階段確定要解決的問題及需要完成的目標,也常被稱為“需求階段”;第四階段主要解決如何在給定的約束條件下完成用戶的需求;后三個階段主要解決如何在所選擇的硬件和軟件基礎上進行整個軟/硬件系統的協調實現。

2、 硬件設計主要有以下五個關鍵步驟:

1) 功能定義;

2) 原理圖設計:應盡量做到標准化、通用化、模塊化、可擴展化;

3) PCB設計:是硬件設計的難點;

4) 硬件調試;

5) 產品化調整:一個系統的設計樣機到產品化是個漫長的過程,單從硬件角度講,至少要滿足功能性、穩定性、可靠性、工藝性等最低要求。

3、 原理圖設計中的幾點建議:

1) 開關電源和線性電源的優缺點:



優點

缺點

開關電源

* 輸入電壓范圍寬

* 效率高

* 輸出功率大

* 應用比較靈活

* 電路相對復雜,外圍器件較多

* 對電容電感的要求很高,布線也很講究

* 開關頻率會給系統帶來干擾

* 紋波比較難控制

線性電源

* 電路簡單,外圍器件很少

* 輸出精度高,有很好的負載曲線

* 工作在低頻狀態,不會給系統帶來麻煩

* 輸入范圍比較受限制

* 效率低,這是由於線性電源自身的損耗造成的

* 輸出功率相對較小

2) NAND和NOR Flash的速度差異:

* NOR得讀速度比NAND稍快一些;

* NAND的寫入速度比NOR快很多;

* NAND的4ms擦除速度遠比NOR的5s快;

* 大多數寫入操作需要先進行擦除操作;

* NAND的擦除單元更小,相應的擦除電路更少。

4、 PCB設計要點:

1) 元件封裝的准備:

* 盡量調用標准封裝庫中的文件;

* 嚴密按照所選器件的數據手冊上的規范制作封裝,不能忽略累計誤差;

* 注意二極管、三極管等極性元件及一些非對稱元件的引腳定義不能搞錯。

2) 合理布局:

* 盡量依照參考板的模式進行布局;

* 模塊化布局;

* 要求模擬電路與數字電路分開;

* 輸入模塊與輸出模塊隔離;

* 去隅電容盡量靠近元件的電源/地;

* 電源等發熱元件要考慮散熱,主發熱元件靠近出風口,大體積元件的放置避開風路;

* 元件分布均勻,避免電流過於密集;

* 板上的跳線或按鍵考慮易操作性;

* 元件的排列盡量整齊美觀;

* 考慮機械尺寸,不要超過結構所允許的范圍。

3) PCB分層:

* 如果有參考板,按照參考板進行分層;

* 多層板安排:頂層和底層為元件面,第二層為地平面,倒數第二層為電源層;

* 在不影響性能的情況下,減少PCB層數,降低成本。

4) 電源考慮:

* 系統電源入口做高頻和低頻濾波處理;

* 功率較高的器件配備大容量電容去除低頻干擾;

* 每個器件配備0.1Uf電容過濾高頻干擾;

* 高頻器件電源管腳和電容之間串聯磁珠達到更好的效果;

* 去耦電容的引線不能過長,特別是高頻旁路電容不能帶引線。

5) 時鍾考慮:

* 時鍾電路盡量靠近芯片;

* 晶體下方不要走線;

* 晶體外科接地,增加抗電磁干擾能力;

* 頻率大於20MHz的時鍾信號有地線護送;

* 時鍾線寬大於10mil;

* 時鍾輸出端串聯22~220Ω的阻尼電阻。

6) 高速信號:

* 采用手工布線;

* 高速總線走線盡量等長,並且在靠近數據輸出端串聯22~300Ω的阻尼電阻;

* 高速信號遠離時鍾芯片和晶體;

* 高速信號遠離外部輸入輸出端口,或地線隔離。

7) 差分信號:

* 差分信號要平行等長;

* 信號之間不能走其他信號線;

* 信號要求在同一層上。

8) 走線規范:

* 不同層的信號垂直走線;

* 地線和電源層不要走線,否則要保證平面的完整性;

* 導線寬度不要突變;

* 導線變向時導角要大於90度;

* 定位孔周圍0.5mm范圍不要走線。

5、 硬件調試:

* 優先調試電源:保證系統可靠地供電;

* 分模塊調試:可以分清模塊間的問題,不至於混淆;

* 結合軟件調試:對於復雜的接口,單純硬件角度不易調試,結合軟件從不同的角度測試,能起到更好的效果。

* 正確、合理的使用示波器,提高工作效率;

* 對比調試:有條件用評估板或功能相似的電路板作參考,比較差異並找出問題所在;

* 系統時鍾受干擾或晶體震盪不正常導致系統工作故障;

* 復位不可靠,造成個單元未進入預期狀態而出現問題;

* 因焊接問題引發的各種問題,如方向焊錯、虛焊、錯焊等;

* 因時序不匹配引發的通信故障,如時鍾信號通過邏輯器件后產生延時,與讀寫信號時序搭配不上導致讀寫錯誤。

6、 嵌入式文件系統:

目前支持閃存的文件系統技術有以下幾種:

* JFFS2和Yaffs。這些文件系統可以使用在沒有初始化的NAND Flash和有CFI接口的NOR Flash中。JFFS2的特點包括:

* 支持數據壓縮;

* 提供了“寫平衡”支持;

* 支持多種結點類型;

* 提高了對閃存的利用率,降低了閃存的消耗。

  JFFS2中最重要的數據結構是jffs2_sb_info,這個數據結構用來管理所有的結點鏈表和閃存塊。它在/src/include/Linux/jffs2_fs_sb.h中定義。

  Yaffs/Yaffs2(Yet Another Flash File System)和JFFS相比,它減少了一些功能,因此速度更快、占用內存更少。

* TrueFFS。該文件系統相當於Linux中的MTD層,必須配合其他文件系統。

* FTL/NTFL。它是一種中間層解決方案的統稱,為上層文件系統提供接口。

* RAMFS、CRAMFS和ROMFS。這些文件系統用於早期的小容量閃存設備,系統功能比較簡單,僅提供基本接口,只屬於只讀的閃存文件系統。適合存儲空間小的系統。

7、 MTD簡介:

無論JFFS2還是Yaffs,都需要MTD(Memory Technology Devices,內存技術設備)的支持。MTD是對Flash操作的接口,提供了一系列的標准函數,將硬件驅動設計和系統程序設計分開,硬件驅動人員不用了解存儲設備的組織方法,只需提供標准的函數調用,如讀、寫等。

一個MTD原始設備可以通過mtd_part分割成數個MTD原始設備注冊進mtd_table,mtd_table中的每個MTD原始設備都可以被注冊成一個MTD設備,


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com