基于Linux的嵌入式工业测控系统

文摘:该文针对当前工业控制领域网络控制技术的快速发展,给出了一种应用于测控系统的基于linux的嵌入式系统的设计方案。利用linux自身提供的条件编译系统,初步解决了linux作为嵌入式操作系统面临的一些问题。并利用实时应用接口(rtai)来增强linux的实时性,引入实时硬件抽象层结构(rthal),利用linux的内核模块机制提供实时服务和完成实时任务,解决了linux实时性不足的问题。通过数据采集程序的实现给出了在rtai-linux环境下开发实时应用程序的设计方法。

关键词:linux;嵌入式系统;测控系统;实时操作系统;rtai

1、前言
随着网络控制技术的快速发展,工业以太网得到逐步完善,在工业控制领域获得越来越广泛的应用。工业以太网使用了tcp/ip协议,便于联网,并具有高速控制网络的优点。随着32位嵌入式cpu价格的下降,性能指标的提高,为嵌入式系统的广泛应用和linux在嵌入式系统中的发展提供了广阔的空间。由于linux的高度灵活性,可以容易地根据应用领域的特点对它进行定制开发,以满足实际应用需要。
2、基于linux的嵌入式系统在测控系统中的设计

计算机测控系统本质上就是计算机控制系统,为了对被控对象实施控制,对其参数和状态进行检测是必不可少的。
2.1 测控系统整体设计
测控系统以基于linux的嵌入式系统为核心,应用程序可通过网络进行更新,通过键盘进行人机对话,数据可通过lcd现场显示。重要数据可以文件形式保存在flash存储器中,数据和报警信息还可通过串口向上位机传输,也可通过以太网口向inernet发布信息。用户通过显示界面查看设备状态,设置设备参数,实现远程监控、远程维护。
2.2 总体框图[1]

图2-1 嵌入式系统总体框图
2.3 嵌入式系统硬件设计
2.3.1 硬件框图
考虑一般测控系统对嵌入式系统要求比较多的功能有:键盘接口、显示接口、a/d(或d/a)转换单元、可扩展的uo接口、打印机接口、与pc机通信的串行接口、以太网口等。实现的嵌入式系统硬件框图如图2-2所示[3]:

图2-2 嵌入式系统硬件框图
2.3.2 linux下设备驱动程序的开发
linux系统中,内核提供保护机制,用户空间的进程一般不能直接访问硬件。linux设备被抽象出来,所有设备都看成文件。用户进程通过文件系统的接口访问设备驱动程序,设备驱动程序主要完成如下功能:
①探测设备和初始化设备;②从设备接受数据并提交给内核;③从内核接受数据送到设备;④检测和处理设备错误。
3、基于 rtai-linux的嵌入式系统的软件实现
3.1 rtai实时硬件抽象层的实现机理
引入新的数据结构rt_hal,形成了实时硬件抽象层rthal(real time hardware abatract layer),rt_hal结构体的定义如下:
struct rt_hal
{
struct desc_struct*idt table;
void(*disint)(void);
void(*enint)(void);
unsigned int(*getflags)(void);
void(*setflags)(unsigned int flags);
void(*mask_and_ack_8259a)(unsigned int irq);
void(*unmask_8259a_irq)(unsigned int irq);
void(*ack_apic_irq)(void);
void(*mask_io_apic_irq)(unsigned int irq);
void(*unmask_i0_apic_irq)(unsigned int irq);
unsigned long *io_apic_irgs;
void*irq_controller_lock;
void*irq_desc;
int *irq_vector;
void *irq_2_pin;
void* ret_from_intr;
struct desc_struct *gdt_table;
volatile int*idle_weight;
void (*lxrt_cli)(void);
};
在usr/src/linux/arch/i386/kernel/irq.c中初始化为rthal:
struct rt_hal rthal
{
idt_table, /*中断向量表*/
linux_cli, /*关中断函数*/
linux_sti, /*开中断函数*/
linux_save_flags, /*保存中断前的标志*/
linux_restore_flags, /*恢复中断前的标志*/
task_and_ack_8259a, /*中断屏蔽*/
enable_8259a_irq, /*中断使能*/
linux_ack_apic_irq,
(), /*在io_apic.c文件中设置*/
&io_apic_irgs,
&irq_controller_lock,
irq_desc,
irq_vector,
(), /*在io_apic.c文件中设置*/
&ret_from_imr,
gdt_table, /*全局描述符表*/
&idle_weight,
()
};
初始化rthal时,指向函数的指针变量指向实现原来标准linux中开、关中断等功能的函数如下:
static void linux_cli(void)
{
hard_cli();
}
static void linux_sti(void)
{
hard_sti();
}
static unsigned int linux_save_flags(void)
{
int flags;
hard_save_flags(flags)
turn flags
}
static void linux_restore_flags(unsigned int flags)
{
hard_rest

  • 基于Linux的嵌入式工业测控系统已关闭评论
    A+
发布日期:2019年07月02日  所属分类:参考设计