您的位置:首页 > 其它

学习ARM开发(6)

2005-07-24 14:31 351 查看
学习ARM开发(6)

上一次,说到要学习ARM汇编,好,现在就开始。目前我的引导程序是在UBOOT1.1.2上修改过来的,大家可以下载UBOOT的源程序,也许你们会问在那里有下呢?这个问题不用我回答了,用GOOGLE,直接找u-boot,就可以找到了。
由于这个引导程序是从u-boot1.1.2修改过来的,所以还是采用uboot的编译工具,它就是arm-linux-tools-20031127.tar.gz,这个可以uboot的网站下载,然后在linux下安装好,就可以编译引导程序。
编译命令主要:
make clean 是清空所有临时文件,一般是用来清空目录,用来重新编译程序。
make XXXX_config 是编译本引导程序,XXXX是自己定义的开发板,在board目录下。
make backup 是备份引导程序的源程序。

UBOOT编译环境建立起来,就可以去修改和学习UBOOT的源程序,就可以开发自己的boot。源程序已经下载,就可以解开压缩包,在目录u-boot-1.1.3,因目前最新的UBOOT是1.1.2,那个1.1.3是我自己的UBOOT源程序,如果自己想改为1.1.3名称,在LINUX下编译是有点问题的,自己去试试吧。哈哈。。。
接着,我到目录cpu/s3c44b0,这个目录,就是S3C44B0的CPU引导程序,最开始运行的代码就是从这里开始的。那我看代码,也要从这里开始。
看一下这个目录,包括文件有:
G:/Downloads/lichee/lichee/boot/src/u-boot-1.1.3/cpu/s3c44b0 的目录

2005-07-18 12:47 <DIR> .
2005-07-18 12:47 <DIR> ..
2005-07-16 04:35 4,154 .depend
2004-02-24 08:16 1,066 config.mk
2004-10-18 05:12 9,878 cpu.c
2004-02-24 08:16 4,843 interrupts.c
2004-02-24 08:16 1,303 Makefile
2004-10-18 05:12 4,378 serial.c
2005-07-17 23:48 4,820 start.S
2005-07-17 23:47 4,784 start.S.bak

有好几个文件,它们的作用,大家自己先想想,不懂的再问我,目前我要开始看start.S文件,这个最开始运行的文件。
这个文件是汇编写的,但它是经过c的预处理的,所以像在头文件.h中的宏,也可以使用的,这就是GCC的博大之处。大家看到我的目录,也许很奇怪,为什么会有“lichee”这个名称?我来告知各位,这个是我起的名称,叫做“荔枝”,我的BOOT代码和我的uClinux的代号,都叫“荔枝”。吃过“荔枝”的人,都知道外面红红的,里面的肉是白的,清甜可口。我的BOOT和OS都是外面看起来很好看,里面的功能,就是难看了,但要深入去了解,才会尝到新鲜的味道。
好了,下面就要开始品尝我的“荔枝”了,第一段代码:
/*
* S3C44B0 CPU启动代码。
* 蔡军生 2005/07/17
*
*/

/*
* 包含配置文件。
*/
#include <config.h>

/*
添加版本说明.
2005/07/16
*/
#include <version.h>

/*
* 中断向量表.
*/

/*
× 声明标量是全局函数,CPU加电启动后,就从这里执行代码。
*/
.globl _start
_start: b reset /* 跳到复位中断开始位置。 */
add pc, pc, #0x0c000000
add pc, pc, #0x0c000000
add pc, pc, #0x0c000000
add pc, pc, #0x0c000000
add pc, pc, #0x0c000000
add pc, pc, #0x0c000000
add pc, pc, #0x0c000000

.balignl 16,0xdeadbeef

上面这段代码,看懂了吗?如果有什么不懂,就发问题过来。
这里用到ARM指令,b指令就是无条件地跳到reset的地方运行,reset是一个标记,并且它是相对量。
add pc, pc, #0x0c000000,这句用到了4G空间跳转技术,因为ARM的CPU下一次值是根据PC的值来进行的。这里修改了PC的值,就相当跳到对应的地址运行了。又由ARM的指令的宽度是4字节的,所以这里的PC值就是0x0c000004。如果这里直接用b指令是不行的,因为它不超出32M的寻址空间,只有修改PC值才可以达到目的,因此采用ADD指令来修改PC值。
.balignl 16,0xdeadbeef
上面这句,就是填充多少字节在后面。

整段代码实现建立中断向量表,这个根据ARM的CPU来编写的。

OK,第一段代码看完了,下一次再接着看第二段代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: