Profile - CN181


CN181

基于Linux的环境监测平台

重庆大学
通信工程学院


Finals


[print]


Project

Name of Project:基于Linux的环境监测平台

Contact Information

Name:陈锋
E-Mail:85565516@163.com
Telephone:13594003456
Mobile Phone:13594003456
Mailing Address:重庆大学A区主教学楼2401室

Contest Advisor

Name:何伟
E-Mail:hewei007@cqu.edu.cn
Telephone:13908381077

Members

No.NameE-MailEnglish Name
1陈锋85565516@163.comChen feng
2刘九维20081202082@cqu.edu.cnLiu jiu wei
3余征华20081202083@cqu.edu.cnYu zheng hua

Project Paper - view as Preliminary(2010/06/01), Final(2010/09/18), Draft, Latest

1. 设计概述 (Preliminary Paper)

 一、 设计概述

1.1 设计意图
环境是一切物体赖以生存的物质基础。环境条件的好坏直接决定了物品的存储、动植物的生长。为保证良好的环境条件,需对所处空间内的温湿度、空气含量等环境参数进行监控,发现异常及时报警并做相应调整。因此在有特殊要求的场合中安装环境监控系统是十分必要的。传统的人工定期定点查看的方式费时费力、效率低,且测试的温度误差大,随机性大。我们需要一种性价比高、使用方便且测量准确的环境监测系统。随着无线传感技术的进步、计算机网络应用的广泛普及,自动环境监控系统的运用也成为现代化生产的必然结果。
本课题主要目的是设计基于Linux的环境监测平台,采用基于ZigBee技术的无线传感网络对特定场合中各点环境条件进行监测,管理者可以在控制室通过浏览网页的方式以及短信查询的方式随时了解现场的环境信息,也可以在我们的控制终端平台上进行查询和控制工作。
1.2 使用范围及用户群
本产品使用范围很广,只通过添加不同的环境监测传感器,就可以满足不同需求的场合。主要有以下几个应用:
(1) 蔬菜大棚
对于大棚蔬菜,由于有塑料薄膜覆盖,形成了相对封闭与露地不同的特殊小气候,进行蔬菜大棚栽培,必须掌握大棚内环境的特点(光照度、温湿度、CO2浓度等),并采取相应的调控措施,以满足蔬菜生长发育的条件,从而获得优质高产。
(2) 仓库
粮食、水果、化学药品等特殊物品在仓库内存放时,不恰当的仓库温度、湿度就会引起物品的物理变化和化学反应,导致物品变质损坏,直接影响到储备物资的使用寿命和工作可靠性。
(3) 室内或车内
对于有特殊要求的室内或是车内,必须要了解一些气体的含量(甲醛、CO、氧气等),当超出标准含量时,给予提示或警报。
1.3 采用Altera器件进行设计的优势
(1) 灵活高效的SOC解决方案
SOPC(片上可编程系统)将Nios II处理器、存储器、I/O口等系统设计需要的功能模块集成到一个FPGA上,构件成一个可编程的片上系统。具有灵活的设计开发定制外设,满足复杂的外设要求。
(2) 方便使用的Nios II软核处理器
Nios II属于软核嵌入式开发,具有灵活、高性能、低成本、生命周期长等特点,并提供了大量的开发技术文档和实例。Nios II软核的性能是可以根据应用来进富的IP核库,方便用户设计,有效的提高系统的运算能力。用户可以定义Nios II指令,提供了运算优化、加速的一个有效途径,易于实现算法的商用化。
1.4 使用Linux的优势
系统开发中引入Linux能有效提高CPU的利用率,简化复杂系统的开发难度。使工程具有源码级的可移植性。
Linux平台上有多种图形库可供选择,应用程序的开发在PC机上的Linux系统和Nios-Linux上完全一致。
Nios Community Wiki中有大量关于Linux的驱动及应用程序的相关内容,大大缩短系统开发周期。

 

(Revision: 3 / 2010-08-25 22:32:43)

2. 功能描述 (Final Project Paper)

. 功能描述

 

本系统具有如下功能:

l      环境参数监测      

通过带有不同传感器的子节点采集指定区域的环境参数,并将其发回核心板显示存储;

l      节点管理

 通过核心板的LTM触摸屏可对注册节点进行历史记录查询,删除,信息添加等处理;

l      GPRS监控和报警

  管理者可通过发送短信查询节点状态、采集现场图像并通过短信、彩信等方式传回可用信息。同时可设置自动报警阈值,一旦节点采样值超出既定阈值,会自动向指定手机号发送报警短信;

l      网页浏览

管理者可通过浏览器经由局域网登陆核心板网页,查看当前所有节点的历史信息;

子节点间通过ZigBee协议组网,将采集到的数据经由中心节点通过串口以固定数据包的形式传入核心板,核心板解析数据显示在触摸屏上并以规定的格式存储于SD卡中。通过触摸屏与管理者进行交互。GPRS模块通过串口与核心板相接,核心板解析GPRS请求并做相应处理。

利用Nios-Linux下的HTTP服务器程序boa支持CGI的特性,编写CGI应用程序,实现历史数据远程查询。

 

(Revision: 2 / 2010-08-25 22:32:26)

3. 性能参数 (Final Project Paper)

三. 性能参数

3.1 系统资源使用情况
3.1.1硬件资源使用情况
图3.1 系统资源使用情况
 
3.1.2内核+RAM中文件系统大小(图中红圈标记)
 
图3.2 压缩的内核+文件系统

3.2 GPRS

l    支持频段:GSM 850EGSM 900DCS 1800PCS 1900

l    支持业务:短信、彩信、语音

l    传输速率:GSM  14.4 kbps  GPRS  85.6 kbps

3.3 触摸屏LTM

l    分辨率:800*480(可调)

l    类型:4线电阻式

l    尺寸:4.3

3.4 摄像头MT9M011

l    最大分辨率:1280*1024

l    最高工作频率:25Mhz

l    输出格式:Bayer彩色格式

3.5  SD

l    支持类型:SD1.1 / SD2.0

l    读写速率:>= 1MB/s

l    容量:4 GB

3.6 无线芯片CC2430

l    集成高性能、低功耗8051内核微控制器

l    2.4 GHZ 无线收发RF芯片

l    支持ZigBee协议

l    8通道8-14 bits ADC

l    内部集成温度传感器

l    电压可选(2.2—3.6v)

3.7 各类传感器

 

(Revision: 2 / 2010-08-25 22:32:11)

4. 设计结构 (Preliminary Paper)

 四、设计结构

          系统示意图如图4.1所示。核心板通过扩展板采集无线节点汇聚的信息,显示到LTM上,同时将信息存入SD卡中。管理者可以使用PC机经由以太网访问核心板上的网页查询相关信息并发出指令采集摄像头图像,同时管理者也可以使用核心板的触摸屏模块进行同样的查询管理操作。另外管理者还可以通过手机短信或彩信的方式获取精简的信息。
  
4.1 系统示意图
 

硬件结构:图4.2展示了系统硬件框图。硬件平台采用Altera公司的SOCP Builder工具设计了基于带MMUNIOS II CPUAvalon总线的片上系统架构。采用SDRAM作为系统的程序和数据运行空间,SSRAM则作为LTM显示和摄像头图像采集的缓存,CFI Flash作为内核及文件系统的保存空间同时EPCS保存硬件设计的配置文件。通过USB ControllerSD Card ControllerUSB大容量存储器及SD卡进行管理。为了采集图像开辟一个双口RAM,一端写入CCD采集图像,另一端通过CPU将数据取出。

我们采用Altera University Program IP Cores中的Video模块对LTM进行显示管理,同时采用PS2模块实现与键盘的通信。使用友晶公司提供的DM9000 Controller管理网络芯片。

在扩展板上,我们设计了串口与主板进行通信,GPRS模块通过一个串口与主板进行数据交互,同时还设计了作为传感网络中心节点的无线芯片及相关电路。设计了子节点板采集各种环境信息,并通过中心节点板汇集后传输给主板进行进一步处理和显示。

4.2 系统硬件框图

 
 

软件结构:核心板软件结构如图4.3所示。以Nios-Linux为基础,根据硬件系统特点对内核进行裁剪,直接利用内核的部分驱动如MMC/SD卡驱动、USB主机控制器驱动、PS2键盘驱动等。同时利用类似代码对部分自定义模块进行驱动代码移植,如framebuffer驱动、触摸屏驱动等。

我们在FrameBuffer驱动的基础上移植了一个轻量级图形库,并针对当前系统特点进行代码优化和裁剪。

应用程序方面包括多个线程和进程。进程有boa服务器及我们为之编写的CGI程序和html页面;GUI 主线程用来显示和刷新图形界面并对用户操作进行响应;一个后台线程等待扩展板数据更新数据库或接受GPRS发来的查询指令进行反馈,同时在必要的时候通知GUI线程更新界面;

                                                                   

4.3 核心板软件结构框图

 

(Revision: 3 / 2010-08-25 22:31:40)

5. 设计方法 (Final Project Paper)

 . 设计方法

          5.1 硬件设计

5.1为本设计SOPC系统设置。

 

5.1 SOPC系统设计

在本次设计中大量使用了Altera公司的大学计划IP和友晶公司的第三方IP,同时还设计了自定义IP。下面对使用的IP做简要介绍:

1)  Altera大学计划IP

l Pixel Buffer:这是AUPIPVideoOut系列IP的一个,用于将指定源地址区域的图形数据读入并根据设置转换为符合要求的输出格式以数据流方式写入目的区域;

l VGA Controller:同上,也是VideoOut系列IP的一个,他用于接收来自Pixel BufferCharacter BufferAlpha Blending IP的输入数据流,生成指定输出设备规定的时序,与显示设备相接;

l PS2 Controller:用于支持PS2协议的设备与CPU通信;

2)  友晶公司及其他第三方IP

l DM9000:友晶公司在其开发例程中提供的网卡IP

l ISP1362 Controller:来自nioswikiUSB主设备控制IP,原IPQuartusII6.0下的IP,本系统中被移植到QuartusII9.0下;

3) 自定义IP

l PIC_DATA:这个IP用来接收CCD摄像头采集的数据,同时被CPU访问并提取数据;

在本次设计过程中,采用了一些技巧性的方式来提高系统速度:

1)  由于DE2-70使用两块位宽16bitSDRAM构成64MB,如果使用两个SDRAM控制器对其进行访问会由于CPU(32bit)与每一块SDRAM(16bit)之间位宽不一致导致数据读写速度变慢,在这种情况下两块SDRAM被串行访问。我们在SOPC系统中创建一个SDRAM控制器时将位宽设为32位,在顶层文件中两个SDRAM除了数据线外的信号共享SDRAM控制器相应信号,而数据线则分为高16bit和低16bit。这样两个SDRAM就实现了并行访问,提高数据读写速率。

2)  SOPC系统中,挂接在Avalon总线上被CPU访问的低速外设有很多,各个外设与CPU直接进行交互时由于各种不确定性造成一些外设需要等待其他外设从而浪费时间,就此我们采用了pipe line bridge即流水线桥来缓冲外设和CPU之间的访问。将各外设都置于流水线桥的管理之下,提高了系统的整体时钟和效率。

5.2 软件设计

5.2.1 Linux内核配置和裁剪

SOPC系统构建好后,通过sopc-create-header-files --single custom_fpga.h生成自定义硬件对应的内核所需头文件,将该文件拷贝到"nios-linux/linux-2.6/arch/nios/include/asm/"路径中。Nios-Linux对自定义硬件采用统一的宏定义进行管理,在同一目录下的nios.h就起到统一基本宏参数名称的作用,为了使内核编译时能通过,需将该文件下的宏定义改为与custom_fpga.h中一致,这样避免之后每次生成头文件再进行修改的麻烦,修改过的nios.h中关键部分内容如图5.2所示:

图5.2 nios.h修改部分
默认的内核开发包并不能直接使用,需进行修改,主要的修改内容包括:
1)      内核启动时先在JTAG_UART上打印消息,之后在将终端移交给设定的真正终端UART时不再打印任何消息。观察发现终端切换时的名称为空,查看代码发现custom_fpga.h中定义的串口宏定义和config.c中使用的宏定义不同。将"nios2-linux/linux-2.6/arch/nios2/kernel/config.c"中关于串口0的宏定义UART0_*改为UART_0_*;这是因为在custom_fpga.h中定义的串口宏均以UART_*开头;
2)        "nios2-linux/linux-2.6/arch/nios2/kernel/config.c"中关于串口0的宏定义,UART0_*改为UART_0_*;原因见上一条;
3)        使用开发包中自带的DM9000驱动时发现内核初始化网卡时失败,无法启动eth0。经过调试和阅读代码,发现该驱动的dm9000_probe函数在得到网卡ID后会从该网卡指定寄存器中读取MAC地址值,若读回地址值无效,则网卡驱动出错退出。而实际上DM9000在初始化时并没有MAC地址值,需要手动设置。因此,对代码进行修改,将读取MAC地址的操作改为设置MAC地址操作;
4)        开启USB设备ISP1362的驱动支持后发现初始化USB时始终显示复位失败导致驱动无法加载,经过多方查找在Altera论坛上发现了解决办法,在isp1362_hc_reset()函数中不做任何操作直接返回0即可;
5)        内核启动后发现SD卡无法挂载,检查发现/dev/mmcblk*系列设备的主设备号与注册时不一致,导致挂载操作失败,解决办法是将"nios2-linuxuClinux-dist/vendor/Altera/nios2/device-table.txt"中关于mmcblk*的主设备号修改为179即可;
6)        由上一条可知,内核通过device-table.txt设置/dev/下的设备,本系统需要三个串口设备,而该文件中只有一个,同时本系统通过一个GPIO启动摄像头采集工作,需将该GPIO添加为一个字符设备并编写相应驱动,因此在device-table.txt中添加如下三行:
/dev/ttyS1  c     755       0     0     4     65   0     0   -
/dev/ttyS2  c    755       0     0     4     66 0     0   -
/dev/ccd      c    777        0     0     62   1     0     0   -
7)        内核启动时早期控制台只能使用JTAG_UART,这给代码调试和之后的脱机工作带来不便,在"nios2-linux/linux/arch/nios2/kernel/early_printk.c"中添加如下代码即可增加串口为早期控制台:
              #elif defined(CONFIG_SERIAL_ALTERA_UART_CONSOLE)
              #if UART_BASE > 0x20000000
              #error Cannot map UART directly to IO_REGION
              #error please disable early console
              #endif
              #define ALTERA_UART_TXDATA_REG               4
              #define ALTERA_UART_STATUS_REG               8
              #define ALTERA_UART_STATUS_TRDY             (0x0040)
              static void early_console_write(struct console *con, const char *s, unsigned n)
              {
                  unsigned long base = UART_BASE + IO_REGION_BASE;
                  int crlf = 0;
                    while (n-- && *s)
{
while (!(__builtin_ldwio((void *)(base + ALTERA_UART_STATUS_REG))
& ALTERA_UART_STATUS_TRDY)) ;  
                            crlf = (*s == '\n' && !crlf);
                            __builtin_stwio((void *)(base + ALTERA_UART_TXDATA_REG),
crlf ? (n++, '\r') : *s++);
                    }  
              }
经过修改的内核满足开发的基本需求,在此基础上我们依据本系统的实际硬件对内核进行裁剪:
开启显示触摸屏驱动和输入设备支持
Device Drivers-->Character devices-->
[*] Virtual terminal
[ ]Support for console on virtual terminal #必须关闭该选项
Device Drivers-->Graphics support-->
[*]Support for frame buffer devices-->[*]Altera framebuffer support
Console display driver support-->
[ ] VGA text console # 必须关闭该选项
<*> Framebuffer Console support
Device Drivers-->[*]SPI support—>[*]Altera SPI Controller
Device Drivers-->Input device support
[*] Generic input layer (needed for keyboard, mouse, ...)
--- Userland interfaces
[*] Mouse interface
[ ]Provide legacy /dev/psaux device
(400 Horizontal screen resolution # 触摸屏水平分辨率
(240) Vertical screen resolution # 触摸屏垂直分辨率
[*] Event interface # 选择这个选项开启触摸屏支持
 
--- Input Device Drivers
[*]Keyboard--><*> AT keyboard # 开启键盘支持
[*] Mouse--><*>PS/2 mouse # PS2 鼠标支持
 
[*]Touchscreens-->[*] ADS7846/TSC2046 and ADS7843 based touchscreens
Hardware I/O ports-->
--- Serial I/O support
[ ]i8042 PC Keyboard controller # 关闭这个选项
[ ]Serial port line discipline # 关闭这个选项
[*]Altera UP PS2 controller # Altera大学计划IPPS2IP
开启SD/MMC卡支持和文件系统支持
Device Drivers-->
[*] SPI support-->
[*] Altera SPI Controller
[*] MMC/SD card support-->
[*] MMC block device driver
[*] Use bounce buffer for simple hosts
*** MMC/SD Host Controller Drivers ***
[*] MMC/SD over SPI
File systems-->
DOS/FAT/NT Filesystems-->
[*] VFAT (Windows-95) fs support
(437) Default codepage for FAT
(iso8859-1) Default iocharset for FAT
Native Language Support-->
(iso8859-1) Default NLS Option
[*] Codepage 437 (United States, Canada)
[*] Simplified Chinese charset(CP936,GB2312) # 开启这个选项以支持中文
[*] NLS ISO 8859-1 (Latin 1; Western European Languages)
开启USB支持
SCSI device support-->
[*] SCSI device support
[*] legacy /proc/scsi/ support
  [*] SCSI disk support
[*] USB support -->
[*] Support for Host-side USB
  [*]USB announce new devices
[*] USB device filesystem
[*]USB device class-devices (DEPRECATED)
  [*] ISP1362 HCD support
[*] USB Mass Storage support
5.3是内核配置中驱动配置部分的截图。

 

5.3 内核配置中驱动配置部分截图

经过裁剪的内核生成的压缩可执行文件可达到3M左右的大小,既满足系统应用的需求又小于存储介质的容量限制。

5.2.2 驱动移植和编写

1) FrameBuffer驱动编写

Framebuffer是出现在Linux 2.2.xx及以后版本内核当中的一种驱动程序接口,这种接口将显示设备抽象为帧缓冲区设备。它允许上层应用程序在图形模式下直接对显示缓冲区进行读写和I/O控制等操作。通过专门的设备节点可对该设备进行访问,如/dev/fb*。用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以进行读写操作,而读写操作可以反映到LCD

FrameBuffer驱动中有一些重要的数据结构:

fb_fix_screeninfo记录了帧缓冲设备和指定显示模式的固件信息。它包含了屏幕缓冲区的物理地址和长度等信息。

l  fb_var_screeninfo记录了帧缓冲设备和指定显示模式的可修改信息。它包括显示屏幕的分辨率、每个像素的比特数和一些时序变量。其中变量 xres定义了屏幕一行所占的像素数,yres定义了屏幕一列所占的像素数。

l  fb_info infoLinux为帧缓冲设备定义的驱动层接口。它不仅包含了底层函数,而且还有记录设备状态的数据。每个帧缓冲设备都与一个fb_info结构相对应。其中成员变量包含fb_fix_screeninfofb_var_screeninfo这两个数据结构,另外还有Framebuffer的回调函数。如果改驱动支持多个显示器,则需要多个struct fb_info与之相对应。

l  fb_ops中包含了对Framebuffer的回调函数,主要实现以下几个函数:

.fb_open = xxxfb_open,

.fb_release = xxxfb_release,

.fb_mmap = xxxfb_mmap,

.fb_setcolreg = xxxfb_setcolreg,

.fb_check_var = xxxfb_check_var,

FB驱动的模块加载函数中,主要完成以下工作:

l  申请fb_info结构体内存空间,初始化fb_info结构体中规定和可变屏幕参数。

l  初始化pixel buffer寄存器;使其工作在指定模式;

l  由于硬件指定的显存缓冲区SSRAM在内核配置时就没有设置为内存区域,因此不需要额外做内存申请操作,直接注册FB设备

FB驱动中最重要的函数要属fb_mmap,应用程序调用它在自己的进程空间映射显存区域,如果该函数出错,图形库将无法工作。在内核包中提供的类似驱动与当前内核不匹配,无法正常工作,使FB正常工作的关键是设置正确的内存映射标志:

vma->vm_flags |= VM_IO | VM_RESERVED;

vma->vm_page_prot = __pgprot(_PAGE_PRESENT|_PAGE_READ|_PAGE_WRITE);

设置正确的映射标志后再调用remap_pfn_range对申请区域进行映射操作即可。

2)     CCD GPIO驱动编写

由于摄像头采集图像需通过一个GPIO的高电平启动,并由该IO的低电平关闭,实现对IO的控制有两种方法,一种是利用"/dev/mem"设备在应用程序中映射GPIO所在物理线性区域,通过指针直接访问映射后的地址。实际编程中对发现映射的地址进行指针访问存在cache效应,即使打开设备时强制使用O_SYNC也无法解决问题;另一种则是编写一个简单的字符设备驱动,通过该驱动访问GPIO。本次设计采用第二种方法。

设计GPIO驱动包括以下几个要点:

l  GPIO的实际地址是0x00800140,在内核中内存映射关系是简单的0xC0000000偏移关系,因此对GPIO访问时需使用0xC0800140的地址空间,但是在申IO空间的时候则必须使用GPIO的物理地址0x00800140

l  对地址赋值可使用outl(value,address)函数这里的地址是虚拟地址;

l  对照device_table.txt我们将本设备主设备号设为62,从设备号设为1

l  主要实现opencloseioctl三个函数即可;

5.2.3 FTK GUI

 1)  FTK简介

本系统通过在Linux上移植GUI图形库FTK实现人机交互。FTK具有以下特点:

l  轻量级。包含字符编码文件整个图形库大小只有8MB左右;

l  界面元素可定义。通过编写XML文件并提供相应的主题图片可以修改和添加系统主题;

l  完整的GUI特性支持。包含有窗口、状态栏、对话框、按钮等多种widget

l  完备的底层支持。通过tslib支持触摸屏输入设备,通过Linux设备驱动支持键盘鼠标等输入设备以及触摸屏,VGA等输出设备;

l  支持中文编码和输入法;

5.4 FTK分层结构图

5.4展示了FTK的分层结构图,FTK的底层为平台依赖层,在不同的操作系统上该层的代码不同,同样显示设备不同实现显示的API系统调用也不同。

FTK的接口层以类似C++类继承的方式实现多个设备输入和图形解码的代码,由于代码的耦合性很低,添加或删除独立功能的代码对其他部分没有影响,这也是我们进行裁剪的前提。

2)  移植工作

FTK本身源码级支持Linux系统,因此可以将该图形库分别移植到PC机上的LinuxNios-Linux中,在PC机上调试通过的代码只需要修改配置文件就可以在Nios-Linux上运行正常。但是由于nios处理器的自身限制以及系统资源的约束,需要对FTK代码做修改和裁剪。

PC机上移植FTK

PC机上装有Ubuntu Linux操作系统。在PC机上移植FTK步骤如下:

l  下载FTK源码包,在制定位置解压;

l  使用解压包根目录下的autogen.sh脚本重新生成Makefile.inconfigure脚本为下一步调用该脚本做准备;

Configure脚本用来检测系统是否满足软件编译所需的所有要求,并可通过参数设置编译的不同行为。如with-backend参数用来设置软件编译设备选项,enable-tslib使能触摸屏设备作为输入,with-fontengine设置软件使用的字体引擎等。结合系统特点调用configure

l  使用makemake install进行编译和安装;

经过以上配置,就可以在PC机上开发FTK应用程序、图5.5展示了我们在Ubuntu下开发的应用程序界面。

5.5 应用程序界面

Nios-Linux下移植FTK

Nios-Linux移植FTK,除了配置编译环境和参数外,还需要做如下修改:

l  修改图形库bmp解码代码以适应NiosII处理方式;

l  裁剪底层支持设备,只留触摸屏和PS2鼠标;

l  修改触摸提取代码消除噪声;

l  添加自定义Widget实现特殊功能;

5.2.4 应用程序编写

本系统功能涉及GUI人机交互、无线数据监控、短信监控,通过多线程编程降低了开发难度,图5.6展示了本系统多个线程的调度关系。

5.6 多线程调度示意图

主线程的主要任务是初始化全局变量,读取指定目录下的数据库文件并缓存到内存中,之后创建GUI线程,让出CPU

GUI线程运行伊始就创建无线监听和GPRS监听两个后台线程,之后创建整个应用程序的用户界面。设计中充分利用FTK的多种Widget如对话框、文本框、标签栏、按钮等,同时为满足特定需求在继承基本控件特性的前提下开发自定义控件。

无线监听线程通过监听串口数据解析无线中心节点板发来的数据包并根据不同传感器模型进行相应原始数据处理,最终通过显示屏显示并存入SD卡中。

GPRS监听线程与无线监听线程类似,通过监听与GPRS相连的串口设备读取数据,解析请求并做相应处理。

5.2.5 CGI程序开发

 

 

5.7 CGI服务器与CGI程序工作流程

CGIcommon gate intergace)通用网关接口是一段运行在服务器上的程序,提供同客户端HTML页面的接口,它把HTML接收的指令通过标准IO传递给服务器,再把服务器执行的结果通过标准IO返还给HTML页;用CGI可以实现处理表格,数据库查询,发送电子邮件等许多操作。

CGI程序可以使用多种语言编写,只需要该语言能使用系统的标准输入输出和获取环境变量。本次开发采用C编写CGI程序。图5.7展示了http服务器和cgi程序的工作流程。

5.3 WSN设计

本次开发设计的无线传感器节点基于TinyOS操作系统。TinyOS操作系统是UC Berkeley(加州大学伯克利分校)开发的开源操作系统,专门为嵌入式无线传感器网络设计,该操作系统基于组件(Component-based)的架构使得程序能快速更新,同时又减小了受传感器网络节点存储器限制的代码长度。

一般而言,TinyOS操作系统的组件分为3种类型 :硬件抽象组件,合成硬件组件和高层软件组件。硬件抽象组件对物理硬件设备进行了TinyOS的组件化。合成硬件组件所起到的作用即为将硬件抽象组件与高层软件组件进行连接。高层的软件组件实现了对整个系统的控制、建立路由和数据传输等。多个下层组件可以连接起来构成上一层更大的组件,而最上层的组件就是应用程序。

TinyOS提供任务和事件的两级调度机制。任务一般用于对时间要求不高的应用,它实际上是一种延时计算机制。任务之间互相平等,没有优先级之分,所以任务的调度采用简单的FIFO

TinyOS的调度过程如图5.8所示。

5.8 TinyOSd调度过程

节点采集数据通过TinyOS构建的WSN网络经由无线中心节点板将数据包传入DE2-70中。数据包格式如图5.9所示:

5.9 无线数据包格式

各部分解释如下:

l  Header    包头。用于标识一个无线数据包的开始

l  Stype     数据类型。表示当前数据包传输的传感器节点类型

l  Lid       上一条ID号。表征数据包经历的上一个节点路由

l  Sid       本节点ID号。每一个无线传感器节点都会有一个独一无二的节点号

l  Pseq      包序号。用于标识该节点发送的包个数

l  Hcnt      跳数。用于标识从源节点到目的节点经过几个数据包

l  Data      有效数据。数据包内容,来自各个传感器的原始数据。

 

(Revision: 3 / 2010-08-25 22:34:21)

6. 设计特点 (Preliminary Paper)

六、 设计特点

6.1 SOPC技术                                                                                                                 

系统设计中把摄像头、LTM显示、PS2等功能模块都定制成SOPC 系统中的用户自定义模块,添加到SOPC 中,使系统的可剪裁性高。在本次设计中使用了Altera University Program IP Cores (VideoOutPS2),TERASIC公司提供的DM9000 IPNios Wiki上的USB IP等。大大缩短了开发周期。

6.2 NIOS-LINUX操作系统

采用带MMUNIOS II处理器,使用Nios Community Wiki上的linux操作系统(nios2-linux-20090929.tar),充分利用已有驱动加快设计速度;同时自行编写了LTMFramebuffer驱动和触摸屏驱动等;采用多线程编程,提高系统的使用效率,简化系统软件开发难度。

6.3 轻量级GUI图形库

移植了一个轻量级GUI图形库,并对触摸屏和显示进行代码优化。人性化的人机交互界面使得本设计更加贴近大众,用户可以在短时间内熟悉操作环境。

6.4 WSN无线传感网络

本设计的WSN 基于ZigBee协议。ZigBee 技术是一种低功耗、低成本的、低复杂度、近距离、低速率的无线通信技术,可以嵌入各种设备中

6.5 低成本、低功耗,可扩展

系统基于低成本高性价比的Cyclone II FPGA进行设计,在保证功能的前提下充分利用了其片内丰富的存储器和开发板上的SRAMSDRAMFlash以及CCD摄像头等资源,大大压缩了开发周期,降低了系统成本、复杂性和功耗。系统的实现依赖于GPRS、各功能传感器、摄像头等。设计中将这些硬件做成了一块扩展电路板,使系统外观简洁,使用方便。

 
(Revision: 3 / 2010-08-25 22:31:13)

7. 总结 (Final Project Paper)

. 总结

从三月份开始到八月,历经六个月的努力,我们的作品基于Linux的环境监测平台按照预定计划基本完成任务,实现预期的所有功能。

在这个作品中,我们首次尝试使用Nios-Linux作为系统软件平台进行作品的开发。由于使用的是NiosWiki开源社区发布的第一个针对带MMU NiosII Linux系统开发包,开发包中的很多驱动和应用程序版本都还停留在之前uClinux的分支上,在项目开始的最初一段时间给我们带来了很多困扰。幸运的是在Altera论坛的Linux板块,有许多热情的人在不厌其烦地回复我们这些入门者的疑问,同时对Linux开发包中的Bug进行积极地讨论和更新,而在Nios2-dev mailling-list上我们跟随者开发者的脚步找到许多关键的bug修订,自己打补丁。曾今有一段时间,因为SD卡设备号不匹配的问题,我们几乎放弃了Nios-linux,我们很清晰地记得找到问题症结的那一刻,大家是如何的兴奋、雀跃。

当我们写这篇论文时,Wiki上已经更新了内核开发包,在这个包里修正了我们论文中讨论的所有问题,我们衷心的对内核的维护者道一声谢谢!

遗憾的是,我们曾经想把QtEmbedded这个著名的图形库移植到Nios-Linux平台,经过十几天的努力,就在快要成功的时候却发现Nios-Linuxtoolchain版本过低,对QtEmbeded中的部分C++语言特性不支持,无法生成正确的二进制文件。

幸运的是,我们找到了一个新生的轻量级GUI----FTK,它是深圳一位工程师的作品。它的轻巧、时尚、良好的平台无关性一下就吸引了我们的目光。在移植的过程中我们遇到很多意想不到的困难,印象最深的就是Nios处理器对(*(unsigned int*)0x01000000)这种类型的访问会产生处理器异常。在不了解异常产生原因的时候我们一步一步修改GUI的源码,在每一个可能导致异常的地方插入调试代码,最终在GUI底层bmp图片解码的代码里发现了端倪,成功解决了这个棘手的问题!

我们要感谢Altera公司提供这次比赛机会,通过这次比赛我们体会到FPGA中软核与HDL代码结合的威力,通过自定义模块与HDL代码结合把一些在专有芯片上无法实现的功能轻松实现!在比赛中我们编写自定义模块,再为该模块编写Linux驱动,到应用程序中使用该设备,从中学到的内容是其他平台无法比拟的!

感谢Altera论坛的Linux板块(http://www.alteraforum.com/forum/forumdisplay.php?s=9f8f2247d5836e7a1e0ab60215d8f1c8&f=50)Nios2-dev(http://sopc.et.ntust.edu.tw/pipermail/nios2-dev/)通过这两个地方我们解决了很多关键的问题!

感谢Altera公司提供的大学计划IP(http://www.niosftp.com/pub/) ,这些IP极大提高了我们开发的进度!

感谢OO无双之真乱舞书”(http://www.cnblogs.com/oomusou/)的博客,在里面我们学到了很多FPGA的知识!

最后,感谢何伟老师的悉心指导,感谢林英撑师兄的热心帮助,感谢同门的积极探讨!

 

(Revision: 2 / 2010-08-25 22:30:53)