网上关于S3C6410裸机程序开发都是基于RealView RVDS。也有一些是基于eclipse的,但都没有详细介绍在eclipse中如何建立S3C6410裸机程序工程。
尽管友善之臂提供的6410裸机程序示例使用了eclipse工程,然程序的编译却还是基于makefile的。那怎样建立6410的eclipse裸机程序工程呢?本文就此进行详细介绍。有了这个工程,可以简化裸机程序的开发过程,把精力专注于功能实现。
设置eclipse字体
因为友善之臂提供的裸机程序示例使用的是UTF-8编码,为正常使用这些源码,把eclipse的字体编码设为UTF-8格式。Windows—>Preferences中,选择General—>Workspace,如下图所示。
建立C工程
在eclipse中建立一个C工程,假设工程名称为6410App。Project Type和Toolchains如下图所示。
Cross GCC Command设置如下。交叉编译器使用上一节所介绍的编译器。
添加源文件
建立工程后,往工程添加源文件。工程结构如右图所示。虽然是裸机程序开发,但在程序构思设计上,还是力图把底层驱动、上层应用程序分开来,体现一个成熟系统设计思路。
common文件夹
工程中公共头文件。
driver文件夹
所有和底层驱动实现。其中,clock.c、drv_common.h、nand.c、sdram.c都是从友善之臂提供的裸机示例程序中拷贝过来的。
src文件夹
相对于底层驱动的源文件。实现用户应用程序功能。
script文件夹
链接脚本文件。用于控制程序的链接行为。如果没有指定链接脚本,编译时默认使用交叉编译器的链接脚本文件。
配置工程
在工程导航中,选中工程,右键选择Properties。在弹出的对话框中,选择C/C++ Build—>Setting。主要的配置内容有:
preprocessor配置
点击Cross GCC Compiler—>Proprocessor,勾选右边窗口的Do not search system directories(-nostdinc)。相当于编译程序时加上选项:-nostdinc。该选项的含义为:编译程序时不要在标准系统目录中搜索头文件。裸机程序没有用到交叉编译器提供的库函数,故不需要去搜索这些头文件。
添加包含路径
点击Cross GCC Compiler—>Includes,在右边窗口中添加common文件夹为包含路径。如下图所示。添加包含路径的目的是:包含common文件夹下的头文件时可以不用带路径。
链接选项
点击Cross GCC Linker—>General,勾选右边窗口前面三个选项,相当于添加三个链接标志:-nostartfiles、 -nodefaultlibs、-nostdlib。这三个链接标志的含义为:
-nostartfiles
连接时不使用标准系统的启动文件。标准系统库通常被使用,除非选项“-nostdlib”和“-nodefaultlibs”被使用。
-nodefaultlibs
连接的使用不使用标准系统库。只有你指定的库才能够传递给连接器。与系统库有关的特定的连接选项(例如-static-libgcc 和 -shared-libgcc )将会被忽略。标准的启动文件通常会被使用,除非-nostartfiles选项被使用。
编译器可能会生成memcmp,memset,memcpy和memmove的调用,这些entries通常会被标准库libc中的相关的entries解决。当这个选项被使用的时候,这些入口点应该通过其他的方法被提供。
-nostdlib
链接的时候不使用标准的系统启动文件和系统库。 没有启动文件和只用你指定的库可以被传递给连接器。与系统库有关的特定的连接选项(例如-static-libgcc 和 -shared-libgcc )将会被忽略。编译器可能会生成memcmp,memset,memcpy和memmove的调用,这些entries通常会被标准库libc中的相关的entries解决。当这个选项被使用的时候,这些入口点应该通过其他的方法被提供。
指定链接脚本
点击Cross GCC Linker—>Libraries,在右边下半窗口Library search path(-L)中,指定链接脚本的路径。在GNU链接选项中,-L用来指定要链接的库的搜索路径。
点击Cross GCC Linker—>Miscellaneous,在右边的Linker flags中加入-Tlink_script.lds。在GNU链接选项中,-T用来指定链接脚本文件。
设置编译步骤
点击Setting窗口Build Steps标签,在Post-build steps中加入如下命令:
arm-none-eabi-objcopy -O binary ${ProjName}.elf ${ProjName}.bin; arm-none-eabi-objdump -D ${ProjName}.elf > ${ProjName}.dis
交叉编译器默认编译输出的镜像格式为elf格式。上述命令就是把这elf格式转换为bin格式,并输出dis文件(汇编格式的程序文件)。
点击Setting窗口Build Artifact标签,设置输出镜像的后缀。在Artifact extension中输入elf。表示输出的镜像后缀为.elf。
编译工程
经过上述步骤,完成工程配置后,就可以编译工程了。使用友善之臂提供的Minitools工具,把工程Debug目录下把6410App.bin烧写到tiny6410开发板的DDR中。
总结
通过这个工程,让我进一步理解和熟悉了一些之前不明白的eclipse工程配置选项,具体来说,是理解了一些GNU编译链接选项的含义和使用方法。