mingdu.zheng <at> gmail <dot> com
http://blog.csdn.net/zoomdy/article/details/8916967

 

1. 简介

eCos提供了Linux Synthetic Target,通过Synthetic Target可以将eCos应用作为一个普通进程在Linux系统内运行, 这既提供了体验eCos的机会又不需要繁琐的硬件准备工作,关于Linux Synthetic Target的更多信息请阅读参考资料。

本文介绍如何在32位Xubuntu系统下开始eCos Synthetic旅程,这是《eCos Synthetic实践》系列的第一篇, 主要内容包括:配置宿主机使其支持eCos Synthetic的配置、编译,使用Eclipse创建最简单的Hello World工程, 并对Hello World进行配置、编译、调试。

本文假设宿主机系统为32位Xubuntu 12.04,如果使用其它32位版的Linux发行版, 那么软件安装指令需要根据所使用的系统作相应地调整,Synthetic不支持Cygwin环境, 如果使用的是64位系统,那么需要一些额外的工作,请参考《x86_64宿主机》一节。

 

2. 建立开发环境

2.1. 安装必要的宿主机软件

安装版本控制软件、C++编译器、Eclipse集成开发环境。

sudo apt-get install mercurial g++ eclipse-cdt

mercurial是eCos项目当前采用的版本控制软件,安装mercurial可以让我们获取最新的eCos代码, mercurial的字面意思是“水银”,因此mercurial的命令为hg,hg是“水银”的化学符号。

g++为GNU C++编译器,C++是eCos的主要实现语言之一,因此需要安装C++编译器,Xubuntu默认已安装C编译器, 但是没有安装C++编译器。

eclipse-cdt为Eclipse C/C++ Develepment Tools,是强大的Eclipse适用于C/C++的版本, Eclipse可以编辑、编译、调试C/C++工程,Eclipse支持C/C++预处理指令解析并将预处理后无效的代码进行灰色处理, 这对阅读有大量预处理指令的eCos代码是非常有帮助的,在Eclipse的帮助下可以很容易分辨出eCos哪部分代码在当前配置下是被编译进目标文件的, 哪些是被忽略的。此外,Eclipse还是非常棒的GDB前端,在没有Eclipse之前,Insight是个不错的选择,但自从有了Eclipse后, 世界改变了,具有商业支持的eCosPro就提供了基于Eclipse的集成开发环境。

2.2. 获取eCos代码

通过hg获取eCos的最新代码,代码存储在~/ecos-hg。

hg clone http://hg-pub.ecoscentric.com/ecos ~/ecos-hg

2.3. 获取eCos配置工具

获取最新版适用于Linux系统的eCos配置工具,并解压到~/ecos-tools。

mkdir ~/ecos-tools
cd ~/ecos-tools
wget ftp://sourceware.org/pub/ecos/anoncvs/ecos-tools-bin-110209.i386linux.tar.bz2
tar -xf ecos-tools-bin-110209.i386linux.tar.bz2

3. 配置编译eCos Synthetic库

打开eCos Configuration Tool。

~/ecos-tools/configtool

第一次打开eCos Configuration Tool将会打开Choose folder for eCos repository对话框, 在输入框内填入/home/user/ecos-hg/,点击OK关闭对话框。

图 1. Choose folder for eCos repository对话框

 

通过菜单Build > Templates打开Templates对话框, 在Hardware的下拉列表中选择Linux synthetic target,点击OK关闭对话框将自动加载模板配置。

图 2. Templates对话框

 

加载模板后可能会有部分选项冲突,将弹出Resolve conflicts对话框,点击Continue按钮自动解决冲突。

图 3. Resolve conflicts对话框

 

通过菜单File > Save保存配置文件,假设保存为~/ecos-conf/synth_default.ecc, 后续Eclipse引用头文件的路径跟配置文件的存储路径有关。

通过菜单Build > Library开始编译eCos库,第一次编译将弹出Build Tools Path对话框, 这里编译Synthetic目标使用的是Linux原生编译器,因此在输入框内填入/usr/bin,点击OK按钮开始编译eCos库,这需要一些时间。

图 4. Build Tools Path对话框

 

4. 编译运行eCos单元测试(可选)

eCos几乎每个组件都提供了或多或少的单元测试文件, 通过eCos Configuration Tool可以自动编译运行与当前配置有关的所有单元测试,并且自动判断测试结果,这又是eCos的一大亮点。 单元测试是可选的,可以忽略该步骤而不影响后面的步骤。

在编译Tests之前,首先解决一个bug。

mv ~/ecos-hg/packages/infra/current/tests/cxxsupp.cxx ~/ecos-hg/packages/infra/current/tests/cxxsupp.cxx.orig
sed "s/#ifndef CYGPKG_HAL_H8300/#if 0/" ~/ecos-hg/packages/infra/current/tests/cxxsupp.cxx.orig \
> ~/ecos-hg/packages/infra/current/tests/cxxsupp.cxx

将cxxsupp单元测试屏蔽,cxxsupp使用了C++默认的new和delete操作符,new和delete操作符是由libsupc++.a提供的, libsupc++.a由编译器提供,这里使用的是Linux原生编译器,包括Ubuntu在内的部分Linux发行版目前使用的GCC编译器默认打开堆栈检查, 因此libsupc++.a引用了与堆栈检查有关的函数__sprintf_chk,__sprintf_chk的作用是先进行堆栈检查然后再执行真正的sprintf操作, __sprintf_chk是由glibc提供的,而eCos使用的是eCos自己的C库,不会链接到glibc,而且eCos的C库也没有提供__sprintf_chk函数, 因此编译cxxsupp单元测试将导致链接失败(undefined reference to `__sprintf_chk’), 这里通过屏蔽cxxsupp单元测试的办法解决这个问题。

通过菜单Build > Tests编译单元测试,这需要一些时间。

编译完成后通过菜单Tools > Platforms打开Platforms对话框, 选择linux项点击Modify…按钮打开Modify Platform对话框,将Command prefix清空,这里使用原生编译器不需要前缀, 将Inferior内的gdb命令的前缀删除。

图 5. Platforms对话框

 

图 6. Modify Platform对话框

 

通过菜单Tools > Run Tests打开Run Tests对话框,点击Output标签页,点击Run按钮开始执行单元测试, 在Output视图可以看到测试过程的输出,测试完成后点击Summary标签页察看测试结果, Pass表示测试通过,Inapplicable表示当前配置下该测试不可用,Fail表示测试失败。

图 7. Run Tests对话框,正在执行测试

 

图 8. Run Tests对话框,测试结果摘要

 

5. 创建Hello World工程

5.1. 新建工程

打开Eclipse,通过菜单File > New > Project,选择C/C++分类下的C Project, 打开C Project项目创建向导,Project name 输入 synth-hello,Project type选择Hello World ANSI C Project, 点击Finish完成项目创建。

图 9. C Project对话框

 

5.2. 配置工程

通过菜单Project > Properties打开Properties for synth-hello对话框, 选择C/C++ general分类下的Paths and Symbols页,选择Includes标签页,点击Add…按钮添加eCos库头文件路径, 这里假设用户名为user,eCos配置文件存储为~/ecos-conf/synth_default.ecc, 那么对应的eCos库头文件路径为/home/user/ecos-conf/synth_default_install/include, 将Add to all configurations选项勾上将该路径添加到所有工程配置, 将Add to all languages选项勾上将该路径添加到所有语言的搜索路径中。

图 10. Properties对话框

 

图 11. 添加头文件路径对话框

 

选择Library Paths标签页,点击Add…按钮添加库文件搜索路径, 这里假设用户名为user,eCos配置文件存储为~/ecos-conf/synth_default.ecc, 那么对应的eCos库文件路径为/home/user/ecos-conf/synth_default_install/lib, 将Add to all configurations选项勾上将该路径添加到所有工程配置, 将Add to all languages选项勾上将该路径添加到所有语言的搜索路径中。

图 12. 添加库文件路径对话框

 

选择C/C++ Build分类下的Settings页,选择Tool Settings标签页,选择GCC C Linker > General, 将-nostartfiles、-nodefaultlibs、-nostdlib、-static这四个选项勾上,eCos使用自带的C库,不会链接到任何Linux库。 选择GCC C Linker > Miscellaneous,在Linker flags输入框填入-Ttarget.ld,eCos使用自己生成的链接控制文件。

图 13. 设置链接选项(一)

 

图 14. 设置链接选项(二)

 

5.3. 编译工程

通过菜单Project > Build Project编译工程,在Console视图可以看到编译输出及结果。

5.4. 调试工程

通过菜单Run > Debug Configurations打开调试配置对话框,在C/C++ Application上右键,选择New, 新建一个 C/C++ Application类型的调试配置,点击右下角Debug按钮开始调试。

图 15. 调试配置对话框

 

开始调试后提示进入调试模式,点击Yes进入调试模式,默认配置下将在main函数处设置端点,因此进入main函数后, 程序停止执行,等待下一步指令,通过Debug视图的调试按钮可以开始单步调试。

图 16. 初始调试视图

 

点击Debug视图的Step Into按钮进入函数内部,从Eclipse打开的源代码文件可以看出puts函数是由eCos自己提供的, Debug视图可以察看函数调用栈。Synthetic不支持多线程调试,因此Debug只能察看当前线程的调用栈。

图 17. 单步调试

 

puts函数执行后,可以在Console视图看到输出的“!!!Hello World!!!”字符串, 看到Hello World说明eCos Synthetic已经能够在Linux系统上正确运行,欢迎进入eCos Synthetic的世界。

图 18. 调试输出

 

6. x86_64宿主机

eCos配置工具及Synthetic相关的代码是32位的,在64位系统下运行32位软件需要安装额外的库文件。 下面列出的解决办法理论上无论是Intel的64位还是AMD的64位都是通用的,但是仅在Intel i3处理器上验证过。

sudo apt-get install ia32-libs

安装32位库文件,只有在安装了32位库文件后eCos Configuration Tool才能正常运行, 否则将报错:bash: ./configtool: No such file or directory

sudo apt-get install g++-multilib

安装multilib以支持32位软件开发,根据依赖关系将自动安装lib32gcc1、gcc-multilib等,否则在编译eCos单元测试或者eCos应用时报错: /usr/bin/ld: cannot find libgcc.a /usr/bin/ld: cannot find libsupc++.a /usr/bin/ld: cannot find libgcc_eh.a

为编译器、链接器、汇编器添加-m32选项,64位系统下默认使用64位方式编译程序,但是eCos库仅支持32位模式, 因此应用程序也只能使用32位模式,否则链接失败: /usr/bin/ld: skipping incompatible /home/user/ecos-conf/synth_default_install/lib/vectors.o when searching for vectors.o ; /usr/bin/ld: cannot find vectors.o

图 19. 编译器添加-m32选项

 

图 20. 链接器添加-m32选项

 

图 21. 汇编器添加-m32选项

 

7. 参考资料

在线资料

  1. 《XXXVIII. eCos Synthetic Target》:官方参考手册。
  2. 《eCos的Linux Synthetic Target简介》:官方参考手册的部分翻译。
  3. 《eCos需要Synthetic虚拟目标板的理由》:谁需要Synthetic,什么情况下需要Synthetic?
  4. 《虚拟实验室eCos开发环境的配置 (Linux)》:使用基于QEMU的模拟器运行eCos。
  5. VirtualBox:虚拟机软件。
  6. Xubuntu:易于使用又节省资源的Linux发行版。

中文图书

  1. 《嵌入式可配置实时操作系统eCos软件开发》
  2. 《嵌入式可配置实时操作系统eCos开发与应用》
  3. 《嵌入式可配置实时操作系统ecos开发与应用》 第2版
  4. 《嵌入式可配置实时操作系统eCos技术及实现机制》
Logo

更多推荐