嵌入式軟件環境構建:uboot、kernel、rootfs、app佈局(轉載)

嵌入式開發涉及硬件和軟件兩部分,我的目前主要是作嵌入式軟件部分,使用uboot+linux的總體方案。這裏所說的「嵌入式軟件環境」,不是指宿主機上的嵌入式開發環境,而是指目標機中的運行軟件環境,只是簡要介紹一種佈局及相應的實現步驟。java

1、軟件環境的佈局

開發板的datasheet中都有詳細的地址空間的劃分,其中比較重要的兩塊是:DDR地址空間和Flash地址空間。DDR空間是系統和應用的運行空間,通常由linux系統自身進行使用和管理;Flash空間是系統和應用載體的存放空間,通常須要在使用前進行劃分,由應用開發者進行管理。在這裏以我如今正在作的項目進行簡單的示例和說明。linux

其中,Flash的總體地址空間爲:0x34000000~0x34FFFFFF,共16MB,使用的是Nor Flash芯片。佈局須要作的工做是:shell

  1. 肯定uboot二進制文件的大小,使用的地址範圍
  2. 肯定linux kernel鏡像文件的大小,使用的地址範圍
  3. 肯定rootfs 根文件系統的鏡像文件大小,使用的地址範圍
  4. 估計總體應用方案所需的空間大小,選擇可以使用的地址範圍

完成上述工做後,項目的佈局以下:bash

  1. uboot:0x34000000~0x34080000, 512KB
  2. kernel : 0x34080000~0x34180000, 1MB, 文件大小爲952.8KB
  3. rootfs : 0x34180000~0x34700000, 5.5MB, 文件大小爲3.85MB
  4. app : 0x34700000~0x34FFFFFF, 9MB, 文件大小爲3.725MB

到這一步已經完成了地址空間的邏輯佈局,接下來就是存儲空間的物理佈局實現,就是對Flash進行分區,這裏能夠分紅四個區,對應上述四塊軟件,也能夠分紅三個區:服務器

1 mtdparts=phys_mapped_flash:0x180000(boot),0x580000(roofs70),0x900000(app)

2、佈局的實現方式

這裏主要是指如何將上述相應的鏡像文件下載到或者燒寫到開發板上,也涉及到大批量生成的燒錄方式,我在第一個項目時就在這一塊糾結過,如今算是後知後覺。
在開發過程當中有不少的選擇,主要的有:app

  • JTAG,或者配套的燒寫器,再加上配套的軟件套件,如CCS,完成uboot的燒寫
  • 專門的串口燒寫工具,完成uboot的燒寫
  • 在uboot環境下可使用tftp工具,完成kernel鏡像、rootfs文件、app文件的燒寫

基本就是上面的一個過程,在個人第一個項目中,主要是使用:JTAG+CCS+tftp的方式,如今項目中則是:燒寫器+tftp(uboot通常不修改)。工具

  1. uboot環境中tftp工具的使用

不一樣的uboot版本命令格式和提供的功能會有所差異,最好是使用前查閱幫助或者參考開發指導手冊,主要的功能有從服務器下載文件和上傳文件到服務器,常見的格式爲:佈局

1 - 下載文件:tftp <addr> <file>
2  - 上傳文件:tftp <addr> <size> <file>

在個人第一個項目中,使用的是Nand Flash芯片,下載過程:測試

1 - 下載文件到內存地址
2  - erase Flash上對應的文件存放地址空間
3  - write 內存地址中的文件內容到Flash上對應的地址空間

當前項目中,使用的是Nor Flash芯片,下載過程:spa

 
1 - erase Flash上對應文件的存放地址空間
2  - 直接下載文件到Flash中對應文件的地址空間中:tftp 0x34180000 rootfs.jffs2

由於手上如今沒有Nand Flash芯片的開發板,無法測試第二種方式是否可使用Nand Flash環境。
一樣的如今也能夠直接從Nor Flash中啓動內核鏡像,而不須要先將其加載到內存再啓動:

 
1 setenv bootcmd "bootm 0x34080000"
  1. 批量生產的軟件燒錄

進行設備的批量生產階段,確定不能按照開發階段的過程來進行軟件環境的燒錄,對於大批量來講,這樣作效率過低,並且容易出錯。越簡單、單一的操做效率越高,越不容易出錯。最佳的方式是:一步解決。在此推薦的方式是:

  • 按照上面的內容和步驟完成整個軟件環境的佈局和構建
  • 用tftp工具將整個Flash中的內容所有打包上傳到服務器,獲得一個總體方案鏡像
  • 使用燒片器燒寫總體鏡像完成批量原始設備的軟件燒錄構建
相關文章
相關標籤/搜索