基于ColdFire5307处理器和uClinux操作系统实现数据采集系统的设计

作者:陆宝辂,李荐民,李刚
在coldfire上嵌入uclinux操作系统是一项比较成熟的技术,般应用在手持设备、家庭网关、工业控制中。但在数据采集应用中使用这项技术却不是很常见,原因是uclinux不是实时操作系统,而数据采集应用对数据采集的实时性要求很高。本文介绍如何利用在coldfire上嵌入uclinux操作系统的方法来实现数据的采集和传输。
1 硬件平台
任何嵌入式应用系统都离不开具体的硬件平台,这里先介绍一下系统采用的硬件平台。
图1所示即为硬件结构的示意图。其中,spm是数据处理模块,它控制前端的a/d变换,根据设定的采集周期将a/d变换后的数据保存在其内部的ram中;同时发出一个中断信号。coldfire 5307 xboard是基于motorola公司高性能嵌入式32位处理器coldfire 5307自行开发的嵌入式应用开发板。其硬件配置包括:
coldfire5307 90mhz 32位处理器;16m sdram;2m flash rom;10mbps以太网接口;两个uart串口;两个64针的地址和数据总线接口。 isc(图像控制工作站)和ids(图像数据工作站)是两个工作站,用来对系统实现控制,对图像数据实现处理。
xboard和工作站处在同一个以太网上,该以太网上还配有其它的设备。uclinux所要实现的功能是实时地将spm上采集的数据通过以太网传到ids上,同时接收来自ics的命令以对spm进行控制。
2 spm和xboard之间的连接
uclinux需要读取spm中的ram,所以最好是把spm中的ram作为uclinux的内存地址的一部分。spm和xboard上mcf5307之间的硬件连接如图2所示。 spm中ram的地址线、数据线和控制线直接连到cpu的总线上。除了硬件上的连接之外,还需要设置mcf5307的寄存器,为spm上的ram分配内存空间。xboard在加电时首先运行debug程序,所以在debug中进行寄存器的设置是比较合适的。在debug源代码中的sysinit.c文件里的mcf5307_cs_init函数中加上下面的语句: mcf5307_wr_cs_csar5(imm,0xa000); spm的地址从0xa0000000开始 mcf5307_wr_cs_cscr5(imm,0x3d40); 采用8位的读方式 mcf5307_wr_cs_csmr5(imm,0x01ff0001); 空间大小为1m 将spm控制的引脚和mcf5307的并口引脚相连,这产对spm的控制就只需设置并口的相应位了。
3 uclinux下的实时性
uclinux并不是一个实时操作系统(rtos),如何使用uclinux完成有实时性要求的数据采集是需要考虑的问题。由于应用中只一个实时的任务——从spm中读取数据,所以采用中断的方式来对数据采集完的信号提供实时响应。下面的代码用来向uclinux注册irq7中断处理程序:result=request_irq(ecm_irq,ecm_interrupt,0,“ecm”,null); 在中断处理程序中,先关闭中断,因为中断嵌套在这里是没有意义的,还有一个重要的原因是spm中断信号的低电平持续时间比较长。cpu是利用低电平来标志断信号的,所以cpu可能在spm的一个中断信号中检测到多次中断。关闭中断后,从spm的ram中读取数据。由于spm和xboard之间的连接已得到保证,spm的内部ram成为uclinux的内存空间的一部分,所以读的工作是很简单的,只是将数据从一个地址读到另外一个地址,读完数据后打开中断。读数据之间发生的中断都会被忽略。读数据块的大小为4096字节,读完所有的数据需要2ms。所以在采集周期低于2ms的情况下,系统无法正常工作。不过这个指标低于应用的要求。
4 数据的临时存放
xboard上并没有大的存储设备,所以uclinux采集的数据必须及时地传送出去。以太网上通过交换机连接着多个设备,在网络繁忙的时候并不能保证数据会被及时地传出去。解决这个问题的方法是开辟一个缓冲区,将暂时无法传出去的数据放在缓冲区中。 由于没有mmu的支持,uclinux不能提供内存保护机制,进程可以随意读取任何内存地址。这样,在带来方便的同时也增加了一些麻烦。方便的一面表现在可以在进程中开辟缓冲区,在内核中用同样的地址使用缓冲区;不利的一方面表现在开辟动态内存必须十分小心,不能和其它进程发生重叠。 在进程中开辟了50个数据缓冲片,这些缓冲片通过三个双向链表维持形成缓冲区。所有的缓冲片被挂在一个称为list的双向链表中,退出进程的时候,应该将这些动态内存释放。同时,将存有有效数据(即尚未被发送出去的数据)的缓冲片放在称为dirty的双向链表中,将可以使用的缓冲片放在称为clean的双向链表中。中断处理程序每次从clean链表中取得一个缓冲片,存入数据后放到dirty链表中;相反,发送进程每次从dirty队列中取一个缓冲片,发送其保存的数据,然后把它放到clean链表中。这样可以在一定程序上为网络速度的稳定提供缓冲。
5 uclinux上运行任务的分析
在uclinux上运行了三个任务:读取采集数据、通过以太网发送数据、接收和执行来自ics的命令。其中的读取采集数据任务对实时性有要求,把它用中断处理程序来实现,而其它的两个任务则通过用户进程来实现。通过以太网发送数据的任务和读取采集数据的任务其享一个缓冲区,通过ioclt函数在它们它们传递缓冲区双向链表的地址。所以还需要为spm注册一个驱动程序,这也是在uclinux操作中比较特别的进程和内核通信的方法。同时,把对spm的设置和查询等操作也包装在这个驱动程序里同,这些操作都是通过ioctl函数向程提供接口。注册驱动程序的函数是: result=“register”_chrdev(ecm_major,“ecm”,%26;amp;ecm_fops);可见,这里把spm作为一个字符型的设备,由于缓冲区是共享,所以必须提供一个锁相制,使得在某个进程向缓冲片中写数据时,其它的进程不读或写该缓冲片。 uclinux不仅在信息家电、低端网络设备和工业控制领域中有较广的应用,而且在简单的数据采集和传输方面也有了应用方案。


如何提高系统级设计的工作效率
如何恢复苹果通讯录
是德科技与罗姆半导体联合推出先进设计系统新工作区
数据分析中最常用、最好用的20个Python库分享
工信部王建伟针对工业互联网平台的下一步工作建议提出了四点建议
基于ColdFire5307处理器和uClinux操作系统实现数据采集系统的设计
【方案分享】使用 4 节 AA 电池实现寿命超过 5 年且配备扩展闪存的智能锁方案
常见MOSFET失效模式的分析与解决方法
Chromium版Edge浏览器出现窗口突然变黑
一种用于学习ZSL无偏嵌入的直接但有效的方法
用于远程AI应用的具有边缘智能的微型成像系统
Omniverse 资讯速递 | 最新发布、应用案例、研讨会回顾等你来解锁!
无法亲临现场观赛成遗憾?TCL巨幕智屏助你重温经典时刻
比亚迪半导体亮相广东省科技创新大会
英国首相已决定允许华为参与英国的5G网络建设
开源硬件_最流行的几个开源硬件平台_Ardurino开源硬件平台
浅谈OLED柔性显示
国内外自动化产品差距巨大 国产之路任重道远
联想南方智能制造基地建设开工,将成为成为世界级的“智能工厂”
卡萨帝厨房怎么样?市场:前3季度连续翻番