再也不用花钱买开发板了,自己搭建arm模拟器!

2020-03-17 14:35:55 浏览数 (1)

很多时候,做嵌入式往往需要大量的金钱来购买设备,并且带着这些电路板非常的不方便,那么有没有一种办法可以解决这个问题呢?这时就可以利用QEMU来模拟一个设备进行实验了。

1. 介绍

QEMU是一套由法布里斯·贝拉(Fabrice Bellard)所编写的以GPL许可证分发源码的模拟处理器,在GNU/Linux平台上使用广泛。Bochs,PearPC等与其类似,但不具备其许多特性,比如高速度及跨平台的特性,通过KQEMU这个闭源的加速器,QEMU能模拟至接近真实电脑的速度。

简单的说,通过这个模拟器,对于做嵌入式的人来说,可以在pc仿真开发板的运行情况,不用每次都需要将程序下载到开发板,特别是调试驱动与编译内核这将节省大量的时间!

2.准备

首先下载2440的qemu

为什么要下载qemu,直接在ubuntu上apt-get install不行吗?

不行!下载后的不带这个2440

首先在git上下载代码

代码语言:javascript复制
git clone git://repo.or.cz/qemu/mini2440.git qemu

下载完成后开始编译配置

代码语言:javascript复制
./configure--target-list=arm-softmmu --prefix=/usr/local/qemu/mini244
make -j4
sudo make install

(其中--prefix=/usr/local/qemu/mini2440表示install的目录;make -j4表示4个目标同时构建,jobs=4,一般来说编译速度会更快些)

然后将bin路径添加到环境变量中方便使用qemu-system-arm

在这个目录中,有一个mini2440_start.sh的脚本

为了直接看到效果,这里直接采用韦东山老师的uboot,kernel和文件系统

关于文件系统,可以采用nfs文件系统进行相关的开发,十分的容易,以后介绍

3.flashimg

所以目前的文件系统是在在这些基础上进行的。

接着,采用一个工具进行制作,这个工具的就是flashimg工具

flashimg的官方网站访问不进去了!!!

然后就只能使用github了。

代码语言:javascript复制
git@github.com:cailiwei/flashimg.git

下载完成后就可以进行编译

代码语言:javascript复制
./autogen.sh
./configure
make
sudo make install

将文件转移到这里面,然后开始制作

现在采用的是nandflash,所以先采用这种方式

代码语言:javascript复制
#!bin/bash
./flashimg -s 64M -t nand -f nand.bin -p uboot.part -w boot,u-boot.bin -w kernel,uImage -w root,rootfs.jffs2 -z 512

如果要采用nor flash

代码语言:javascript复制
flashimg -s 2M -t nor -f nor.bin -p uboot.part -w boot,u-boot.bin -w kernel,uImage -w root,rootfs.jffs2

4.写脚本

又到了写脚本时间了

制作完成后,生成nand.bin 将生成的nand.bin转移到我们编译的2440的qemu之中

在这里面,我们最好不用自带的mini2440_start.sh

自己写一个start.sh

qemu-ifdown

代码语言:javascript复制
#!/bin/sh
echo "Close tap!"
sudo ifconfig $1 192.168.31.196  down

qemu-ifup

代码语言:javascript复制
#!/bin/sh
echo "Excuting qemu-ifup"
ifconfig $1 192.168.31.196

5. nfs文件系统

接下来开始搭建nfs方案了

代码语言:javascript复制
sudo apt-get install nfs-kernel-server

之后修改/etc/exports

代码语言:javascript复制
/home/bigmagic/work/zfjqemu/rootfs *(rw,sync,no_root_squash)

重启nfs

代码语言:javascript复制
sudo /etc/init.d/nfs-kernel-server restart

6. 启动

编写好启动脚本后,直接运行

代码语言:javascript复制
sudo sh start.sh

接着,输入nfs的启动参数

代码语言:javascript复制
set bootargs noinitrd root=/dev/nfs rw nfsroot=192.168.31.196:/home/bigmagic/work/fs_qtopia/,proto=tcp,nfsvers=,nolock ip=192.168.31.195:192.168.31.196::255.255.255.0 console=ttySAC,

然后保存参数

代码语言:javascript复制
saveenv

然后输入nboot

代码语言:javascript复制
nboot kernel

那么这个nboot命令是什么?

nboot是uboot指令--将nand flash中的内容加载到sdram中,比如"nboot 0x30000000 0 0x60000;bootm

0x30000000是拷到的sdram的地址,0是nand flash设备号,0x60000是内核在nand flash的地址。再通过bootm从0x30000000启动内核。

由于uImage的前64个字节是zImage的描述信息,所以do_nandboot能知道需要加载的kernel的size。

输入bootm开始启动内核!

打印下面的语句则成功

注意,这里的有一个地方就是文件系统

在fs_qtopia/etc/init.d/rcS

代码语言:javascript复制
#!/bin/sh
ifconfig eth0 192.168.31.195

mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
if [ ! -e /etc/pointercal ]
then
/bin/ts_cal.sh
fi
/bin/qpe.sh &

这里的ifconfig eth0 192.168.31.195需要改成开发板的ip地址

还需要修改一下串口

代码语言:javascript复制
mknod -m  console c  
mknod -m  null c  

7.测试

刚进来就要校验触摸屏

启动完成后,输入

代码语言:javascript复制
qpe.sh -&

8. 总结

这个qemu真的好用!

以后表示调试Linux都方便多了!再也不用下载程序到开发板这么麻烦了!

0 人点赞