我是在FB下编译代码的。结果一切正常,没什么特别的。但是我有几点疑问。
1 不论是楼主编译的,还是我自己编译的。所编译出来的binary code 都要达到 45KB+。我认为这个体积貌似有些大了吧。
如果用 x86的cpu,实现这样一个功能也就 512kb 已经是很惊人了。
2 我记得linux的老内核有一个参数 --oformat binary 可以直接编译生成binary code。但是在 arm 下貌似不可以。
3 如果我将代码的起始地址从 0x100000 改为 0x000000。虽然代码可以被正常加载,也被skyeye正确识别,但是却无法正常运行,为什么?
希望能给出一个回答。
还有一个不知道是不是我想的那样,代码中 用
mvn r1,#0x2fc00
sub r1,r1,#0x3e0
sub r1,r1,#0x3
将 0xfffd001c 放入 r1 寄存器中,那为什么不直接将这个数送入 r1 呢?是不是因为arm的指令编码对立即数的限制所造成的呢?那我们平时编写代码该如何进行转换?
下面是我写的一个小代码,没有使用 lds 文件。
@boot.S
.text
.align 4
.global begin
.type begin, function
begin:
mov r0, #0xd2
msr cpsr, r0
mvn r1,#0x2fc00
sub r1,r1,#0x3e0
sub r1,r1,#0x3
mov r0,#0x41
str r0,
l:
b l
#Makefile
CFLAGS=-mapcs-32 -march=armv4 -mtune=arm7tdmi
LFLAGS=-e begin -Ttext 0x1000000 -s
all:
arm-elf-gcc $(CFLAGS) -c boot.S -o boot.o
arm-elf-ld $(LFLAGS) -o boot boot.o
#skyeye.conf
#skyeye config file sample
cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
log: logon=0, logfile=./sk1.log, start=0, end=200000
测试用的指令是 skyeye -e boot
本人今天刚开始看 arm 还请各位多多指教。 真所谓靠人不如靠己.
砍掉header 和 一些无用的段,现在文件体积一下子缩小很多.
不过,不能直接加载了.只能在配置脚本中定义加载的位置.
不过这才是我要的. you are too cool>>>>>>>>>>>.....:-D 非常感谢啊!
启蒙老师
谢谢shang79啦,不管是什么技术,自己会不是会,把人教会才算会。让我们在兴趣中学习,在分享中提高,在合作中共赢。希望我们越来越强,越来越多的优秀软件made in china. make :nothing to be done for 'all'why?
gcc 3.44
make 3.81 make :nothing to be done for 'all'
没有人遇到吗?
回复 #13 tropic 的帖子
还是有问题呢,不过链接时-n选项啥意思呢。 伪指令,还有label,立即数等等都和教科书上写的ARM程序大相径庭。这些都是GNU AS汇编编译器的统一语法。在as.info中有详细的介绍.________________
真可惜,我第一次看文章的时候没有认真看,弄得我后来因为这个转换花了许多的时间..
汲取经验,置顶精华一定先看才行!
呵,继续努力~ 我用的4.1.1版的gcc
-mshort-load-bytes选项和-mapcs-32都是不合法的。要怎么改呢?
版主啊,下次发布的时候文档里写上你用的编译工具的版本号吧,要不不好查怎么替换啊。
[ 本帖最后由 lenghuo 于 2008-12-3 16:57 编辑 ] make后,提示如下:
make: Nothing to be done for `all'. 谢谢楼主,目前学习中。。。 用make编译时出错了
# cd Hello4Skyeye/
# ll
total 148
-rwxrwxr-x1 root1 root1 46727 Mar22005 hello
-rw-r--r--1 root1 root1 273 Feb 172005 hello.c
-rw-r--r--1 root1 root1 822 Mar22005 hello.lds
-rw-rw-r--1 root1 root1 82 Mar22005 hello.n
-rw-rw-r--1 root1 root11992 Mar22005 hello.o
-rw-rw-r--1 root1 root13985 Mar22005 hello.r
-rw-rw-r--1 root1 root13645 Mar22005 hello.s
-rw-r--r--1 root1 root1 640 Mar22005 makefile
-rw-r--r--1 root1 root14078 Feb 172005 README
-rw-rw-r--1 root1 root1 0 Apr1 18:29 sk1.log
-rw-r--r--1 root1 root1 225 Mar22005 skyeye.conf
-rw-rw-r--1 root1 root14744 Mar22005 start.o
-rw-r--r--1 root1 root1 424 Mar22005 start.S
# make
make: Nothing to be done for `all'.
# make install
make: *** No rule to make target `install'.Stop.
# make makefile
make: Nothing to be done for `makefile'.
# make install
make: *** No rule to make target `install'.Stop.
好厉害
都是高手啊 :lol: ubuntu8.04,装好了arm-elf-tools,下载了Hello4Skyeye代码,根据楼主的步骤make clean,然后make之后skyeye hello,结果不断打印Bus read error, can not find corresponding bank for addr 0x3c20,pc=0x3c20
这句话,当然后面的地址不断递增……这是怎么回事?