主要参考:http://blog.csdn.net/htttw/article/details/7231851
但是完全按照以上博文的操作,最后并不能成功的运行。
1.
首先在/opt/skyeye/testsuite下建立myhello目录:
mkdir /opt/skyeye/testsuite/myhello
2.
cd /opt/skyeye/testsuite/myhello
vi myhello.c
输入:
1. #define INTERVAL 100000
2. void myhello(void)
3. {
4. long * addr = (long *)0x50000020;
5. int timeout = 0;
6.
7. while(1)
8. {
9. timeout = 0;
10. while(++timeout <= INTERVAL);
11.
12. *addr = 'a';
13. }
14. }
地址0x50000020就是UART的通道0(UTXH0)的发送缓冲,把数据写入这个地址就会自动发送出去,当然在模拟器中,发送的目标地址就是我们的屏幕啦。
3.
myhello.c写好了之后,我们还要准备一段s3c2410的启动代码,这段代码在s3c2410一上电之后就开始执行,在这段启动代码中,回跳转到我们写的myhello.c函数:
vi start.S
输入:
1. .text
2. .align 4
3. .global _start
4.
5. _start:
6. ldr sp, =1024*4
7. bl myhello
8.
9. halt:
10. b halt
上面这段很简单,就是声明了一个_start标记,这个标记在下面会用到,作为程序的入口地址。汇编和C链接的唯一必须的一步就是设置堆栈,这里我们把sp指向4k顶部,然后跳转到我们的c函数myhello
4.
现在我们要写一个连接脚本,连接顺序就是先start.S后myhello.c:
vi myhello.lds
输入:
1. OUTPUT_ARCH(arm)
2. ENTRY(_start)
3. SECTIONS
4. {
5. . = 0x00000000;
6. .text :
7. {
8. start.o
9. myhello.o
10. *(.rodata)
11. }
12.
13. . = ALIGN(8192);
14.
15. .data : {*(.data)}
16.
17. .bss : {*(.bss)}
18. }
表示输出arm格式,第二句表示入口点是_start标记,就是第三步的那个_start标记,然后在0x00000000处先插入 start.o,然后插入myhello.o
不熟悉.lds文件的请注意:.和=之间有空格,=和0x00000000之间有空格;.text和:之间有空格。其余类同。如果没有这些空格,会make不通过。
5.
然后我们要写Makefile:
vi Makefile
输入:
1. CC=arm-linux-gcc
2. LD=arm-linux-ld
3. CFLAGS= -c -g -march=armv4 -mtune=arm7tdmi
4. LDFLAGS= -N -p -X -Tmyhello.lds
5.
6. myhello: start.o myhello.o
7. $(LD) $(LDFLAGS) start.o myhello.o -o myhello
8. arm-linux-objdump -xS myhello > myhello.s
9. arm-linux-readelf -a myhello > myhello.r
10. arm-linux-nm myhello > myhello.n
11.
12. start.o: start.S
13. $(CC) $(CFLAGS) start.S
14.
15. myhello.o: myhello.c
16. $(CC) $(CFLAGS) myhello.c
17.
18. clean:
19. rm -rf *.o myhello *.r *.n *.s
如果是-march=armv6 -mtune=arm920t,make时会出现
cc1:bad value (armv6) for -march= switch
cc1:bad value (arm920t) for -mtune= switch
的错误,将其改为红色部分那样后,就不会有问题了。
如果是-march=armv6 -mtune=arm920t
6.
最后我们还需要一个skyeye配置文件:
vi skyeye.conf
输入:
1. #skyeye config file
2. arch:arm
3. cpu: arm920t
4. mach: s3c2410x
5.
6. # boot
7. mem_bank: map=M, type=RW, addr=0x00000000, size=0x04000000, boot=yes
8.
9. # physical memory
10. mem_bank: map=M, type=RW, addr=0x30000000, size=0x02000000
11.
12. # all peripherals I/O mapping area
13. mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000
14.
15. uart:mod=term
16. #log: logon=0, logfile=./sk1.log, start=0, end=200000
红色部分就不要对应的改成arm7tdmi和at91了,否则在run后,不能输出字符'a'
7,
编译:
cd /opt/skyeye/testsuite/myhello
make
8.
好了,所有的文件已经准备好了,下面我们来测试:
cd /opt/skyeye/testsuite/myhello
skyeye -e myhello
在skyeye命令模式下输入:
start
run
我们会发现连续输出了字符“a”