eCos Synthetic实践(一)——Hello World!
mingdu.zheng <at> gmail <dot> comhttp://blog.csdn.net/zoomdy/article/details/89169671.简介eCos提供了Linux Synthetic Target,通过Synthetic Target可以将eCos应用作为一个普通进程在Linux系统内运行, 这既提供了体验eCos的机会...
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. 参考资料
在线资料
- 《XXXVIII. eCos Synthetic Target》:官方参考手册。
- 《eCos的Linux Synthetic Target简介》:官方参考手册的部分翻译。
- 《eCos需要Synthetic虚拟目标板的理由》:谁需要Synthetic,什么情况下需要Synthetic?
- 《虚拟实验室eCos开发环境的配置 (Linux)》:使用基于QEMU的模拟器运行eCos。
- VirtualBox:虚拟机软件。
- Xubuntu:易于使用又节省资源的Linux发行版。
中文图书
更多推荐
所有评论(0)