基于RTLinux的实时控制系统
在编写实时程序时,应特别注意的是:实时任务运行在内核水平,是为了提供对计算机硬件的直接访问能力,为避免不确定的延迟,RTLinux给代码和数据分配固定的内存空间。实时任务不能使用Linux的系统调用及Linux中的程序与数据结构,否则难以保证数据的一致性。此外应控制实时程序的执行时间,编写程序时应注意包含与API函数对应的头文件。
内核程序中与RT-FIFO相关的函数有:
rtf_create():创建RT-FIFO。
rtf_get():从RT-FIFO读数据。
rtf_put():向RT-FIFO写数据。
rtf_create_handler():建立响应RT-FIFO变化的子程序。
内核程序中与实时任务线程相关的函数有:
pthread_create():创建实时任务对应的线程。
pthread_wait_np():将当前线程挂起,直至下一个周期线程。
pthread_makeperiodic_np():设置线程的属性并启动线程。
pthread_suspend_np():将本线程无限期挂起,即终止任务。
在调试阶段,需要将有bug的模块卸载。该项工作由cleanup_module()来完成。在卸载模块时将rtf1、rf2和rtf3撤销,并撤销实时任务Task1。
3.2 应用程序
Linux下应用程序gatect1_app工作流程见图4,其程序用Linux下的C语言开发。集中监控站和维护站的程序在Windows下用Visual C++开发。其中有几点要说明:
·RT-FIFO被Linux视为字符设备,因此可以通过调用open("/dev/rtf1",O_RDONLY)来获得rtf1的指针,rtf2的rtf3类似。获得指针后通过read和write函数实现对RT_FIFO的读写操作。
·程序中调用select函数检查RT_FIFO是否忙,以避免读RT_FIFO时出现阻塞现象。
·LCD显示模块MGLS-240128内置智能控制器,只需将待显示的数据送控制器的显示缓冲区就能实现显示功能,数据显示不会占用系统过多的时间。
·系统数据传输和维护通过网络数据库来实现。数据库采用客户端/服务器模块,将LCU、集中维护站设置为客户端,将集中监控站设置为服务器。本系统采用基于TCP/IP协议的MYSQL数据库为实现数据管理。MYSQL是一个多用户、多线程的SQL数据库服务器,由客户端/服务器结构来实现。它由一个服务器守护程序mysqld和不同的客户程序及库组成,使用TCP/IP把多个客户(LCU等)连接到一个服务器(集中监控站)上。在运行前应将主机名、IP地址等设备就绪,在LCU的应用程序gatectl_app中应包含MYSQL.h头文件,其中有MYSQL的API函数的具体实现。在用户空间,C语言程序通过这些API函数访问远程的数据库服务器。
·数据的预处理:为防止被干扰的数据上传到服务器,应用程序对数据进行滤波,再对数据进行分类。经过预处理后的数据才可以送数据缓冲区,通过API函数向数据库服务器上传。
4 应用效果
目前该系统正在试验室运行。从连续运转的情况看,控制实时性和可靠性均达到了设计要求,网络和数据库均运行正常,可见本设计思路是可行的。下一步将设放到工业现场进一步验证。RTLinux实现实时控制功能并与Linux有机结合,这一设计思路既满足了实时控制系统对响应的快速性、时间的精确性和控制的可预测性的要求,又充分发挥了Linux对网络和数据库的支持功能。将RTLinux
《基于RTLinux的实时控制系统(第3页)》