在SkyEye的使用(一)http://www.linuxidc.com/Linux/2012-10/71650.htm中我们简单介绍了如何使用SkyEye,并且成功运行了既有的arm_hello程序,不过这个是针对arm7的,现在我们要用SkyEye模拟s3c2410(arm920T)。
1.
首先在/opt/skyeye/testsuite下建立myhello目录:
mkdir /opt/skyeye/testsuite/myhello
2.
cd /opt/skyeye/testsuite/myhello
vi myhello.c
输入:
#define INTERVAL 100000
voidmyhello(void)
{
long* addr = (long*)0x50000020;
inttimeout = 0;
while(1)
{
timeout = 0;
while(++timeout <= INTERVAL);
*addr ='a';
}
}
地址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 -Thello.lds
myhello: start.o myhello.o
$(LD) $(LDFLAGS) start.o myhello.o -o myhello
arm-linux-objdump -xS myhello > myhello.s
arm-linux-readelf -a myhello > myhello.r
arm-linux-nm myhello > myhello.n
start.o: start.S
$(CC) $(CFLAGS) start.S
myhello.o: myhello.c
$(CC) $(CFLAGS) myhello.c
clean:
rm -rf *.o myhello *.r *.n *.s
arm-linux-objdump -xS myhello > myhello.s
arm-linux-readelf -a myhello > myhello.r
arm-linux-nm myhello > myhello.n
6.
最后我们还需要一个skyeye配置文件:
vi skyeye.conf
输入:
#skyeye config file
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
uart:mod=term
#log: logon=0, logfile=./sk1.log, start=0, end=200000
7,
编译:
cd /opt/skyeye/testsuite/myhello
make
8.
好了,所有的文件已经准备好了,下面我们来测试:
cd /opt/skyeye/testsuite/myhello
skyeye -e myhello
在skyeye命令模式下输入:
start
run
我们会发现连续输出了字符“a”
完成!
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