对于希望学习ARM汇编的同学而言, 购买ARM开发板进行板上实测无疑是一个有效的方法,不过购买ARM开发板需要一笔费用,而且每次测试都需要连接开发板,比较麻烦。这里介绍一个ARM模 拟器——SkyEye,通过SkyEye我们可以直接在一台PC上完成ARM汇编程序的开发和调试了,摆脱了ARM开发板的限制,真是不错!
下面介绍如何使用:
1.点击这里进入下载SkyEye的最新版,我的是skyeye-1.3.4_rc1.tar.gz,同时为了后面的实验,我们还要下载testsuite,这是skyeye的测试文件,我的版本是skyeye-testsuite-1.3.4,里面有ArmLinux
2.
tar zxvf skyeye-1.3.4_rc1.tar.gz
cd skyeye
根据INSTALL文件里说的:
./autogen.sh
./configure
make lib
make
sudo make install_lib
sudo make install
注意,在make时可能会缺各种文件,apt-get install就可以了,我所遇到的几个问题是:
python-dev和llvm等没有安装,很简单:
sudo apt-get install autoconf
sudo apt-get install python-dev
sudo apt-get install llvm texinfo
sudo apt-get install libtool libgtk2.0-dev
缺的包相应补上
//libgtk2.0-dev pkg-config libatk1.0-dev libpango1.0-dev libfreetype6-dev libglib2.0-dev libx11-dev binutils-dev libncurses5-dev libxpm-dev
就可以了
这样SkyEye就算安装好了
3.
默认SkyEye是安装在/opt/下的,因此为了方便,我们在环境变量里把它的路径加入:
vi ~/.bashrc
输入:
#SkyEye 1.3.4
export PATH=/opt/skyeye/bin:$PATH
之后注销再登录或直接source .bashrc就可以使环境变量生效了
4.
SkyEye安装好后会在/opt/skyeye/testsuite下有一个arm_hello的测试程序,按如下方式运行:
cd /opt/skyeye/testsuite/arm_hello
skyeye -e arm_hello
#注意:skyeye要运行一个程序时必须要在这个程序的目录里,因为skyeye要读取这个程序的skyeye.conf配置文件,所以第一步我们要切换到/opt/skyeye/testsuite/arm_hello目录下
这时我们会进入skyeye命令模式,输入start让arm_hello程序开始运行,会弹出一个connecting to Ubuntu:xxx的字样的窗口
5.
skyeye命令行输入:run开始运行,这时窗口会不停的输出“helloworld”,说明arm_hello已经成功运行了!
6.
skyeye命令行输入:stop停止运行;输入:quit退出skyeye;输入:help查看帮助
下面介绍如何在SkyEye上启动Linux,就和在真实的ARM开发板上一样:
1.
解压testsuite测试文件:
tar zxvf skyeye-testsuite-1.3.4_rc1.tar.gz
其中的linux目录就是我们要移植到板子上的amrlinux,依次进入:s3c2410-->s3c2410x-2.6.36,有三个文 件,vmlinux是Linux内核镜像,skyeye.conf是配置文件,initrd.img是临时根文件系统。我们在/opt/skyeye /testsuite下新建一个目录,然后copy过来:
sudo mkdir /opt/skyeye/testsuite/armlinux
cd linux/s3c2410/s3c2410x-2.6.36
sudo copy * /opt/skyeye/testsuite/armlinux
2.
cd /opt/skyeye/testsuite/armlinux
skyeye -e vmlinux
进入skyeye命令模式;
输入start打开串口窗口:
我在执行这一步时出错:failed to setup_module (name:net, type:cs8900a),我把skyeye.conf里的net那一行注释掉了,就行了
如果窗口没有打开,则修改:uart:mod=stdio为uart:mod=term,然后再试试
3.
skyeye命令行:run启动Linux,
屏幕随即会输出串口信息,不过速度很慢!
附几张图:
root@jdqiu:/opt/skyeye/testsuite/armlinux# skyeye -e vmlinux
回车
run回车
1.
首先在/opt/skyeye/testsuite下建立myhello目录:
mkdir /opt/skyeye/testsuite/myhello
2.
cd /opt/skyeye/testsuite/myhello
vi myhello.c
输入:
#define INTERVAL 100000
void myhello(void)
{
long * addr = (long *)0x50000020;
int timeout = 0, i = 0;
char *buf="Hello World! " ;
while(1)
{
timeout = 0;
while(++timeout <= INTERVAL);
while(buf[i]!='\0')
{
*addr = buf[i];
i++;
}
i = 0;
}
}
地址0x50000020就是UART的通道0(UTXH0)的发送缓冲,把数据写入这个地址就会自动发送出去,当然在模拟器中,发送的目标地址就是我们的屏幕啦。
3.
myhello.c写好了之后,我们还要准备一段s3c2410的启动代码,这段代码在s3c2410一上电之后就开始执行,在这段启动代码中,回跳转到我们写的myhello.c函数:
vi start.S
输入:
.text
.align 4
.global _start
_start:
ldr sp,=1024*4
bl myhello
halt:
b halt
上面这段很简单,就是声明了一个_start标记,这个标记在下面会用到,作为程序的入口地址。汇编和C链接的唯一必须的一步就是设置堆栈,这里我们把sp指向4k顶部,然后跳转到我们的c函数myhello
4.
现在我们要写一个连接脚本,连接顺序就是先start.S后myhello.c:
vi myhello.lds
输入:
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
.text :
{
start.o
myhello.o
*(.rodata)
}
.=ALIGN(8192);
.data :{*(.data)}
.bss :{*(.bss)}
}
表示输出arm格式,第二句表示入口点是_start标记,就是第三步的那个_start标记,然后在0x00000000处先插入start.o,然后插入myhello.o
5.
然后我们要写Makefile:
vi Makefile
输入:
CC = arm-linux-gcc
LD = arm-linux-ld
CFLAGS = -c -g -march=armv6 -mtune=arm920t
LDFLAGS = -N -p -X -Tmyhello.lds
myhello:start.o myhello.o
$(LD) $(LDFLAGS) start.o myhello.o -o $@
arm-linux-objdump -xS $@ > myhello.s
arm-linux-readelf -a $@ > myhello.r
arm-linux-nm $@ > myhello.n
start.o:start.S
$(CC) $(CFLAGS) $<
myhello.o:myhello.c
$(CC) $(CFLAGS) $<
clean:
rm -rf *.o myhello *.r *.s *.n
6.
最后我们还需要一个skyeye配置文件:
cd /opt/skyeye/testsuite/myhello
# skyeye config file for S3C2410X
arch:arm
cpu: arm920t
mach: s3c2410x
#boot
mem_bank: map=M, type=RW, addr=0x00000000, size=0x04000000, boot=yes
# physical memory
mem_bank: map=M, type=RW, addr=0x30000000, size=0x02000000
# all peripherals I/O mapping area
mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000
#mem_bank: map=I, type=RW, addr=0x19000300, size=0x00000020
#net: type=cs8900a, base=0x19000300, size=0x20,int=9, mac=0:4:3:2:1:f, ethmod=tuntap, hostip=10.0.0.1
#lcd: type=s3c2410x, mod=gtk
uart:mod=term
#dbct:state=on
#load_addr:base=0x30000000, mask=0xFFFFFF
#load_file: filename=./initrd.img, start=0x30800000
7,
编译:
cd /opt/skyeye/testsuite/myhello
make
8.
好了,所有的文件已经准备好了,下面我们来测试:
cd /opt/skyeye/testsuite/myhello
skyeye -e myhello
在skyeye命令模式下输入:
start
run
我们会发现连续输出了字符“hello world”
完成!
PS:有网友建议:
源码中有两处值得商榷的地方:
1) Makefile 第3,4行, 建议为:
CFLAGS= -c -g -march=armv4 -mtune=arm920t
LDFLAGS= -N -p -X -Tmyhello.lds
2)skyeye.config 第15行, 建议为:
uart:mod=stdio
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30108475/viewspace-1707377/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30108475/viewspace-1707377/