天天看点

eCos Synthetic实践(三)——I/O辅助进程

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组件

​​​

eCos Synthetic实践(三)——I/O辅助进程

​​

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. 添加程序参数

​​​

eCos Synthetic实践(三)——I/O辅助进程

​​

再切换到Environment标签页,添加环境变量ECOS_REPOSITORY=”~/ecos-hg/packages”,这个环境变量指向所使用的eCos仓库的根目录。

图 3. 添加环境变量

​​​

eCos Synthetic实践(三)——I/O辅助进程

​​

如果没有添加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. 运行效果

​​​

eCos Synthetic实践(三)——I/O辅助进程

​​

5. 参考资料

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

继续阅读