嵌入式开发涉及硬件和软件两部分,对于嵌入式系统的软件,通常是固话在SoC芯片上的,
为了系统的稳定性和资源的最优化使用,软件系统的布局也是一个重要的方面,这里简要
介绍本人开发的一款嵌入式产品其系统的布局。
1、系统布局
系统的整体包含常见的几块内容,bootloader/kernel/rootfs/app/data:
bootloader使用的是U-BOOT,根据最终编出来的各个模块的镜像大小以及硬件MEM
(16MB SPI),将系统的布局划分如下:
在这里划分出来了两个APP分区,主要是实现系统的ping-pong boot,具体实现见另一
篇博文。同时在系统中划分出来一个很小的data分区,该分区主要用来保存user的配置
文件,防止系统断电后用户重新配置APP,而且可以在系统升级的情况下,保存user之前
的配置。
2、具体实现
分别编译U-BOOT,Kernel,生成u-boot.bin和uImage镜像文件,再用mkfs.jffs2生
成jffs2 rootfs以及APP1,APP2,data,之后用镜像整合工具把这些镜像整合。
生成好镜像之后,就可以吧镜像通过tftp等方式load到内存中,并通过u-boot中对应的命
令对image进行解析,并将各个image分别烧录到SPI Flash中。
为了实现kernel的boot,需要bootloader kernel传递根文件系统信息,在u-boot中,
传递的参数如下所示:
CONFIG_BOOTARGS "mem=64M mac=12:23:56:78:00:00 noinitrd
root=/dev/mtdblock2 rw rootfstype=jffs2 console=ttyS0,115200
init=/linuxrc ip=192.168.6.87:192.168.6.61:192.168.6.1:255.255.255.0::eth0:off"
通过root=/dev/mtdblock2,告知kernel根文件系统所在分区;同时在kernel中要
有对应的分区划分:
static struct mtd_partition gc_mx25_partitions[] = {
#ifdef CONFIG_GCSOC010_SPIBOOT_VERSION
[0] = {
.name = "uboot(+spiboot)",
.offset = 0,
.size = 256*SZ_1K
},
[1] = {
.name = "Kernel",
.offset = 256*SZ_1K,
.size = (3*SZ_1M)
},
[2] = {
.name = "jfss2",
.offset = (3*SZ_1M+320*SZ_1K),
.size = 8*SZ_1M
},
[3] = {
.name = "app1",
.offset = 12*SZ_1M,
.size = 1*SZ_1M
},
[4] = {
.name = "app2",
.offset = 13*SZ_1M,
.size = 1*SZ_1M
},
[5] = {
.name = "data",
.offset = 14*SZ_1M,
.size = 2*SZ_1M
}
};
文件系统等的生成使用命令:
mkfs.jffs2 -r rootfs/ -o jffs2.img -s 0x1000 -e 0x10000 --pad=0xA00000
sumtool -e 0x10000 -p -i jffs2.img -o jffs2n.img
sumtool之后可以加速系统的启动。