APP下载

基于嵌入式Linux的船舶车钟记录仪设计

2015-10-13刘建设杨俊飞

船电技术 2015年3期
关键词:驱动程序记录仪内核

刘建设,杨俊飞



基于嵌入式Linux的船舶车钟记录仪设计

刘建设,杨俊飞

(武汉船用电力推进装置研究所,武汉 430064)

为了满足当前船舶车钟记录仪对实时性强、人机交互性好等要求,设计了以ARM9处理器为硬件平台,以嵌入式Linux操作系统为核心的船舶车钟记录仪。详细描述了该系统的主要功能、硬件结构与软件设计方法。完成了嵌入式Linux操作系统移植、驱动程序设计和应用程序设计。应用程序采用多线程的设计方法,实现了数据的采集、显示与打印的同步执行。实践证明该系统操作方便,满足车钟记录仪的设计要求。

车钟记录仪 ARM 嵌入式Linux

0 引言

船舶车钟记录仪主要用于接收、显示和保存船舶航行过程中的一些重要数据,如主航车钟车令、应急车钟车令、螺旋桨转速等,并能够进行历史数据查询和数据打印[1]。

随着信息技术、计算机技术的迅速发展,嵌入式系统有了广泛的应用。嵌入式Linux是应用于嵌入式设备上的一种操作系统。可运行在X86、MIPS、ARM、Motorola、NEC 等多种硬件平台, 而且开放源代码,在新兴的嵌入式操作系统领域获得了飞速的发展。本文基于ARM9硬件平台,完成了嵌入式Linux操作系统的移植,并实现了船舶车钟记录仪的应用程序设计。

1 系统硬件设计

1.1 系统功能

本文设计的车钟记录仪主要实现了以下四个功能:数据采集、数据保存、数据打印、人机界面显示和设置。其中:

数据采集:主要实现1)船舶驾控室与集控室左/右主航车钟车令信号、螺旋桨转速信号的采集,共六路4~20 mA信号。2)左/右应急车钟信号的读取,为两路485信号。

数据保存:定时对采集到的数据进行保存,并能在主航车钟或应急车钟车令发生变化、螺旋桨转速变化超过设定值时自动进行数据保存。

数据打印:能够根据用户设置的时间范围,自动打印该段时间内保存的所有数据。打印过程中系统能同时进行数据采集与显示。

人机界面和设置:通过图形化人机界面显示采集到的数据,并能进行系统时钟设置、打印时间设置以及在线进行模拟量输入信号的标定等。

1.2 硬件方案设计

嵌入式系统的核心部件是嵌入式微处理器,目前嵌入式处理器的品种总量已经超过1000多种,流行体系结构有三十几个系列,就目前来看,32位的ARM微处理器是嵌入式处理器的主流[2]。其中ARM9系列的微处理器能充分满足本系统对实时性的要求,对外围接口电路和今后扩展系统的要求等,而且ARM9系列的微处理器价格相对同类产品价格不高,所以无论从技术应用方面,还是在性价比方面,ARM9系列都是本系统最佳选择。本系统选择ARM9系列微处理器中型号为S3C2410的芯片。

S3C2410片上集成了丰富的外设资源:存储器管理单元、NAND FLASH接口、LCD控制器、3通道串行接口、2通道SPI接口、触摸屏接口的8通道10位ADC、带日历功能的实时时钟控制器、USB接口、SD接口等,简化了系统外围电路的设计[3]。

本系统采用核心板+底板的控制方案。其中核心板主要实现嵌入式Linux的最小系统,包括电源、时钟、处理器、存储器、JTAG接口以及网络接口。系统中的其它功能主要通过底板实现,方便今后系统的扩展。整个系统结构如图1所示。

在核心板上,扩展了64 MB 的NAND FLASH和64 MB的SDRAM作为存储单元,用来存储嵌入式Linux操作系统以及应用程序。系统中通过信号调理电路将接收到的4~20 mA信号转换为0~3.3 V电压信号,然后输出到S3C2410的AD采集接口。3通道串行接口中的串口0用作调试串口,串口1用作打印机接口,打印机为支持RS232串行接口的热敏打印机,串口2用作触摸屏的通信接口。系统所需的两路RS485信号通过UART器件TL16C554进行转换,该器件能够将并行数据转换成4路的串行输出,软件设计时采用轮询的方式读取RS485通信数据。

2 软件设计

2.1 嵌入式Linux操作系统设计

嵌入式Linux操作系统从软件角度看通常分为三部分: 引导程序、Linux 内核、文件系统。

引导程序是在操作系统内核运行之前运行的一段小程序。该程序在系统运行时主要用来初始化硬件设备、加载操作系统映像,另外还具有下载功能,支持通过串口或网线等通信方式从宿主机下载内核映像和根文件系统映像[4]。文中采用U-Boot 1.3.2做为Linux系统的引导程序。

内核是Linux 操作系统的核心。它负责管理系统的进程和进程调度、CPU、内存、设备驱动程序、文件、I/O 处理等, 决定着系统的性能和稳定性。其它系统程序都必须通过内核才可以使用系统资源, 获取系统服务。文中采用的内核版本为Linux-2.6.24。

Linux 系统中的文件不仅包括普通的文件和目录, 每个具体的设备也都被映射为一个文件, 例如磁盘、打印机、终端等。所以Linux 下的文件是操作系统服务和设备的统一接口。一个基本的文件系统主要包括Linux基本命令、库文件、配置文件、设备文件。文中采用Busybox工具包,建立一个完整的嵌入式Linux文件系统。Busybox是集成了一百多个Linux常用命令和工具的软件,用户可以根据需要,在Busybox中编译需要的应用程序的功能。

2.2 驱动程序设计

2.2.1驱动程序的编写

Linux操作系统将内存空间分为内核空间和用户空间,驱动程序运行在内核空间,应用程序运行在用户空间。驱动程序为应用程序屏蔽了硬件的细节,应用程序通过驱动程序提供的操作接口,就可以像处理普通文件一样,对硬件设备进行打开、关闭、读写等操作[5]。Linux设备分为字符设备、块设备和网络设备。字符设备是指设备发送和接收数据以字符的形式进行,如串口、键盘、鼠标等。文中涉及到的A/D转换驱动和TL16C554串口通信驱动均属于字符设备驱动。

file_operations数据结构式Linux驱动程序中重要的数据结构,该数据结构提供给应用程序访问硬件设备的各种方法,针对AD驱动程序,主要实现了该数据结构中的open、read、release、ioctl四个函数。主要代码如下:

static int adc_open(struct inode * inode, struct file * filp)

{

writel((readl(base_addr1 ) | S3C2410_CLKCON_ADC),base_addr1);//AD时钟使能

return 0;

}

其中base_addr1为CLKCON的映射地址。

int adc_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)

{

ch=cmd & 0x7; //set up channel

return 0;

}

通过adc_ioctl函数实现对AD采集通道的控制。

static ssize_t adc_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)

{

int data;

int i;

int loop = 1000;

//预分频使能,分频值为49,采样周期5us,通道号为ch,普通操作模式, writel((1<<14)|S3C2410_ADCCON_PRSCVL(49)|(ch<<3)| (0<<2) |(0<<1)|(0<<0),base_addr+S3C2410_ADCCON);

for(i=0;i

writel((readl(base_addr+S3C2410_ADCCON)|0x1),base_addr+S3C2410_ADCCON); //start ADC

while((readl(base_addr+S3C2410_ADCCON) & 0x1)); //check if enable start flag is low

while(!(readl(base_addr+S3C2410_ADCCON) & 0x8000)); writel(0,base_addr+S3C2410_ADCCON); //stop ADC

data = readl(base_addr+S3C2410_ADCDAT0) & 0x3ff;

if(copy_to_user(buf, &data, sizeof(int)))

return -EFAULT;

return (sizeof(int));

}

TL16C554驱动的编写与AD驱动实现过程类似,区别在于设备的控制方式不同。

2.2.2驱动程序的编译与加载

Linux驱动程序可以以模块的方式与内核连接,也可以直接编译进内核。文中采用以模块方式加载驱动的方式。该方式在开发阶段不需要频繁的重新编译和下载内核。

在宿主机上使用交叉编译器arm-linux-gcc命令编译驱动程序,会在当前目录下生成adc.o的文件,将该文件拷贝到嵌入式文件系统中,使用insmod命令加载该驱动模块。另外,还需要在/dev目录下创建应用程序访问的设备节点。

通过该命令查看AD设备的主设备号:

#cat /proc/devices

然后使用如下命令创建设备节点:

#mknod /dev/adc c 252 0

2.3 应用程序设计

在应用程序中,根据系统的功能,本文主要编制了以下子程序:

1)数据采集与处理程序:AD采集部分采用

多次采集求平均值、以及去除最大值最小值等数字滤波方法实现软件的滤波。将滤波后数据通过计算转换为车钟车令与转速值。应急车钟数据通信部分采用校验码方式保证数据接收的正确性。

2)数据存储程序:将采集的数据以文件的方

式存储在FLASH存储器中,文件以数据保存时间命名。文件个数超过最大值时,删除最先保存的数据记录文件。

3)数据打印子程序:按照约定的数据帧格式

向热敏打印机传输打印数据。其中打印子程序采用多线程方式,实现数据打印过程中系统能够同步进行数据的采集与显示功能。

4)数据显示处理子程序:ARM板与触摸屏

采用Modbus通信协议进行数据传输。其中触摸屏为主站,ARM板为从站。应用程序根据要求向触摸屏通讯需要显示的数据、执行打印程序、车钟和转速标定程序。

5)车钟和转速标定程序:根据触摸屏界面输入的参数设置值,将采集到的特定档位和转速的数据保存到指定的数据标定文件中,供数据采集与处理程序使用。

3 结束语

本文基于ARM S3C2410硬件平台,进行了船舶车钟记录仪的硬件设计。同时基于嵌入式Linux操作系统进行了系统软件开发。成功构建了一个集数据采集、保存、显示、打印于一体,并且图形界面友好、操作方便的车钟记录系统。

[1] 陈小米,张浩. 基于ARM 的舰船车钟记录仪设计[J].船电技术,2012,22(3):9-11.

[2] 熊茂华. ARM9嵌入式系统设计与开发应用.北京:清华大学出版社,2008.

[3] S3C2410A – 200MHz & 266MHz 32-Bit RISC Microprocessor User's Manual. Revision 1.0[M]. Korea: Samsung Electronics,2004.

[4] 于明,盛俊,刘建设.基于Intel PXA270的系统引导程序移植与实现[J].计算机技术与发展,2010,20(6):32-35.

[5] 刘淼.嵌入式系统接口设计与Linux驱动程序开发[M].北京:北京航空航天大学出版社,2006.


Design of Ship Telegraph Recorder Based on Embedded Linux

Liu Jianshe, Yang Junfei

(Wuhan Institute of Marine Electric Propulsion, Wuhan 430064, China)

The paper presents the design of a ship telegraph recorder based on embedded Linux system with ARM9 as hardware platform in order to meet the requirements of real time and friendly man-machine interaction, analyzes the main function, hardware structure and software design method for the telegraph recorder, and completes the transplantation of embedded Linux system and the design of drives and applications. The applications use multi-thread design to the synchronous course of data collection, displaying and printing. Tests show that the system is easily operated and can meet the demands of telegraph recorder.

telegraph recorder; ARM; embedded Linux

TP368.2

A

1003-4862(2015)03-0040-04

2014-12-18

刘建设(1985-),男,硕士。研究方向:嵌入式应用技术。

猜你喜欢

驱动程序记录仪内核
多内核操作系统综述①
自主核级无纸记录仪产品发布会在上海召开
强化『高新』内核 打造农业『硅谷』
浅谈消防执法记录仪在实际工作中的应用
活化非遗文化 承启设计内核
阻止Windows Update更新驱动程序
做梦记录仪
Linux内核mmap保护机制研究
计算机硬件设备驱动程序分析
汽车记录仪保险丝搭接转换装置及其模具设计