论文部分内容阅读
摘 要:嵌入式技术的学习有一定的难度,在越来越多的人开始学习嵌入式技术的情况下,本文结合自己实际的学习经验,分析了初学嵌入式技术时的几个难点,包括嵌入式系统的引导过程、ARM映像文件、S3C2410的启动模式,文中对这些难点进行了详细的解析。
关键词:嵌入式系统;Bootloader;ARM映像文件;S3C2410启动模式
Analysis of Operation Issues in Studying Embedded System
LIU Guo-mei,WANG Ya-nan
(Department of computer science and application of Zhengzhou Instate of Aeronautical Industry Management,Henan Zhengzhou450015)
Key words: Embedded system;Bootloader;arm image file;startup mode of S3C2410
嵌入式系统被定义为以应用为中心,以计算机技术为基础,软硬件可裁剪,从而能够适应实际应用中对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统,目前嵌入式技术已广泛应用于国防、军工、航天航空、移动通讯、机器人、工业控制、医疗仪器、汽车电子等领域。由于社会对掌握嵌入式技术人才的大量需求,学习嵌入式技术的人越来越多,国内多所院校也已开设了嵌入式系统的相关课程。
但是嵌入式系统不像那些8位单片机好懂,嵌入式系统的学习有一定的难度,特别是入门阶段,好多东西不懂,下面结合自己学习嵌入式技术时的实际经验,对初学嵌入式时容易迷惑的几个难点,同时也是比较重要的地方加以分析,希望能对初学者有所帮助。这里以学习arm9微处理器和嵌入式Linux操作系统为例。
1 嵌入式系统的引导过程
一般的嵌入式系统在主程序执行之前都需要执行一些初始化的过程,来完成对系统的初始化,并创造嵌入式程序运行的环境,完成初始化过程的代码就是系统引导程序(Bootloader)。BootLoader所执行的操作跟具体的目标系统和开发系统有关,但通常可分为两大类:带操作系统的BootLoader和不带操作系统BootLoader。
不带操作系统的Bootloader完成的主要功能包括:分配中断向量表;初始化存储器系统;初始化堆栈;初始化有特殊要求的端口、设备;初始化应用程序执行环境;改变处理器模式;呼叫主应用程序,即最后跳到main函数执行应用程序。
带操作系统的Bootloader的启动大多数分为stage1和stage2两大部分,stage1阶段主要包含依赖于CPU体系结构及硬件设备的初始化等,通常都用汇编语言来实现。这个阶段的主要任务有:①基本的硬件设备初始化;②为加载stage2阶段的代码准备RAM空间;③复制stage2阶段的代码到RAM空间中;④设置好堆栈;⑤跳转到stage2阶段的C程序入口点。Stage2阶段通常用C语言来实现,以便实现更复杂的功能,也使程序有更好的可读性和可移植性。这个阶段的主要任务有:①初始化本阶段要使用到的硬件;②检测系统内存映射(memory map);③将内核(kernel)映像和根文件系统映像从Flash读到RAM空间;④为内核设置启动参数;⑤调用内核。
可以看出,带操作系统的Bootloader完成的功能复杂,不带操作系统的Bootloader功能比较简单,是最简单的bootloader,叫做硬件启动程序更合适一些。
2 ARM映像文件
(1) *.axf 格式和*.bin格式文件
ADS编译后生成的ARM映像文件有*.axf 格式和*.bin格式两种,有时二者容易被混淆。其实*.bin格式文件是真正的可执行文件,而*.axf 格式文件是ARM特有的调试文件,里面除了包含*.bin格式文件的内容之外,还附加了许多其它调试信息,这些调试信息可以用在AXD Debugger的调试中,在AXD Debugger中通过Load Image命令下载*.axf格式的文件到目标板的RAM中运行调试。由于烧写工具是原封不动地将映像文件烧入Flash中,所以*.axf 格式文件是不可以被烧入的,否则Flash的0x00000000处就不是真正的第一条指令,而是*.axf 格式的头部分。应该将*.bin格式文件烧入,保证Flash的0x00000000处是第一条指令。总之,*.bin格式文件是用来被烧写入Flash中的,而*.axf格式文件是在AXD Debugger中通过Load Image命令下载调试用的。
(2)ARM映像文件的结构
一个典型的可执行程序的映像文件结构通常如图1所示。
RO段一般包括代码段和一些常量,在运行的时候是只读的。而RW段包括一些全局变量和静态变量,定义时带初始值,在运行的时候可以被改变(读写)。如果有部分全局变量被初始化为零,则RW段里还包括了ZI段。因为RO段是只读的,在运行的时候不可以被改变,所以,在运行的时候,RO段可以驻留在Flash里(当然也可以在SDRAM或者SRAM里了,这样速度会更快些),而RW段是可以被读写的,所以运行的时候必须被装载到SDRAM或者SRAM里。

图1 可执行程序映像的结构
图1中所示的映像文件的结构图指的是映像文件被烧入(存放)在ROM/Flash中时的状态,这时RW直接跟在RO后面,当程序运行时,初始化程序会把RW或ZI拷贝到相应的地方。到底拷贝到什么位置,是通过设置RO BASE 和RW BASE,告诉链接器(linker)该程序的起始运行地址(RO BASE)和 RW段的地址 (RW BASE)。如果一个程序只有RO段,没有RW段,那么这个程序可以完全在Flash里运行,不需要用到SDRAM 或者 SRAM。如果一个程序既包括RW段又包括RO段,那么该程序的RW段必须在被访问之前被拷贝到SDRAM 或者SRAM里去,以保证程序可以正确运行。

图2 映像文件在执行前和执行时的状态图
图2说明了一个可执行映像文件执行前和执行时的状态。从图中可以看到,整个程序在执行前是放在ROM/Flash里的,在执行的时候,RW段被拷贝到了RAM里的合适位置去。这时RO和RW的起始地址分别由RO BASE 和RW BASE指定,也就是说,RO BASE 和RW BASE的值是在映像文件开始运行时才起作用,当然,这里也用到了内存地址重映射。如果映像文件仅仅是存放在ROM/Flash中,映像文件是按图1的方式存放ROM/Flash中的,RW直接跟在RO的后面。
3 S3C2410的启动模式
S3C2410支持两种启动模式:从Nand Flash 启动和从外部nGCS0片选的Nor Flash启动,默认的是从Nand Flash启动。
S3C2410到底从哪儿启动是由外部管脚OM1和OM0的电平组合决定的,OM1 OM0=00,表示从Nand Flash启动,OM1 OM0=11,表示测试模式,其余的为Nor Flash启动,其中OM1 OM0=01表示16bit的存储器,OM1 OM0=10表示32bit的存储器。
当程序被烧入到Nand Flash中时,程序不能直接在Nand Flash中运行,S3C2410处理器内部集成了8位Nand Flash控制器,在该Nand Flash控制器内部有一个被称为“Steppingstone”的4K的RAM。当OM1、OM0都是低电平——即S3C2410从Nand Flash启动时,Nand Flash的前4k代码会被自动地复制到“Steppingstone”中,“Steppingstone”被映射为地址0,即nGCS0,CPU从0x00000000位置的“Steppingstone”中开始执行启动代码。这4k代码必须把更多的代码从Nand Flash中读到SDRAM中去,因此要把最核心的启动程序放在Nand Flash 的前4K中。
当程序被烧写到Nor Flash 中时,则程序可以直接在Nor Flash中运行,只需要将Nor Flash映射到存储器控制器的第0块,即nGCS0,再设置相应的寄存器即可。
在这两种启动模式下, 各片选的存储空间分配是不同的,如图3所示。

图3 S3C2410的存储空间分配
4 结束语
俗话说,万事开头难,特别是对于有一定难度的嵌入式系统的学习,入门阶段更是容易迷惑,好多东西不能很好地理解,本文的目的就是帮助初学者能够较快地突破难点,能够较快地掌握嵌入式系统的基础知识,入了门以后,对整个嵌入式基础知识有了较好的理解和掌握,在此基础上再进行更深一步的学习和开发相对来说就会容易一些。当然,嵌入式系统的学习还有很多其他需要注意的地方,例如要多动脑、多动手、多实践、多研究、多分析源代码,很多时候需要通过跟踪调试才能真正理解系统的执行过程,等等,学习者可以在学习的过程中不断地总结。
参考文献:
[1]徐英慧,马忠梅等.ARM9嵌入式系统设计-基于S3C2410与Linux[M].北京:北京航空航天大学出版社,2007,(9).
[2]杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2003.
[3]李岩,王小玉,孙永春.嵌入式系统教学研究[J].南京:电气电子教学学报,2006,28(3).
教研项目:郑州航空工业管理学院(zhjy-08-01-51)
关键词:嵌入式系统;Bootloader;ARM映像文件;S3C2410启动模式
Analysis of Operation Issues in Studying Embedded System
LIU Guo-mei,WANG Ya-nan
(Department of computer science and application of Zhengzhou Instate of Aeronautical Industry Management,Henan Zhengzhou450015)
Key words: Embedded system;Bootloader;arm image file;startup mode of S3C2410
嵌入式系统被定义为以应用为中心,以计算机技术为基础,软硬件可裁剪,从而能够适应实际应用中对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统,目前嵌入式技术已广泛应用于国防、军工、航天航空、移动通讯、机器人、工业控制、医疗仪器、汽车电子等领域。由于社会对掌握嵌入式技术人才的大量需求,学习嵌入式技术的人越来越多,国内多所院校也已开设了嵌入式系统的相关课程。
但是嵌入式系统不像那些8位单片机好懂,嵌入式系统的学习有一定的难度,特别是入门阶段,好多东西不懂,下面结合自己学习嵌入式技术时的实际经验,对初学嵌入式时容易迷惑的几个难点,同时也是比较重要的地方加以分析,希望能对初学者有所帮助。这里以学习arm9微处理器和嵌入式Linux操作系统为例。
1 嵌入式系统的引导过程
一般的嵌入式系统在主程序执行之前都需要执行一些初始化的过程,来完成对系统的初始化,并创造嵌入式程序运行的环境,完成初始化过程的代码就是系统引导程序(Bootloader)。BootLoader所执行的操作跟具体的目标系统和开发系统有关,但通常可分为两大类:带操作系统的BootLoader和不带操作系统BootLoader。
不带操作系统的Bootloader完成的主要功能包括:分配中断向量表;初始化存储器系统;初始化堆栈;初始化有特殊要求的端口、设备;初始化应用程序执行环境;改变处理器模式;呼叫主应用程序,即最后跳到main函数执行应用程序。
带操作系统的Bootloader的启动大多数分为stage1和stage2两大部分,stage1阶段主要包含依赖于CPU体系结构及硬件设备的初始化等,通常都用汇编语言来实现。这个阶段的主要任务有:①基本的硬件设备初始化;②为加载stage2阶段的代码准备RAM空间;③复制stage2阶段的代码到RAM空间中;④设置好堆栈;⑤跳转到stage2阶段的C程序入口点。Stage2阶段通常用C语言来实现,以便实现更复杂的功能,也使程序有更好的可读性和可移植性。这个阶段的主要任务有:①初始化本阶段要使用到的硬件;②检测系统内存映射(memory map);③将内核(kernel)映像和根文件系统映像从Flash读到RAM空间;④为内核设置启动参数;⑤调用内核。
可以看出,带操作系统的Bootloader完成的功能复杂,不带操作系统的Bootloader功能比较简单,是最简单的bootloader,叫做硬件启动程序更合适一些。
2 ARM映像文件
(1) *.axf 格式和*.bin格式文件
ADS编译后生成的ARM映像文件有*.axf 格式和*.bin格式两种,有时二者容易被混淆。其实*.bin格式文件是真正的可执行文件,而*.axf 格式文件是ARM特有的调试文件,里面除了包含*.bin格式文件的内容之外,还附加了许多其它调试信息,这些调试信息可以用在AXD Debugger的调试中,在AXD Debugger中通过Load Image命令下载*.axf格式的文件到目标板的RAM中运行调试。由于烧写工具是原封不动地将映像文件烧入Flash中,所以*.axf 格式文件是不可以被烧入的,否则Flash的0x00000000处就不是真正的第一条指令,而是*.axf 格式的头部分。应该将*.bin格式文件烧入,保证Flash的0x00000000处是第一条指令。总之,*.bin格式文件是用来被烧写入Flash中的,而*.axf格式文件是在AXD Debugger中通过Load Image命令下载调试用的。
(2)ARM映像文件的结构
一个典型的可执行程序的映像文件结构通常如图1所示。
RO段一般包括代码段和一些常量,在运行的时候是只读的。而RW段包括一些全局变量和静态变量,定义时带初始值,在运行的时候可以被改变(读写)。如果有部分全局变量被初始化为零,则RW段里还包括了ZI段。因为RO段是只读的,在运行的时候不可以被改变,所以,在运行的时候,RO段可以驻留在Flash里(当然也可以在SDRAM或者SRAM里了,这样速度会更快些),而RW段是可以被读写的,所以运行的时候必须被装载到SDRAM或者SRAM里。

图1 可执行程序映像的结构
图1中所示的映像文件的结构图指的是映像文件被烧入(存放)在ROM/Flash中时的状态,这时RW直接跟在RO后面,当程序运行时,初始化程序会把RW或ZI拷贝到相应的地方。到底拷贝到什么位置,是通过设置RO BASE 和RW BASE,告诉链接器(linker)该程序的起始运行地址(RO BASE)和 RW段的地址 (RW BASE)。如果一个程序只有RO段,没有RW段,那么这个程序可以完全在Flash里运行,不需要用到SDRAM 或者 SRAM。如果一个程序既包括RW段又包括RO段,那么该程序的RW段必须在被访问之前被拷贝到SDRAM 或者SRAM里去,以保证程序可以正确运行。

图2 映像文件在执行前和执行时的状态图
图2说明了一个可执行映像文件执行前和执行时的状态。从图中可以看到,整个程序在执行前是放在ROM/Flash里的,在执行的时候,RW段被拷贝到了RAM里的合适位置去。这时RO和RW的起始地址分别由RO BASE 和RW BASE指定,也就是说,RO BASE 和RW BASE的值是在映像文件开始运行时才起作用,当然,这里也用到了内存地址重映射。如果映像文件仅仅是存放在ROM/Flash中,映像文件是按图1的方式存放ROM/Flash中的,RW直接跟在RO的后面。
3 S3C2410的启动模式
S3C2410支持两种启动模式:从Nand Flash 启动和从外部nGCS0片选的Nor Flash启动,默认的是从Nand Flash启动。
S3C2410到底从哪儿启动是由外部管脚OM1和OM0的电平组合决定的,OM1 OM0=00,表示从Nand Flash启动,OM1 OM0=11,表示测试模式,其余的为Nor Flash启动,其中OM1 OM0=01表示16bit的存储器,OM1 OM0=10表示32bit的存储器。
当程序被烧入到Nand Flash中时,程序不能直接在Nand Flash中运行,S3C2410处理器内部集成了8位Nand Flash控制器,在该Nand Flash控制器内部有一个被称为“Steppingstone”的4K的RAM。当OM1、OM0都是低电平——即S3C2410从Nand Flash启动时,Nand Flash的前4k代码会被自动地复制到“Steppingstone”中,“Steppingstone”被映射为地址0,即nGCS0,CPU从0x00000000位置的“Steppingstone”中开始执行启动代码。这4k代码必须把更多的代码从Nand Flash中读到SDRAM中去,因此要把最核心的启动程序放在Nand Flash 的前4K中。
当程序被烧写到Nor Flash 中时,则程序可以直接在Nor Flash中运行,只需要将Nor Flash映射到存储器控制器的第0块,即nGCS0,再设置相应的寄存器即可。
在这两种启动模式下, 各片选的存储空间分配是不同的,如图3所示。

图3 S3C2410的存储空间分配
4 结束语
俗话说,万事开头难,特别是对于有一定难度的嵌入式系统的学习,入门阶段更是容易迷惑,好多东西不能很好地理解,本文的目的就是帮助初学者能够较快地突破难点,能够较快地掌握嵌入式系统的基础知识,入了门以后,对整个嵌入式基础知识有了较好的理解和掌握,在此基础上再进行更深一步的学习和开发相对来说就会容易一些。当然,嵌入式系统的学习还有很多其他需要注意的地方,例如要多动脑、多动手、多实践、多研究、多分析源代码,很多时候需要通过跟踪调试才能真正理解系统的执行过程,等等,学习者可以在学习的过程中不断地总结。
参考文献:
[1]徐英慧,马忠梅等.ARM9嵌入式系统设计-基于S3C2410与Linux[M].北京:北京航空航天大学出版社,2007,(9).
[2]杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2003.
[3]李岩,王小玉,孙永春.嵌入式系统教学研究[J].南京:电气电子教学学报,2006,28(3).
教研项目:郑州航空工业管理学院(zhjy-08-01-51)