您的位置 首页 ADAS

一种应用于测控体系的根据Linux的嵌入式体系的规划

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

1、前语

跟着网络操控技能的快速开展,工业以太网得到逐步完善,在工业操控范畴取得越来越广泛的使用。工业以太网使用了TCP/IP协议,便于联网,并具有高速操控网络的长处。跟着32位嵌入式CPU价格的下降,性能指标的进步,为嵌入式体系的广泛使用和Linux在嵌入式体系中的开展供给了宽广的空间。因为Linux的高度灵活性,能够容易地依据使用范畴的特色对它进行定制开发,以满意实践使用需求。

2、根据Linux的嵌入式体系在测控体系中的规划

计算机测控体系本质上便是计算机操控体系,为了对被控目标施行操控,对其参数和状况进行检测是必不可少的。

2.1 测控体系全体规划

测控体系以根据Linux的嵌入式体系为中心,使用程序可经过网络进行更新,经过键盘进行人机对话,数据可经过LCD现场显现。重要数据能够文件方式保存在Flash存储器中,数据和报警信息还可经过串口向上位机传输,也可经过以太网口向Inernet发布信息。用户经过显现界面检查设备状况,设置设备参数,完结长途监控、长途维护。

一种使用于测控体系的根据Linux的嵌入式体系的规划

2.2 整体框图

2.3 嵌入式体系硬件规划

2.3.1 硬件框图

考虑一般测控体系对嵌入式体系要求比较多的功用有:键盘接口、显现接口、A/D(或D/A)转化单元、可扩展的UO接口、打印机接口、与PC机通讯的串行接口、以太网口等。完结的嵌入式体系硬件框图如图2-2所示

一种使用于测控体系的根据Linux的嵌入式体系的规划

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_restore_flags(flags);

}

当加载RTAI模块时,履行rt_mount_rtai函数如下:

void rt_mountes_rtai(void)

{

rthal.disint=linux_cli;

rthal.enint=linux_sti;

rthal.getflags=linux_save_flags;

rthal.setflags=linux_restore_flags;

rthal.mask_and_ack_8259A=trpd_mask_and_ack_irq;

rthal.unmask_8259A_irq=trpd_unmask_irq;

}

rthal中指向函数的指针变量指向了RTAI中完结的同名函数,在RTAI中完结的关中止函数如下:

static void linux_cli(void)

{

processor[hard_cpu_id()].intr_flag=0;

}

在RTAI中引进新的数据结构processor,描绘和中止有关的处理器的状况:

static struct cpu_own_status

{

volatile unsigned int intr_flag;

volatile unsigned int linux_intr_flag;

volatile unsigned int pending_irqs;

volatile unsigned int activ_irqs;

}

processor[NR_RT_CPUS];

当履行关中止时,仅仅将数据结构processor中的中止标志位intr_flag设为0,而不是真实的铲除eflags寄存器的IF标志来关中止,处理了Linux中长期关中止的问题。

3.2 选用RTAI增强Linux实时性的完结 

经过修正Linux内核相关的源文件,构成实时硬件笼统层。履行insmod指令,挂载上供给实时服务的rtai,rtai_sched,rtai_fifos模块,得到如下信息 :

Linux tick at 100Hz

Calibrated cpu frequency 551268530Hz

Calibrated 8254-timer-interrupt-to-scheduler latency 8000ns

Calibrated one shot setup time 3000ns

Module Size Used by

rtai_sched 16608 0 unused

rtai_fifos 33468 0 unused

rtai 20728 1 (rati_sched rtai-fifos)

加载上使用程序需求的RTAI模块后,就能够在RTAI-Linux环境下开发使用程序。

3.3 根据RTAI-Linux的使用程序的开发

针对工业测控体系的数据收集、数据处理、操控、通讯等详细使用,将使用程序分为实时使命和非实时使命。实时使命使用RTAI供给的API来开发,编写成内核模块,作业在Linux的中心态。用户进程可使用Linux操作体系供给的很多资源,进行TCP/IP网络通讯,开发图形用户界面程序等。实时使命之间、实时使命和非实时使命之间可经过Fifo行列和同享内存等办法通讯。RTAI-Linux使用程序结构如图3-1所示。

一种使用于测控体系的根据Linux的嵌入式体系的规划

数据收集使命的完结在rt_process.c中的首要函数如下:

static void data_collect()

{

rtf_put(FIFO,&data_value,sizeof(data_value);/*将收集的数据放入实时FIFO中*/

rt_task_wait_period();

}

int int_module(void)

rtime tick_period;

rt_set_periodic_mode(); /*将定时器设置为周期形式*/

rt_task_init(&rt_task,data_collect,l,Stack_size,task_priority,1,0);/*初始化数据收集使命*/

return ()

}

void cleanup_module(void)

{

stop_rt_timer();

rtf_destroy(FIFO);

rt_task_delete(&rt_task);

return;

}

数据显现程序的完结在disaplay.c中的首要函数:

int main(void)

{

if((fifo=open(“/dev/rtf()”,()_rdonly))《0)

{

fprintf(stderr,“Error opening/dev/rtf() ”);

exit(1);

}

read(fifo,&data_value,sizeof(data_value));/*用户进程从实时FIFO中读取数据*/

printf(“data%f ”,data_value)

}

4、定论

本文给出了一种使用于测控体系的根据Linux的嵌入式体系的规划方案,能确保测控使命完结的实时性、可靠性,能够连到工业以太网,完结长途监控,在工业操控范畴有很好的使用远景。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/adas/100505.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部