天天看點

嵌入式開發基礎(2)

版權聲明:本文為部落客chszs的原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/chszs/article/details/3705717

嵌入式開發基礎(2)

一、目标闆

在開發機(運作桌面Linux系統)和目标闆(嵌入式開發闆)之間:

首先通過RS-232序列槽線進行連接配接,其次通過以太網連接配接線進行連接配接。

通過RS-232序列槽線進行連接配接,使用序列槽通信工具,最常用的是Minicom工具,它對于所有的桌面Linux釋出包都有效。

目标闆的啟動:

1)目标闆電源啟動,bootloader立即得到處理器的控制。

執行底層硬體初始化,包括:處理器和記憶體設定、序列槽UART控制初始化、以太網控制器初始化等。

U-Boot載入

2)引導核心

U-Boot初始化硬體、序列槽以太網接口,然後U-Boot載入和引導Linux核心。

所有的bootloader都有一個載入和執行作業系統映像的指令。如:

tftpboot 200000 uImage-440ep

tftpboot指令訓示U-Boot使用TFTP協定、通過網絡載入核心映像uImage-440ep。此情況下,核心映像一般是存儲在開發主機上。

3)bootm指令的使用

bootm指令訓示U-Boot引導核心。假定核心正确配置,則引導Linux核心的結果是在目标闆上提示控制台指令。如:

amcc login: <<< This is a Linux kernel console command prompt

要注意:bootm指令是U-Boot的“喪鐘”,使用此指令後,Linux核心将獲得控制權,bootloader停止并退出。bootloader要獲得控制權的方法是重新啟動目标闆。

餘下的引導資訊将由Linux核心産生。U-Boot停止,Linux核心映像接管控制。

4)核心初始化

Linux核心開始執行時,它輸出大量的狀态資訊。比如:

--------------------------------------

...

Looking up port of RPC 100003/2 on 192.168.0.9

Looking up port of RPC 100005/1 on 192.168.0.9

VFS: Mounted root (nfs filesystem).

Freeing init memory: 232K

INIT: version 2.78 booting

coyote login:

這些資訊一般不低于100行。

根檔案系統包括應用程式、系統庫、建立GNU/Linux系統的工具。

5)第一個使用者空間的程序:init

二、嵌入式存儲器

大多數Linux嵌入式系統的存儲需求為4MB~256MB,但目前有增加到G的趨勢。

Flash存儲器可通過軟體控制寫入和擦寫,且Flash的寫入和擦寫速度在不斷提高。

典型的Flash存儲晶片,資料以0或1按位寫入,但是擦寫則按塊整塊擦寫。故塊經常被稱為擦寫塊。

典型的Flash存儲器裝置包含許多擦寫塊,例如4MB的Flash晶片可包含64個擦寫快,每個塊為64KB。

要修改存儲在Flash記憶體的資料,被修改資料所在的整塊都将被擦寫,即使隻修改1個位元組,整塊先被擦寫,再重寫。

與硬碟的扇區相比,Flash的塊尺寸相對要大很多。比如說,典型的高性能硬碟的扇區大小一般為512或1024位元組。

Flash存儲器的寫速度比硬碟慢了很多,通常更新資料的時間是硬碟的很多倍。

Flash存儲器的另一個限制是Flash存儲器單元的寫使用期限。盡管Flash的寫使用期限次數相當大,每個塊100k次,但是一個糟糕的算法可能很快就産生一個壞塊。

NAND Flash裝置通過提供更小的塊尺寸,改進了傳統NOR Flash的局限性,使得寫速度更快,Flash陣列的使用更富有效率。

NOR Flash裝置與微處理器的接口與許多微處理器外設相似,即它們通過一個并行資料和位址總線直接連接配接到微處理器的資料/位址總線。Flash陣列的每個位元組或字都可以随機方式單獨尋址。

NAND與之相反,NAND裝置通過複雜的接口連續通路,NAND裝置操作模式類似于傳統硬體驅動和相應控制器的模式。

總的來說,微處理器可直接通路NOR Flash存儲器,代碼在NOR Flash外執行。

Flash的使用

嵌入式系統設計者有多種方式安排和使用Flash存儲器。最簡單的系統,原始的二進制資料(通常是壓縮的)被存儲到Flash裝置,當引導時,Flash存儲的檔案系統映像被讀入到Linux的記憶體裝置,作為映射并隻在記憶體通路。

這是很好的設計選擇,Flash資料很少需要更新。

Flash存儲器安排的例子:

在Flash存儲器陣列的頂部或底部時Bootloader和配置,緊接着Bootloader的是Linux核心映像,以及Ramdisk檔案系統映像(它存儲根檔案系統)。代表性地是Linux核心和Ramdisk檔案系統映像都是壓縮的,Bootloader在引導周期處了解壓縮任務。

目前最流行的Flash檔案系統是使用JFFS2,它是在閃存上使用非常廣泛的讀/寫檔案系統。JFFS2有幾個重要特征,目标是改進整體性能,增加Flash的使用壽命,減少因電源故障産生的資料丢失問題。

最新的JFFS2檔案系統的重要改進包括改進的磨損平衡,壓縮和解壓縮資料到指定尺寸的Flash存儲器,支援Linux硬連接配接等。

三、記憶體空間

所有嵌入式作業系統都把系統記憶體看作是單一的、扁平的位址空間,并以此進行管理。即微處理器的位址空間的範圍從0到最大實體位址。

例如,微處理器有24位位址總線,它的最大記憶體為16MB。用16進制表示範圍為:0x00000000~0x00ffffff。

典型的嵌入式系統記憶體位址表為:

FFFF_FFFF~FF00_0000 Flash存儲器(16MB)

F000_0000 外設基位址

8000_0000 PCI總線位址

03FF_FFFF~0000_0000 DRAM(64MB的記憶體)

高性能微處理器包含了複雜的硬體引擎,稱為MMU(存儲管理單元)。MMU的目标是是作業系統能夠高度管理和控制它配置設定的位址空間。此控制有兩種基本形式:通路權限(Access Right)和記憶體轉換(Memory Translation)。

通路權限:允許OS為指定任務對指定記憶體的通路權限進行配置設定。

記憶體轉換:允許OS虛拟位址空間。

嵌入式風格的Hello World

#include <stdio.h>

int bss_var; /*未初始化的全局變量*/

int data_var=1; /*初始化的全局變量*/

int main(int argc, char **argv)

{

  void *stack_var; /*在stack上的局部變量*/

  stack_var = (void *)main;

  printf("Hello, World! Main is executing at %p/n", stack_var);

  printf("This address (%p) is in our stack frame/n", &stack_var);

  /*bss節包含未初始化的資料*/

  printf("This address (%p) is in our bss section/n", &bss_var);

 /*資料節包含已初始化的資料*/

 printf("This address (%p) is in our data section/n", &data_var);

 return 0;

}

----------------

輸出結果:

root@amcc:~# ./hello

Hello, World! Main is executing at 0x10000418

This address (0x7ff8ebb0) is in our stack frame

This address (0x10010a1c) is in our bss section

This address (0x10010a18) is in our data section

root@amcc:~#

繼續閱讀