mingdu.zheng <at> gmail <dot> com
1. 简介
I/O辅助进程为eCos Synthetic提供不能简单通过系统调用实现的设备模拟。 I/O辅助进程为eCos和虚拟设备之间提供了标准接口,通过该接口可以模拟数据读写和中断。 I/O辅助进程提供了一个用户界面, 通过用户界面可以为开发人员提供一个直观的状态指示。 I/O辅助进程的主要部分使用TCL编写,因此其模拟设备的实现也可以使用TCL语言实现,这使得扩展I/O辅助进程变得更加容易。
本文是《eCos Synthetic实践》系列的第三篇,介绍怎样配置、编译、安装I/O辅助进程,以及相关的设备模块, 配置、编译、安装过程是标准的configure, make, make install三部曲。以及I/O辅助进程的使用和tdf配置文件。
2. 安装附加软件
首先需要安装tcl-dev和tk-dev,分别是tcl和tk的开发包,I/O辅助进程使用TCL实现,使用Tk实现其用户界面, 因此需要安装这两个开发包。
sudo apt-get install tcl-dev
安装tcl-dev开发包,如果未安装该软件包,那么将出现错误:unable to locate Tcl configuration file tclConfig.sh
sudo apt-get install tk-dev
安装tk-dev开发包,如果未安装该软件包,那么将出现错误:unable to locate Tk config file tkConfig.sh
3. I/O辅助进程的编译安装
3.1. 编译安装I/O辅助进程主模块和Console模块
mkdir ~/build
cd ~/build
~/ecos-hg/packages/hal/synth/arch/current/host/configure
make
sudo make install
默认安装到/usr/local/libexec/ecos/hal/synth/arch/<version>目录下。 主要文件包括ecosynth, ecosynth.tcl, console.tcl。ecosynth是由C语言编译的二进制可执行文件, ecosynth初始化TCL的运行环境,然后调用TCL解释器运行ecosynth.tcl脚本,ecosynth.tcl是I/O辅助进程的主体部分, 提供数据传输、中断管理、用户界面等功能。console.tcl是终端模拟设备,用来接收eCos的诊断输出并将输出显示在I/O辅助进程的窗口内, console.tcl由ecosynth.tcl根据tdf配置选项决定是否加载。不能直接执行这三个文件中的任意一个,这也是将这几个文件存储在libexec目录下的原因, ecosynth由eCos在初始化时创建执行。
3.2. 编译安装Ethernet模块
rm * -rf
~/ecos-hg/packages/devs/eth/synth/ecosynth/current/host/configure
make
sudo make install
默认安装到/usr/local/libexec/ecos/devs/eth/synth/ecosynth/>version<目录下。 主要文件包括ethernet.tcl、rawether,ethernet.tcl是虚拟以太网设备的实现文件,由ecosynth.tcl根据tdf配置选项进行加载, rawether是由C语言编译的二进制可执行文件,用来帮助ethernet.tcl完成一些使用TCL语言不能实现的底层操作, 主要是对Linux以太网设备的读写,可以是真实的网卡,也可以是TAP设备。
3.3. 编译安装Framebuffer模块
rm * -rf
~/ecos-hg/packages/devs/framebuf/synth/current/host/configure
make
sudo make install
默认安装到/usr/local/libexec/ecos/devs/framebuf/synth/>version<目录下。 主要文件包括framebuf.tcl、framebuf,framebuf.tcl是虚拟显示设备的实现文件,由ecosynth.tcl根据tdf配置选项进行加载, framebuf是由C语言编译的二进制可执行文件,用来帮助framebuf.tcl完成一些使用TCL语言不能实现的底层驱动, 主要是像素格式换行和对X Server的绘图输出。
3.4. 编译安装Watchdog模块
rm * -rf
~/ecos-hg/packages/devs/watchdog/synth/current/host/configure
make
sudo make install
默认安装到/usr/local/libexec/ecos/devs/watchdog/synth/>version<目录下。 Watchdog是相对简单的设备,由watchdog.tcl实现,不需要C语言实现的其它程序来辅助,watchdog.tcl由ecosynth.tcl根据tdf配置选项进行价值。
4. 简单实例
接下来我们将创建一个比较简单的实例,该实例将引用诊断输出和看门狗这两种相对简单的设备。
4.1. 配置编译eCos库
请参考《eCos Synthetic实践(一)——Hello World!》3. 配置编译eCos Synthetic库。
需要补充的是需要添加Watchdog IO device,这里的实例将引用Watchdog组件。
图 1. 添加Watchdog IO device组件
4.2. 创建Eclipse工程
打开Eclipse,通过菜单File > New > Project,选择C/C++分类下的C++ Project, 打开C++ Project项目创建向导, Project name 输入 synth-hello,Project type选择Hello World C++ Project, 点击Finish完成项目创建。 剩下的工作请参考《eCos Synthetic实践(一)——Hello World!》5. 创建Hello World工程
实例C++代码,将下列代码覆盖Eclipse工程的源代码, 在这个代码中,不断增加复位看门狗的延时时间,直到看门狗超时停止eCos应用程序。
#include <cyg/infra/diag.h>
#include <cyg/kernel/kapi.h>
#include <cyg/io/watchdog.hxx>
int main(void)
{
diag_printf("Start watchdog.\n");
Cyg_Watchdog::watchdog.start();
for(int i = 0; ; i++)
{
diag_printf("Delay %d ticks.\n", i * 10);
cyg_thread_delay(i * 10);
diag_printf("Reset watchdog.\n");
Cyg_Watchdog::watchdog.reset();
}
return 0;
}
实例tdf文件,保存到~/.ecos/synth/default.tdf,tdf文件是I/O辅助进程的配置文件。
synth_device console {
filter trace {^TRACE:.*} -foreground HotPink1 -hide 1
}
synth_device watchdog {
use wallclock_time
}
4.3. 编译工程
通过菜单Project > Build Project编译工程,在Console视图可以看到编译输出及结果。
4.4. 运行eCos应用和I/O辅助进程
默认情况下,调试或运行eCos不会执行I/O辅助进程,需要为eCos可执行文件加上–io选项才会执行I/O辅助进程。 如果在Eclipse环境下调试,那么通过Run > Debug Configurations…打开调试配置对话框, 在C/C++ Application上右键,选择New, 新建一个 C/C++ Application类型的调试配置。 选择Arguments标签页,在Program arguments输入框内加入选项“–io”。
图 2. 添加程序参数
再切换到Environment标签页,添加环境变量ECOS_REPOSITORY=”~/ecos-hg/packages”,这个环境变量指向所使用的eCos仓库的根目录。
图 3. 添加环境变量
如果没有添加ECOS_REPOSITORY环境变量,那么默认使用编译I/O辅助进程的那个eCos仓库作为当前的eCos仓库, 但是ecosynth.tcl文件存在一个bug,变量名引用错误,实际上不能正确使用默认的eCos仓库。 如果没有添加环境变量,那么将导致错误:can’t read “synth::_ecos_repository”: no such variable,
如果通过终端运行eCos程序,那么在程序前设置环境变量,程序名后添加–io参数。
ECOS_REPOSITORY=~/ecos-hg/packages/ ./synth-hello --io
4.5. 运行效果
下图是看门狗超时后的I/O辅助进程主界面,可以看到diag_printf输出的文字信息显示在程序主界面中,右上角显示看门狗状态, 图中的狗叫图形象地展示了超时状态。
图 4. 运行效果
5. 参考资料
- 《eCos Synthetic实践(二)——简单外设》
- 《eCos Synthetic实践(一)——Hello World!》
- 《XXXVIII. eCos Synthetic Target》:官方参考手册。
- 《eCos的Linux Synthetic Target简介》:官方参考手册的部分翻译。
- 《eCos需要Synthetic虚拟目标板的理由》:谁需要Synthetic,什么情况下需要Synthetic?
- 《虚拟实验室eCos开发环境的配置 (Linux)》:使用基于QEMU的模拟器运行eCos。
- VirtualBox:虚拟机软件。
- Xubuntu:易于使用又节省资源的Linux发行版。