描述

1、前言

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

2、基于Linux的嵌入式系统在测控系统中的设计

计算机测控系统本质上就是计算机控制系统,为了对被控对象实施控制,对其参数和状态进行检测是必不可少的。

2.1 测控系统整体设计

测控系统以基于Linux的嵌入式系统为核心,应用程序可通过网络进行更新,通过键盘进行人机对话,数据可通过LCD现场显示。重要数据可以文件形式保存在Flash存储器中,数据和报警信息还可通过串口向上位机传输,也可通过以太网口向Inernet发布信息。用户通过显示界面查看设备状态,设置设备参数,实现远程监控、远程维护。

2.2 总体框图

2.3 嵌入式系统硬件设计

2.3.1 硬件框图

考虑一般测控系统对嵌入式系统要求比较多的功能有:键盘接口、显示接口、A/D(或D/A)转换单元、可扩展的UO接口、打印机接口、与PC机通信的串行接口、以太网口等。实现的嵌入式系统硬件框图如图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实时性的实现

通过修改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所示。

数据采集任务的实现在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的嵌入式系统的设计方案,能保证测控任务完成的实时性、可靠性,可以连到工业以太网,实现远程监控,在工业控制领域有很好的应用前景。

打开APP精彩内容

点击阅读全文

在linux下进行嵌入式系统设计,一种应用于测控系统的基于Linux的嵌入式系统的设计...相关推荐

  1. Linux下进程通信的八种方法

    Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...

  2. 【转】Linux下软件安装的几种方式

    转自Linux下软件安装的几种方式 Linux 系统的/usr目录 Linux 软件安装到哪里合适,目录详解 Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的 /usr:系统 ...

  3. linux系统调用劫持隐藏进程,linux 下隐藏进程的一种方法及遇到的坑

    前言 1.本文所用到的工具在 https://github.com/gianlucaborello/libprocesshider 可以下载 2.思路就是利用 LD_PRELOAD 来实现系统函数的劫 ...

  4. linux命令进u 盘,在Linux下制作一个磁盘文件,在u-boot 阶段对emmc 烧写整个Linux系统方法...

    在Linux 下制作一个磁盘文件, 可以给他分区,以及存储文件,然后dd 到SD卡便可启动系统. 在u-boot 下启动后可以读取该文件,直接在u-boot 阶段就可以做烧写操作,省略了进入系统后才进 ...

  5. linux 下 搭建邮件邮件服务器(Postfix+Dovecot)(二)-基于mysql的虚拟账户登陆收发邮件...

    linux 下 搭建邮件邮件服务器(Postfix+Dovecot)(二)-基于mysql的虚拟账户登陆收发邮件 使用虚拟用户收发邮件安装 九.安装Courier authentication lib ...

  6. 深度linux_国产系统?基于Linux研发的深度Deepin系统,到底算不算真国产

    阅读本文前,请您先点击上面的蓝色字体"晓艳观世界",再点击"关注",这样您就可以免费收到最新内容了.每天都有分享,完全是免费订阅,请放心关注. 近年来,国内科技 ...

  7. 鸿蒙系统是基于安卓还是独立系统,华为鸿蒙系统基于安卓还是Linux呢?

    华为鸿蒙OS2.0发布于去年2020年广东东莞的华为开发者大会上,会上说到会在明年(2021年)正式投入使用,就在本年2021年4月如期所说已经开始陆续推送给用户. 本次支持升级鸿蒙2.0系统的手机机 ...

  8. 鸿蒙系统是基于linux嘛,鸿蒙系统是基于安卓吗 鸿蒙系统与安卓的区别

    2019年8月9日,华为鸿蒙系统正式发布,由于这是首款国产自主研发的操作系统,一经发布便吸引了众多国人的关注.但近日,网上也有不少质疑声,表示鸿蒙系统基于安卓,那么鸿蒙系统是基于安卓吗?鸿蒙系统与安卓 ...

  9. 关于在linux下清屏的几种技巧

    在windows的DOS操作界面里面,清屏的命令是cls,那么在linux 里面的清屏命令是什么呢?下面笔者分享几种在linux下用过的清屏方法. 1.clear命令.这个命令将会刷新屏幕,本质上只是 ...

最新文章

  1. Swift Package Manager 库制作
  2. Cissp-【第4章 通信与网络安全】-2021-3-12(408页-445页)
  3. 工作中关于rpm的一个简单但头疼的问题
  4. AJAX Control Toolkit - DropDown
  5. 【C++】运算符重载 Operator Overload
  6. 60个高质量的CSS、XHTML网页布局模板下载
  7. windows下客户端连接上马上会断开连接_Fix SSH客户端登录会话超时设置
  8. ThinkPHP3.2.3 的异常和错误屏蔽处理
  9. 2010年度十大杰出IT博客大赛奖品展示
  10. Guitar Pro8(简称GTP8)打谱软件乐器乐谱的编排制作
  11. LabVIEW升级图像识别功能
  12. SQL笔试经典50题及答案解析(题目41-50)
  13. 全国大学生智能汽车竞赛 --图像处理上位机篇开源了
  14. 计算长方体、四棱锥的表面积和体积_JAVA
  15. 项目经理价值的最终体现
  16. 新浪微博共享登录后无法退出切换账号问题解决
  17. unity:瞄准镜制作
  18. 基于STM32的RGB调色器——STM32程序和Qt上位机全开源
  19. 请解释“amp;amp;”和“amp;amp;amp;amp;”的区别?“|”和“||”的区别?
  20. 为什么量子力学总是让人感到疑惑?

热门文章

  1. 【kafka】Kafka consumer处理大消息数据过大导致消费停止问题
  2. 【Elasticsearch】Named Entity Annotations in Elasticsearch es 实体 注解
  3. 【SpringCloud】 failed to req API:/nacos/v1/ns/instance after all servers code:500 msg Read timed out
  4. 【Kafka】kafka无法查看消费组消费信息,其他相关组件正常
  5. 95-130-350-源码-source-kafka相关-FlinkKafkaProducer
  6. 【Flink】Flink报错OutofMemoryError : Direct buffer memory
  7. java基础工具VisualVM介绍与详细使用
  8. Task 'compileDebugSource' not found in root project 'kafka'
  9. Error:Unable to make the module: core, related gradle configuration was not found. Please, re-import
  10. 05-windows下R安装包的几种方式