找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

[嵌入式/ARM] 基于Linux的嵌入式工业测控系统

[复制链接]
admin 发表于 2013-3-26 05:43:38 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
文  摘 关键词: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_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实时性的实现[4]
       通过修改Linux内核相关的源文件,形成实时硬件抽象层。执行insmod命令,挂载上提供实时服务的rtai,rtai_sched,rtai_fifos模块,得到如下信息[2]:
   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所示。
   
   图3-1 RTAI-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的嵌入式系统的设计方案,能保证测控任务完成的实时性、可靠性,可以连到工业以太网,实现远程监控,在工业控制领域有很好的应用前景。
       本文作者的创新点:在嵌入式系统软件的设计与实现上,提供了开发实时应用程序的接口;利用实时应用接口(RTAI)来增强Linux的实时性,并引入实时硬件抽象层结构(rthal)、实时调度器、实时FIFO等实时服务;给出了在RTAI-Linux环境下开发工业测控系统中实时应用程序的方法。
   参考文献:
[1] 王跃科等.基于网络互联的分布式测控系统开放体系结构与技术[J].计算机测量与控制,2002.10
[2] 须文波.基于Linux的嵌入式系统在测控系统中的设计与应用[D].江南大学硕士学位论文,2003.3
[3] 胡在华等.一种新型嵌入式测控网络的设计与应用[J].微型机与应用,2002.21
[4] 陈继荣,黄建华.Linux操作系统实时性分析及改进策略[J].微计算机信息,2005年第21卷.第11-2期.P67-P69
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-28 20:29 , Processed in 0.053150 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表