毕业论文论文范文课程设计实践报告法律论文英语论文教学论文医学论文农学论文艺术论文行政论文管理论文计算机安全
您现在的位置: 毕业论文 >> 论文 >> 正文

嵌入式系统ARM的通用bootloader的设计与实现 第10页

更新时间:2010-7-2:  来源:毕业论文
嵌入式系统ARM的通用bootloader的设计与实现 第10页
命令后,才会初始化USB硬件控制模块,当用户无需USB功能时,只要不给系统发送USB的命令,该模块就不会被使能,也就不会进行工作。

(5) 对FLASH擦写操作的支持
前面已经提及,通过串口或者USB更新内核镜像,仅仅做的是将内核镜像存放在SDRAM的具体地址处。SDRAM的一个特点是断电内容会消失,这样的话,如果将内核镜像下载完之后,系统重新启动,则系统使用的还是原毕业论文http://www.Lwfree.cn支持。
在我们的硬件系统中,FLASH使用的是Intel的28f128系列。在对该芯片的支持中,必须在底层完成对FLASH的擦除以及写的处理函数供上层调用,具体实现与存储芯片的一套机制相关,与本课题相去甚远,在这不再赘述。在bootloader的阶段2中,先初始化该芯片。然后与串口处理一样,在命令数组中注册命令“flash”,处理函数“falshcmd”;当bootloadr进入等待命令状态后,用户键入以“flash”开始的一串命令(具体命令见后面章节),进入flashcmd函数,该函数会通过后面的参数,来判断开发者的意图,紧接着调用芯片底层的处理函数来完成具体的操作。

(6) 宏的应用控制本文来自辣文论文网
在前面的总体设计中,已经为bootloader生成的镜像分配了256K的存储空间。随着它扩展功能的增加,各个外设的支持,会使得最终生成的镜像文件越来越大,很可能随着以后实现的深入造成存储空间不够。更为重要的是,对于普通用户来说,这些扩展功能都是多余的,如果系统作为产品发布,根本不需要这些功能,用户也看不到这些功能。因此,需要提供一种方案,只有当开发者需要特定的功能时,该模块才特定的支持。
控制宏的加入就是为了解决这个问题。本文中,添加一个配置的控制文件config.h,在其中针对每个扩展功能,都有一个宏来控制,“1”表示该宏打开,需要对应的功能;“0”表示该宏关闭,不需要对应的功能。以USB为例,定义:
#define USB_SUPPORT          1
并且用它来控制软件上的USB模块的初始化以及所有有关USB操作的代码。当开发者不需要该功能时,将宏改为0,这样直接导致该模块不被初始化,相当于bootloader中未增加该扩展功能。其他模块都一样,除了串口,因为本课题中串口默认为必要的功能。
这样做的另一个好处是在没有必要的时候不启动模块,既能节省功耗,又不至于与以后内核初始化该模块造成冲突。
另外,对于本文所涉及到的地址,也全部使用宏来表示,这样做是为了更方便地进行移植。

(7) 一些转换工具的加入
在本文的bootloader的实现过程中,除了基本的代码之外,还另外需要一些转换工具,使得在链接生成镜像的时候,能完成本文所需要的一些特定功能。
幸运的是,互联网技术的发展,能够将一些重要有用的资源进行网上共享,本课题中所涉及到的一些工具均为网上资源下载所得,并且能够非常干脆地完成其功能。这些工具包括:
 可执行的“elf”,用来从一个elf文件中获得相关信息或者压缩生成elf文件的各个段,具体的功能按其参数选择为准:
-B:将elf文件转换为bin文件
-c:将big-endian控制结构转换为little-endian控制结构
-f:显示elf文件的头
-M:显示elf映射信息(考虑文件的偏移)
-m:显示elf映射信息(不考虑文件的偏移)
-s:显示elf各段的头
 可执行的“bin2array”,用来将一个bin文件转化成一个二进制的数组。
在实现中,专门创建一个tools的目录,来存放这些可执行的转化工具。
4.3.3  代码的编译
本文所用的编译器是GNU的gcc编译器,由于在本文实现的过程中编译工作都在PC端(X86平台),而最终编译的程序要在Xscale的平台上运行,为了解决这个问题,GNU有专门的针对ARM体系结构的交叉编译器arm-linux-gcc。

对于一个C文件,编译它(例如a.c),只要
a.o:  a.c  a.h
 $(CC) $(CFLAGS) a.c

宏CC即为arm-linux-gcc,宏CFLAGS表示一些编译选项,这些选项都是根据本课题的实际情况进行配置的。这些选项为:

CFLAGS  = -c -Wno-format -O -fno-for-scope -mcpu=strongarm \
     -msoft-float -nostdinc -fno-builtin -g \
     -I. -I$(OBJ) -I$(COMMON) -I$(COMCSB) -I$(FLASHDIR) -o $@

 其中:
-c表示只建立obj档,留到后面才进行链接;
  -O:优化,会根据CPU的构架进行一些优化;
  -mcpu=strongarm:表明cpu类型为strong arm;
  -msoft-float:表明支持软件模拟的浮点格式;
-nostdinc:表明对于与一些标准头文件不在标准库目录下寻找,本课题中都有自己定义的头文件以及与一些库函数同名的函数;本文来自辣文论文网
-fno-builtin:对于一些编译器自带的一些内嵌函数,如fabs,labs,memcmp,memcpy, sin,sqrt,strcmp,strcpy,strlen等等,除非在程序里前面以双下划线表识,否则编译器是不认的,这样做是因为本课题中的这些函数都重新进行了定义。
-g:建立一些除错资讯,这样一些debug工具才能除错;
¬-I:指定头文件.h的搜寻目录,后面即所跟这些目录。毕业论文http://www.Lwfree.cn
 $(CC) $(ASMFLAGS) rom_reset.s

ASMFLAGS为汇编编译选项,具体为:

ASMFLAGS = -xassembler-with-cpp -mcpu=strongarm -c -g -o $@ \
     -D ASSEMBLY_ONLY -I. -I$(COMMON) -I$(COMCSB)

-x:表示所编译文件的语言,-xassembler-with-cpp则就表示所编译的是汇编语言编写的程序。
当然,为了实现简单,我们只需使用一个Makefile文件,在文件里面,将所有需要编译的文件,其依赖文件、编译选项以及编译环境都设定好。Makefile文件是用于自动编译和链接的,一个工程有很多文件组成,每个文件的改变都会导致工程的重新链接,但不是所有的文件都需要重新编译。Makefile中记录有文件的信息,在make的时候决定在链接的时候需要重新编译哪些文件。Makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。
4.3.4  目标文件的链接与转换
各种源文件(包括汇编程序、C语言程序以及C++语言程序)经过编译器编译后生成ELF格式的目标文件,这些目标文件吓相应的C/C++运行时库经过ARM连接器处理后,生成ELF(Executable and Linkable Format)格式的镜像文件。ELF时目前最常用的一种,它定义了一些变量以及信息使得动态连接更有弹性,现在常用的ELF格式的文件包括:
 relocatable:这就是我们编译时产生的.o文件;
 executable:这就是一般最后生成的可执行文件;
 shared obj:这就是通常在/lib 或/usr/lib下那些可以动态连接的函数库;
 core:这就是core dump时产生的文件;
    但是需要注意的是,这里所讲的ELF格式档是广义的二进制文件,而不是仅仅单指可执行文件。

4.3.4.1  镜像文件的组成
ARM的这种ELF镜像文件是一个层次性结构的文件,其中包含了域(region)、输出段(output section)和输入段(input section)。各部分的关系如下[6]:
 一个镜像文件由一个或多个域组成。
 每个域包含一个或多个输出段。
 每个输出段包含一个或多个输入段。
 各输入段包含了目标文件中的代码和数据。
下图4.4[6]描述了相关构成:

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 

嵌入式系统ARM的通用bootloader的设计与实现 第10页下载如图片无法显示或论文不完整,请联系qq752018766
设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©751com.cn 辣文论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。