随着我国机车控制水平的不断提高,微机控制已经成为我国机车控制的重要控制方式,而逻辑控制单元LCU(Logic Control Unit)作为主要完成机车运行逻辑控制、电路故障记录控制等功能的控制模块,是关系机车安全运行的重要部件。
ARM(Advanced RISC Machines)是微处理器行业的一家企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等。ARM(Advanced RISC Machines)是微处理器行业的一家企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等。 ARM(Asynchronous Resbonse Mode)异步响应方式异步响应方式ARM(Asynchronous Responses Mode)也是一种非平衡数据链路操作方式,与NRM不同的是,ARM下的传输过程由从站启动。从站主动发送给主站的一个或一组帧中可包含有信息,也可以是仅以控制为目的而发的帧。在这种操作方式下,由从站来控制超时和重发。该方式对采用轮询方式的多站链路来说是必不可少的。
1 系统设计原理
LCU检测就是对LCU内部运行逻辑做出测试并进行故障诊断。测试系统通过向被测试的LCU发出初始命令,并查看其输出结果是否与参考输出相同,从而判断被测试的LCU逻辑是否正确。
本文沿用传统继电器控制中的部分概念进行软件分析。传统硬件继电器触点分为“常开触点”和“常闭触点”两类。一条线路的运行结果会反映到另外一个线圈上,因此,继电器控制的输出可以用线圈表示。
线路上的信号都可以采用二进制表达,所以测试的范围会根据线路上触点个数呈现指数增长。对于要求不太严格的控制信号,只要求在适当的条件下,得到开通或闭合的结果,其动作的条件为充分不必要条件。对于要求严格的控制信号,不仅要求在确定的条件下得到应有的结果,而且要保证这个条件是充分必要条件。因此,很大程度上测试可能会遍历触点的所有组合,测试的总体消耗时间就会扩充到很大的时间范围。
可见,测试情况的选择十分重要。测试复杂性的主要矛盾在于:需要证明充分必要条件的线路的多少以及该线路的触点的多少。工业标准反映在程序中的情况就是保留测试的选择性,便于在后续工作中进行选择和修改。本系统的硬件框图如图1所示。
2 嵌入式Linux操作系统移植
Linux是一类Unix计算机操作系统的统称。Linux操作系统的内核的名字也是“Linux”。Linux操作系统也是自由软件和开放源代码发展中着名的例子。严格来讲,Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。Linux 操作系统是UNIX 操作系统的一种克隆系统。它诞生于1991 年的10 月5 日(这是次正式向外公布的时间)。以后借助于Internet 网络,并经过全世界各地计算机爱好者的共同努力下,现已成为今天世界上使用多的一种UNIX 类操作系统,并且使用人数还在迅猛增长。
在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,终生成可在目标平台上运行的代码。编译顺序如图2所示。
搭建ARM交叉编译器的步骤:(1)编译安装binutils;(2)安装linux 的头文件;(3)编译安装gcc的c 编译器;(4)编译安装 glibc;(5)编译安装gcc的c、c++编译器。
Boot-loader是RAM芯片的引导程序,它的作用是加载操作系统。两个着名的开源Boot-loader,其中一个是U-boot,它的形式就是一个代码包,包中按照Linux一般的编程习惯和不同的目标板,将相应的汇编和C语言代码罗列在对应的文件夹下,让开发人员自行配置。
修改U-boot的过程:(1)基本的硬件初始化;(2)跳转到 Stage2 的 C 入口点;(3)定义函数Nand_init;(4)跳转到Kernel。
Linux内核就是一个可执行的Linux操作系统的套件集合,简称内核[3]。套件的选择,就是内核的配置。内核的配置表明了内核的可调整性。根据Linux软件的开发规则,可到Linux内核源码包的路径下,在终端使用配置命令进行内核配置。在配置内核的时候,需要定义内核启动的命令行。
3 LCU检测系统应用程序
3.1 软件设计及其要素
软件的应用设计,就是确定软件的各个部分及各部分之间的相互关系,信息在其中发送、传递和接收,以及部分运动发展的走向和趋势,终得到可以预见的结果。
面向对象的软件开发,从不同的对待问题的层次出发能得到不同问题的解决方案。其基本工作流程如图3所示。
3.2 定义基本的类和对象及人机界面的设计
在需求分析的说明中,常出现的三个名词分别是触点、测试和线圈。每个测试包含了不同的线圈,每个线圈又分别由触点组成。所以,触点、线圈和测试能够分别抽象出来做成单独的类。触点必须有ID、常开/常闭的类型和运行中处于的值都应该在属性中出现。
首先设计用二维数组来模拟测试与触点的关系。假设数组的横向和纵向表示分别为测试和触点,则某个线圈的设计如图4所示。
对照实际情况,可以使用二维数组进行描述。触点的加入和删除就是列的插入和删除运算,测试的加入和删除就是行的插入和删除运算。对某线圈的实验就是把每行遍历一遍,结果对照预计值进行逻辑判断。
直观上看,重叠配置的线圈就像是检查手册的一封封页面,测试整个系统的方法就是翻弄这本“书”,从头至尾把所有的线圈遍历一遍。
3.3 序列化存储类serial和链表类
如果延续这样的思路,则关于数组的操作会产生新的问题:C语言中定义数组必须先确定数组的大小才能分配合适的内存。
由于文件是测试系统内部调用的接口,应该先沿着采用文件来登记测试项目的结论进行分析。采用序列化技术能够简单而方便地实现文件存储。序列化是指将对象实例的状态存储到可持久保持信息的物理设备的过程,其特点就是线性存储。序列化技术实现了文件的存储,同时它也给出了一种思路:把所有一切都统一对待,变成一根主线。如图6所示。
但序列化只提供链型的存储形式,只能用一维的链表模拟二维数组,因为不知道二维链表的指针应该如何安排。
决定采用链式联系的方法:用指针来实现连接。但是指针的传递跨越了类,因此有必要把链式结构直接抽象成类,产生定义触点链表类、测试链表类和线圈链表类,并将它们抽象出一个基本的链表类,实现链表基本的操作,再从它派生出上述三个链表类。
3.4 计算预计值
测试随意地更改其所包含的触点,随之变动的是测试的预计值。这可以采取人工输入来实现,但是如果用表达式字符串来表达测试的逻辑计算,可以通过字符替换的方法让机器来实现。
表达式字符串中间必须有触点的ID名字,常闭触点的名字前加“~”,测试线路的“与”逻辑用字符“*”来表示,或逻辑用字符“|”来表示(也可以选择其他的计算字符),用括号表示优先的线路逻辑,空格是人性化的适应性定义。
计算预计值的算法如下:
(1) 输入目标字符串。
(2) 首先去空格。
(3) 用触点的状态值替换触点ID,如果是FALSE,替换成F,如果是TRUE,替换成T。
(4) 开始循环: F*F 替换成F
F*T 替换成F
T*F 替换成F
T*T 替换成T
F|F 替换成F
F|T 替换成T
T|F 替换成T
T|T 替换成T
(T) 替换成T
(F) 替换成F
测量字符串长度,如果和上次相比变小,则重新开始循环;如果没有变化,则跳出循环进行下一步。
(5) 判断:如果字符串==T,则说明预计值是TRUE;如果字符串==F,则说明预计值是FALSE;如果字符串是其他值,说明输入的表达式有误,提示重新确定表达式。
3.5 数据压缩
根据设计,直观上可以定义触点为一个这样的类:内容包括一个BOOL变量和一个指针。BOOL变量表示触点的状态值,指针指向下一个触点的位置。但是这样做会导致文件过于庞大,所以要进行数据的压缩。
BOOL变量以位置0或置1来表明FALSE或TRUE的状态,但BOOL变量前面所有的位都没有利用上。因此,可以把BOOL变量前面所有的位都用来表示触点的状态,这就是压缩的基本思想。
压缩效率分析:因为布尔值通常定义为8位长度,现在只用1位来表示,所以压缩的极限值应该可以达到8倍。这样的压缩比率下能够有效地节约测试资料的存储大小。
3.6 数据存储方式考查
必须考虑数据的存储方式,不同的存储方式直接影响了位的操作。因此,在执行位操作之前一定要明确存储方式,小头(Little-endian)模式对数据的存放方式是从低字节到高字节,而大头(Big-endian)模式对数据的存放方式是从高字节到低字节。
联合体(union)的存放顺序是所有成员都从低地址开始存放,整数定义通常占用4字节32位,char定义通常只占用1字节8位。一般认为,大头模式的表达方式更符合生活中的数学思维习惯,所以不妨在小头模式的平台上做转换工作,把表达方式换算成大头模式。定义一个SWAP转换工作宏,由它把对应字节调换位置(与互调,中间两个互调)从而得到不同的模式。
本系统是基于Linux操作系统开发的通用LCU检测软件,具有通用性、便携性和灵活性的特点。采用Linux操作系统平台,能够进一步降低成本。ARM嵌入式系统本身对于软件和数据信息具有良好的保密措施,适合保存商业信息。本系统还采用了测试项目与程序分离的软件模块设计方案,使测试的种类大大增加,不管是同一种车型的测试项目变更,还是其他车型的测试,或者是更广泛的一般性LCU系统的测试。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。