微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 简介RTLinux下的一种实时应用通信机制

简介RTLinux下的一种实时应用通信机制

时间:05-15 来源:互联网 点击:

必须回复一个确认消息,新的接收消息只有在收到确认消息以后才能发出。

这种方式在实时模块和非实时模块中均须要采用轮询的方式监测新数据和消息的到来,因此会占用较多的处理器资源。所以,可以考虑利用RT_FIFO实现实时模块和非实时模块之间对共享内存的存取同步。利用RT_FIFO所提供的句柄功能能够避免实时模块对接收消息的轮询监测,在一定程度上提高程序运行效率。 具体实现,可以通过利用RT_FIFO实时传输当前所写入或被读出的共享内存块序号,实现实时进程和非实时进程之间的步。因为RT_FIFO是一种单向传输队列,为了实现交互,需要两个传输方向相反的RT_FIFO,连接于两个模块之间,如图3所示。 图3中,BufNo为笔者自行定义的队列。它的使用主要是为了避免由于RT_FIFO引起的实时部分和非实时部分之间的死锁。 实时部分和非实时部分的各线程路之间对共享内存的访问为异步进行;同时,RTLinux中对RT_FIFO的进行读/写的API函数,为阻塞式操作。当 FIFO0中目前没有可读数据时,对rtf_get函数的调用会使程序陷入无限等待之中,很容易造成实时模块和非实时模块之间的死锁。 为了避免这种情况,可以将BufNo作为缓冲区与FIFO0的句柄结合使用,临时存放FIFO0中被非实时线程写入的块序号。实时模块不再对FIFO0进行读/写,而是改由BufNo队列中获取当前有效的共享内存序号。如果当前无可用数据,则进入周期等待状态。

3.2 共享内存访问的互斥 对共享内存访问的互斥操作,包括两个方面:实时模块与非实时模块之间的互斥、非实时模块中各采集线程之间的互斥。 (1)实时模块与非实时模块之间的互斥 多线程之间对共享资源访问的互斥,是操作系统中一个重要的研究分支。但是在实时模块和非实时模块之间,问题变得相对简单。因为,在实时进程和非实时进程之中,实时进程和非实时进程运行的环境区别很大。工作于RTLinux环境下的实时进程具有最高的优先级,不可能被非实时进程中断。所以,在实现互斥时,只须保护非实时进程对共享资源的访问即可。 抽象流程如图4所示。利用共享内存区域的第一个字节作为访问标识,实现非实时模块对实时模块的互斥。 非实时进程开始访问共享区域时,将此标识置位;访问结束时,复位。实时进程在访问共享区域前先检测该标识,如果标识允许访问,则执行写入操作;反之,挂起等待标识位复位,按既定周期T轮询。 实时进程的既定周期T的设置十分重要,周期过长,会增加发生冲突后的等时间,导致共享内存状态改变时,无法被及时写入;周期过短,增加了系统的轮询次数,加重实时系统的负担。笔者在已实现的数据采集程序中,对T的不同设置,所获得的平均数据采集率进行了统计,结果如图5所示。 注:以上实验的测试平台为PentiumIII 667,5400转普通硬盘,RTLinux3.1、Linux kernel 2.4.4,数据流向为数据采集外设至共享内存然后存放硬盘,数据的产生频率为10ms。 (2)非实时模块之间的互斥 非实时模块中异步执行的各采集线程之间,可以利用互斥变量的加锁和解锁实现对共享内存访问的互斥。由于互斥区的执行体内,每次只允许一个线程进入,为了保证程序的执行效率,在互斥区中不宜使用耗时较长或阻塞式调用的函数。

4 结论 在RTLinux提供的实时模块和非实时模块之间的通信接口中,RT_FIFO和共享内存较为常用,分别适用于不同的数据类型通信。本文提出的这种方法,能充分利用两者的优点,方便地实现实时与非实时之间海量数据通信。目前已在rtLinux3.1、Linux kernel 2.4.4系统平台上成功实现,并取得了令人满意的效果。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top