2 Xenomai原理与应用
2.1 Xenomai简介及其Adeos实现
Xenomai是一个自由软件项目,提供了一个基于Linux的实时解决方案。它可以提供工业级RTOS的性能,而且完全遵守GNU/Linux自由软件协议。目前最新稳定版本是2.4.5.
Xenomai项目起始于2001年。从2003年夏天起,Xenomai和RTAI有了两年时间的合作,期间开发了广为人知的RTAI/fusiON项目分支。到2005年,Xenomai项目又重新独立出来。而从2.0.0版本开始,Xenomai在硬件平台的移植就一直是基于Adeos构架来实现的。
在基于Adeos的系统中,分为多个域。每个域中独立运行一个操作系统(或者是实现一定功能的程序模块),每个域可以有独立的地址空间和类似于进程、虚拟内存等的软件抽象层。在各个域下层有一个Adeos通过虚拟中断等方法来调度上面的各个域。在基于Adeos的系统中,存在着A、B、C、D四种类型的交互,如图1所示。
A类交互是各个域直接操作硬件设备,包括访问内存等;B类交互指当Adeos接收到硬件中断后,会根据中断来对相应的域进行中断服务;C类交互指当前域内的操作系统主动向Adeos请求某些服务;D类交互是指Adeos接收硬件产生的中断和异常,同时也可以直接控制硬件。
2.2 Xenomai用户层实时的实现
Xenomai除了在内核层利用Adeos实现了硬实时外,它在用户空间也有很好的实时性。在S3C2410平台上,为了实现用户层的实时,Xenomai实现了一个硬件计数器--Decrementer.这个硬件计数器可以在用户空问里很好地模拟TSC(Time Stamp Counter,时间戳计数器)。
同时,Xenomai在Linux内核中加入了一个全新的数据结构__ipipe_tscinfo,可以通过此数据结构变量存放用户层需要的数据。该数据结构组成如下:
在用户层,应用程序通过系统调用可以迅速得到struct_ipipe_tscinfo结构体中的数据。而且为了避免受到缓存的影响,Xenomai将此结构体变量存放在Linux的向量页中。
内核通过函数_ipipe_mach_get_tscinfo来填充struct_ipipe_tscinfo结构体变量中的各项内容:
其中,info一>typte说明在S3C2410平台上TSC是基于Decrementer硬件计数方式的;info一>u.dec.counter用来将Decrementer计数器的物理地址设定为0x51000038;info一>u.dec.mask掩码用来注明使用Dec-rementet.计数器中的特定位;info一>u.dec.tsc指向存放64位TSC值的区域。
在Xenomai用户层的实时程序运行时,程序都会通过系统调用得到内核填充好的struct_ipipe_tscinfo结构体变量。具体实现可参考编译用户层实时程序时用到的,由Xenomai所提的头文件/usr/xenomai/include/asm/syscall.h.