您的位置 首页 制造

一线制传感器在根据Linux渠道车载信息收集体系中的使用

本文在嵌入式Linux平台上实现了车载信息采集系统的一部分——汽车常规温度的数据采集,如采集车内温度、暖风或空调温度、车外温度、水箱温度等。DS18B20是一种可组网单总线数字温度传感器,为信息采集提

导言

本文在嵌入式Linux渠道上完结了车载信息收集体系的一部分——轿车惯例温度的数据收集,如收集车内温度、暖风或空调温度、车外温度、水箱温度等。DS18B20是一种可组网单总线数字温度传感器,为信息收集供给了经济有用的可行计划。嵌入式Linux以其源码敞开、简单定制和扩展、多硬件渠道支撑和内置网络功用等优秀功用,逐步成为车载设备广泛运用的体系渠道。本文触及的体系运用三星公司的S3C2410AL20处理器,操作体系选用2.6.8.1内核Linux,GUI选用Trolltech公司的Qtopia;功用上首要完结:各路温度的收集显现、音频报警、温度数据的存储、相关功用设置等。当需求语音提示或报警时,运用程序调用语音模块;当需求存储或显现历史数据时,运用程序调用SD存储模块。

  1 Linux体系开发概述

驱动程序的开发是嵌入式Linux开发的首要使命之一。设备驱动为上层运用程序供给操控硬件的设备接口,一起直接与Linux内核打交道。图1描绘了Linux体系开发结构。

图1 Linux体系开发结构

  运用程序开发是嵌入式Linux开发的另一个首要使命。Qt/Embedded 是闻名Qt 库开发商Trolltech 公司开发的面向嵌入式体系的Qt 版别。Qtopia是在Qt/ Embedded 库的基础上,专门针对PDA、SmartPhone这类运转嵌入式Linux 的移动设备和手持设备所开发的敞开源码的一套运用程序包和开发库。它包含全套的个人信息管理PIM ( Personal Information Management) ,如地址本、日程安排、MPEG播映、图画显现、浏览器等。

  2 车载信息体系及硬件渠道概述

车载信息收集体系开发首要包含用户界面开发,内核开发,音频模块规划,串口模块规划,CAN总线模块规划,车辆状况(又包含开关量、模拟量、数字量等)检测模块规划等。

本规划侧重完结一线制温度网络的数据收集。一线制温度网络的温度信号特色是:数值不高,多在0~100 ℃规模内;温度信号改变较慢;体系对收集到的温度信号的实时性要求不高;精度要求不高。

一线网络的长处在于能丈量很多的物理量,一切的通讯都经过一线协议,而与被测的详细量无关。一线网络是能够方便地搭建起由一线传感器芯片组成的一系列丈量环境参数的网络。

DS18B20是一种可组网的单总线数字温度传感器,具有以下功用特色:
① 习惯宽的电压规模(3.0~5.5 V),在寄生电源办法下可由数据线供电。
② 共同的单线接口办法,DS18B20在与微处理器衔接时仅需求1条口线即可完结微处理器与DS18B20的双向通讯。
③ 温度规模为-55~+125 ℃,在-10~+85 ℃时精度为±0.5 ℃。
④ 可编程的分辩率为9~12位,对应的可分辩温度分别为0.5 ℃、0.25 ℃、0.125 ℃和0.062 5 ℃,可完结较高的精度测温。

单总线使得硬件开支极小,但需求相对杂乱的软件进行补偿。因为DS18B20选用单总线串行数据传送,保证严厉的读写时序成为测温要害,因而没有选用I/O驱动,而是独自编写一线制温度网络驱动。

本规划选用寄生电源衔接办法,12位分辩率。寄生电源的长处为:长途温度检测无需本地电源;短少正常电源条件下也能够读ROM。为保证DS18B20在其有用改换期内得到满足的电源电流,在I/O线上经过MOSFET供给强的上拉(如图2所示)。当运用寄生电源办法时,VDD引脚有必要衔接到地。

体系中心操控器S3C2410X是三星公司根据ARM920T核的芯片。S3C2410X集成了1个LCD操控器(支撑STN和TFT带有触摸屏的液晶显现屏)、SDRAM、触摸屏、USB、SPI、SD和MMC等操控器,4个具有PWM功用的计时器和1个内部时钟,8通道的10位ADC,117位通用I/O口和24位外部中止源,8通道10位AD操控器,处理器作业频率最高抵达203 MHz。体系显现选用SHARP 3.5 in的TFT_LCD液晶显现屏。体系框图如图2所示。

图2 信息收集体系及部分电路衔接原理

  3 驱动完结

本节将完结一线制温度传感器网络的驱动模块。驱动从总体上看分为两部分:驱动与内核接口层、硬件设备接口层。

3.1 驱动与内核接口层

驱动与内核接口层首要完结驱动模块在Linux内核的注册加载、卸载铲除作业。这部分作业分别由初始化和退出函数完结。

① 初始化函数完结驱动模块加载:
static int __init DS18B20_init(void){
……
register_chrdev(DS18B20_MAJOR,DEVICE_NAME, DS18B20_fops);//完结设备注册
#ifdefCONFIG_DEVFS_FS//创立造备文件体系
devfs_mk_cdev(MKDEV(DS18B20_MAJOR,0),S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP,DEVICE_NAME);
#endif
……
}

② 退出函数完结驱动模块卸载:
static void __exit DS18B20_exit(void) {
#ifdef CONFIG_DEVFS_FS
devfs_remove(DEVICE_NAME);//移除设备文件
#endif
unregister_chrdev(DS18B20_MAJOR,DEV%&&&&&%E_NAME); //完结设备刊出
……
}

3.2 硬件设备接口层

硬件设备接口层用来描绘驱动程序与设备的交互。这些作业经过虚拟文件体系与设备驱动程序的接口完结。这个接口由file_operation结构界说,其结构如下:

static struct file_operations DS18B20_fops ={
.owner=THIS_MODULE, //指向具有该结构的模块,内核运用该结构保护模块运用计数
.open=DS18B20_open, //打开设备函数
.read=DS18B20_read, //读接口函数
.write=DS18B20_write,//写接口函数
.fasync=DS18B20_fasync, //异步告诉函数
.poll=DS18B20_poll,//poll函数
.release=DS18B20_release, //开释设备函数
};

3.2.1 打开设备函数

打开设备函数首要完结设备的初始化。
DS18B20_open(struct inode *inode,struct file *filp) {
Initial_Timer( );//初始化守时器,使内核模块按必定周期读温度
Initial_Device_DS18B20();//初始化硬件
readtemperature();//开端读取……
}

void readtemperature(void) {
……Temperature=DS18B20read();//读取2个8位数据,此函数完结的硬件操作时序,由当时读通道号变量指定当时通道
DS_SLOT_NO();//将本次读通道号放入缓冲区
DS18B20Event();//数据放入缓冲区,唤醒等候行列并发动异步告诉
if(ReleaseFlag)
CycleTimer_Delay_Soft(hdelay);//假如没有读中止信号,经过内核守时器延时,进行下一次读,在中止服务程序中再次发动读
……
}

在运用内核守时器之前需界说一个守时器结构体 static struct timer_list CycleTimer。下面是守时器的详细操作:
static void Initial_Timer(void) {
init_timer(CycleTimer); );//初始化守时器结构
CycleTimer.function=DS18B20_timer; //挂接守时中止服务程序
}

3.2.2 读接口函数

用户程序履行读操作的时分或许没有能够读取的数据,此刻需求让read操作等候直到有数据能够读取。在此选用等候行列使进程在无数据读取时进入等候,数据抵达时唤醒。等候行列设置成一个循环缓冲区,每放入一个新数据作为缓冲区的头,寄存时刻最久还未被取走的数据为缓冲区的尾。

DS18B20_read( ) {
DECLARE_WAITQUEUE(wait,current);//声明等候行列……
Next_try:
if(DS18B20dev.head != DS18B20dev.tail) {//等候行列不为空,即有数据
DS18B20_ret=Read_Buffer_DS18B20(); //取走缓冲区的尾
copy_to_user( ); //读取的数据送到用户空间
}
else { ……//等候行列为空,即没有数据
add_wait_queue(queue,wait);
current>state=TASK_INTERRUPTIBLE;//增加等候行列,声明状况为使命可中止
while((DS18B20dev.head==DS18B20dev.tail)!signal_pending(current) {//进入等候
schedule();
current>state=TASK_INTERRUPTIBLE;
}//假如缓冲区为空,Linux内核调度,等候告诉
current>state = TASK_RUNNING;//得到有数据的告诉,声明使命状况为运转
remove_wait_queue(queue,wait);//删去等候行列
goto Next_try;//回来到读取数据
}
}

3.2.3 fasync异步告诉函数

异步告诉函数向进程发送SIGIO信号,告诉拜访设备的进程,表明设备现已准备好I/O读写了,防止自动查询,进步程序功率。运用异步告诉需增加一个struct fasync_struct的结构指针,然后完结fasync接口函数。

static struct fasync_struct *fasync;//界说一个结构体
static int DS18B20_fasync(int fd,struct file *filp,int on) {//完结接口函数
retval = fasync_helper(fd,filp,on,fasync);
if ( retval0) return retval;return 0;
}

最终在需求向用户空间告诉的当地调用内核的kill_fasync函数。在打开设备函数中说到的DS18B20Event()功用是:将数据放入循环缓冲区,唤醒等候行列并发动异步告诉,这以后两项功用是这样完结的:

wake_up_interruptible(queue);//唤醒等候行列
if (fasync) {
kill_fasync(fasync,SIGIO,POLL_IN);//发送异步告诉信号
}

3.2.4 poll体系调用操作接口函数

当程序需求进行对多个文件读写时,假如某个文件没有准备好,则体系就会处于读写堵塞的状况,影响其他文件的读写。为了防止读写堵塞,运用poll函数。假如设备无堵塞地读,就回来POLLIN; 一般的数据现已准备好,能够读了,就回来POLLRDNORM。

static unsigned int DS18B20_poll(struct file *flip, poll_table *wait) {
poll_wait(flip,queue,wait);
if(DS18B20dev.head != DS18B20dev.tail) {
return POLLIN|POLLRDNORM;
}
return 0;
}

3.2.5 release开释设备函数

static intDS18B20_release(struct inode *inode,struct file *filp) {
ReleaseFlag=0//内核中止读取温度标志
DS18B20_fasync(1,filp,0);//封闭异步告诉
module_put(THIS_MODULE);//设备计数器减1
return 0;
}

写接口函数用来告诉驱动。例如告诉驱动读取通道2的数据,在运用程序中履行写接口函数write(fileno,SLOT2,1),驱动设置当时读通道号为2。

至此完结驱动接口函数。此驱动归于字符设备驱动,将源程序放在driver/char 目录下。一起需求修正该目录下的Kconfig配置文件并增加 Config 18B20_S3C2410选项,修正driver/char/Makefile,增加obj$(CONFIG_18B20_S3C2410) +=S3C2410_18B20.O。最终重新配置内核,将驱动以模块方式增加到内核,这样就能够编译驱动了。

4 Qtopia运用程序规划

(1) 创立工程

首要使用QT Designer规划器创立一个窗体运用程序ThermometerFigure.ui。窗体程序创立好后根据需求增加窗体控件、槽函数、信号等。图3为ThermometerFigure类的完结框图。

(2) ThermometerFigure类完结

使用uic东西发生相应的*.cpp和*.h文件(窗体类的完结文件和头文件)。修改*.cpp和*.h文件完结各成员函数、信号槽的衔接。详细完结如图3所示。

(3) 创立main及初始化

首要创立main.cpp文件,并在main.cpp 中创立QApplication 方针。QApplication 类担任图画用户界面运用程序的操控流和主设置,对一切来自体系和其他源文件的事情进行处理和调度;还包含运用程序的初始化和完毕。

int main( int argc, char **argv ) {
QApplication app(argc,argv);
ThemometerFigure wyc;//创立方针
app.setMainWidget( wyc );//选为主窗体
wyc.show(); return app.exec();
}

(4) 修改*.pro文件并生成Makefile

使用progen东西创立Thermometer.pro,详细完结如下:
TEMPLATE=app
CONFIG=qt warn_on release
HEADERS=ThermometerFigure.h
SOURCES=ThermometerFigure.cpp \\ main.cpp
INTERFACES=
履行qmake指令生成Makefile文件,履行之前要设置相关的环境变量,编译器途径等。
qmakeo Makefile Thermometer.pro

(5) 编译链接工程

履行make指令,将生成方针二进制文件Thermometer,此文件即可在设备上运转。

图3 ThermometerFigure类的完结框图

图4 ThermometerFigure类完结界面

(6) 将可履行文件发布到Linux体系

将可履行文件增加到Qtopia的根文件体系中,将生成的新的根文件体系烧写到设备的Flash根文件体系区,这样就能够在桌面运转程序了。图4为 ThermometerFigure类完结界面。

  结语

本文介绍了车载信息体系开发的部分完结办法。经过实例叙述了Linux的开发进程,包含驱动开发和运用程序开发流程。立异点在于将一线制传感器网络引进车载信息收集体系,大大简化了线路结构,有很高的实用价值。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/zhizao/191441.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部