物联网仓储系统大哥.docx
《物联网仓储系统大哥.docx》由会员分享,可在线阅读,更多相关《物联网仓储系统大哥.docx(30页珍藏版)》请在冰点文库上搜索。
物联网仓储系统大哥
校内实习报告
实习名称:
面向硬件的编程技能实训2
姓名:
院(系):
专业班级:
学号:
指导教师:
成绩:
题目基于ARMLinux的物联网仓储系统
班级学号姓名
主要内容、基本要求、主要参考资料等:
一.主要内容及基本要求
项目以实现信息采集,设备控制,人机交互功能为重点,兼顾驱动设计。
1.采用FS4412(exynos4412-cortexA9)为硬件开发平台,裸板开发驱动程序:
1)点亮一盏LED灯,实现流水灯程序;
2)AD转换程序实现;
3)使用PWM驱动蜂鸣器程序实现。
2.学习BootLoader功能,熟悉嵌入式系统引导过程,制作自己的UBOOT,使用SD卡烧写UBOOT,实现开发板启动。
3.学习linux系统的基本操作,vim编辑器使用,shell命令使用,熟练使用VI编辑命令和linux常用操作命令。
4.学习linux系统下驱动开发的基础知识,挂载卸载驱动模块,掌握字符设备驱动程序设计方法。
1)向内核中加载LED驱动程序;
2)向内核中加载AD驱动程序;
3)向内核中加载PWM驱动程序。
5.移植boa服务器,移植HTML界面和CGI程序。
6.启动开发板,打开PC机上linux下浏览器,输入开发板IP地址访问,查看现象。
7.总结项目知识点,完成实训项目答辩。
二.主要参考资料
1.Exynos4412技术参考手册;
2.Exynos4412iromBootingGuide;
3.Linux指令命令集;
4.FSPV210 摄像头拍照功能的实现;
5.FS4412mjpg-streamer视频流服务器移植文档。
1、实验目的及要求
1.熟悉linux系统的特点,掌握linux系统的基本操作,vim编译器使用,shell命令使用。
2.学生可以通过这次实训建立起软件开发的基本思想和积累开发中常见的设计思路。
3.学生可以通过这次实训了解基于exynos4412产品的环境搭建,内核裁剪移植工作(包含启动引导,文件系统等)以及驱动开发流程,贯穿实际项目开发流程知识
4.掌握嵌入式项目开发的基本流程,以项目为参考,了解嵌入式整体的框架。
2、开发环境
1.FS4412(exynos4412-cortexA9)为硬件开发平台
2.PC机
3.Ubuntu
4.M0:
Cortex-M0开发板
5.交叉编译器arm-none-linux-gnueabi-gcc
3、需求分析
传统的仓库管理,一般依赖于一个非自动化的、以纸张文件为基础的系统来记录、追踪进出的货物,完全由人工实施仓库内部的管理,因此仓库管理的效率极其低下,所能管理的仓库规模也很小。
随着计算机的应用普及,目前大多数企业的仓库管理数据资料已开始采用计算机数据系统管理,但数据还是采用先纸张记录、再手工输入计算机的方式进行采集和统计整理。
这不仅造成大量的人力资源浪费,而且由于人为的因素,数据录入速度慢、准确率低。
随着仓库智能化的不断发展,仓库管理的物资种类,数量在不断增加、出入库频率剧增,仓库管理作业也已十分复杂和多样化,传统的人工仓库作业模式和数据采集方式已难以满足仓库管理的快速、准确要求,严重影响了仓库的管理。
目前ZIGBEE技术正在为仓库管理带来一场巨大的变革,以识别距离远,快速,不易损坏,容量大等条码无法比拟的优势,简化繁杂的工作流程,有效改善供应链的效率和透明度。
基于物联网的智能战备仓库管理系统是在现有仓库管理和车辆管理中引入ZIGBEE技术,对仓库到货检验、入库、出库、调拨、移库移位、库存盘点等各个作业环节的数据进行自动化的数据采集,保证仓库管理各个环节数据输入的速度和准确性,确保管理人员及时准确地掌握库存的真实数据,合理保持和控制仓库库存。
通过科学的编码,还可方便地对物品的批次、保质期等进行管理。
利用系统的库位管理功能,更可以及时掌握所有库存物资当前所在位置,有利于提高仓库管理的工作效率。
4、实验原理
1.通过M0进行实时采集环境参数,例如温度、湿度、光感数据,进行物品刷卡;
2.再通过ZigBee把采集到的环境参数或物品信息发送给A9;
3.由A9的M0线程负责接收环境参数或物品信息,激活数据库线程对数据库进行相应的处理,然后如果是环境参数则对环境参数进行判断处理进行报警。
4.用摄像头采集图片,存储到A9上。
5.构建嵌入式web服务器,使用户通过网络利用pc机进行监控。
6.在web页面上设置控制按钮,监控设备识别用户指令并进行相应动作
7.A9通过GPRS短信息功能向用户报警。
5、设计思路
6、项目设计流程
6.1u-boot的烧写及使用
6.1.1SD启动盘制作
将sdfuse_q拷贝到Linux家目录下
将SD卡插入电脑并在ubuntu中识别
将SD卡制作成启动盘
进入sdfuse_q目录并执行如下操作将SD卡制作成uboot2010启动盘
$sudo./mkuboot.sh/dev/sdb
拷贝镜像
在SD卡中创建目录sdupdate并把学生资料中的实验代码/第一天/镜像中的u-boot-fs4412.bin(uboot2013)拷贝到这个目录下
6.1.2u-boot的烧写
1)运行putty
使用串口线连接板子与电脑,运行串口通信程序putty
选择右上角的”Serial”,然后点击左下角的”Serial”
按照自己的主机的情况(设备管理器中)选择COM口,其他信息必须一直,然后点击open打开串口
2)调开关为SD启动模式并重启开发板
关闭开发板电源,将拨码开关SW1调至(1000)(SD启动模式)
将刚才做好的SD启动盘插入开发板SD卡插槽
重新打开开发板电源能够看到如下界面
在倒计时时按任意键让uboot停留在交互模式
3)烧写
在终端上执行:
#sdfuseflashall
等待终端无输出是表示烧写结束
6.1.2烧写结果
关闭开发板电源,将拨码开关SW1调至0110(EMMC启动模式)后打开电源可以看到如下界面表示烧写成功
在倒计时时按任意键让uboot停留在交互模式
6.2交叉编译工具链的安装
6.2.1解压工具链压缩包
$cd~
$mkdirtoolchain
$cdtoolchain
将gcc-4.6.4.tar.xz拷贝到toolchain目录下并解压
$tarxvfgcc-4.6.4.tar.xz
6.2.2将交叉编译工具链添加到全局环境变量使其全局可用
1)修改配置文件
打开配置文件/etc/bash.bashrc
$sudovi/etc/bash.bashrc
在其最后一行添加如下内容
exportPATH=$PATH:
/home/linux/toolchain/arm-2010.09/bin
2)重启配置文件生效
$source/etc/bash.bashrc
6.2.3工具链的测试
$arm-none-linux-gnueabi-gcc-v
执行该命令后有如下信息表示安装成功
这样我们的交叉工具链就安装好了
6.3内核的配置和编译
6.3.1解压内核并修改Makefile
1)解压内核
将linux-3.0-fs4412_v3.tar.xz拷贝到ubuntu主机的/home/linux下并解压,进入到该目录
$tarxvflinux-3.0-fs4412_v3.tar.xz
解压完成
$cdlinux-3.0-fs4412_v3
2)修改内核顶层目录下的Makefile
$vimMakefile
修改:
ARCH?
=$(SUBARCH)
CROSS_COMPILE?
=$(CONFIG_CROSS_COMPILE:
"%"=%)
为:
ARCH?
=arm
CROSS_COMPILE?
=arm-none-linux-gnueabi-cd
修改完成后保存退出
6.3.2配置和编译
1)导入默认配置
$makeexynos_defconfig
2)修改内核配置
$makemenuconfig
SystemType--->
(2)S3CUARTtouseforlow-levelmessages
修改完成后保存退出
3)编译内核
$makeuImage
编译完成后在源码的arch/arm/boot/目录下生成一个uImage文件,这就是经过压缩的内核镜像,即我们要下载的内核镜像文件。
第一次编译会提示缺少一个mkimage工具,该工具在实验三编译的uboot源码中的tools/下,我们将该文件拷贝到ubuntu主机的/usr/bin目录下然后重新编译
$sudocpu-boot-2013.01/tools/mkimage/usr/bin/
内核源码中并没有fs4412平台的设备树文件,所以我们直接复制三星的origen平台的设备树文件在此基础上进行修改
$cparch/arm/boot/dts/exynos4412-origen.dtsarch/arm/boot/dts/exynos4412-fs4412.dts
我们自己添加的设备树文件要想被编译需修改对应的Makefile
$vimarch/arm/boot/dts/Makefile
在exynos4412-origen.dtb\
下添加如下内容
exynos4412-fs4412.dtb\
4)编译设备树文件
$makedtbs
6.3.3拷贝内核和设备树
拷贝内核和设备树文件到/tftpboot目录下:
$cparch/arm/boot/uImage/tftpboot
$cparch/arm/boot/dts/exynos4412-fs4412.dtb/tftpboot/
6.4烧写linux内核镜像以及文件系统
6.4.1通过网络加载内核和文件系统
1)将uImage拷贝到ubuntu的/tftpboot下
2)将exynos4412-fs4412.dtb拷贝到ubuntu的/tftpboot下
3)将rootfs.tar.xz拷贝到ubuntu的/source下并解压
4)设置启动参数
#setenvserverip172.30.131.137(ubuntuip依个人而定)
#setenvipaddr172.30.131.221(开发板ip用户定义,保持网段与ubuntuip一致)
#setenvbootcmdtftp41000000uImage\;tftp42000000exynos4412-fs4412.dtb\;bootm41000000-42000000
#setenvbootargsroot=/dev/nfsnfsroot=172.30.131.137:
/source/rootfsrwconsole=ttySAC2,115200init=/linuxrcip=172.30.131.221
#saveenv
172.30.131.137对应Ubuntu的ip
172.30.131.221对应板子的ip
5)启动开发板看到如下现象表示成功通过网络挂载:
这时表示linux启动成功,可以输入一些Linux的命令测试
6.4.2从EMMC加载内核和文件系统
1)将资料中的实验代码/第一天/ramdisk.img拷贝到虚拟机/tftpboot目录下
2)烧写内核镜像到EMMC上(在uboot交互模式下操作)
#tftp41000000uImage
#moviwritekernel41000000
3)烧写设备树文件到EMMC上
#tftp41000000exynos4412-fs4412.dtb
#moviwritedtb41000000
4)写文件系统镜像到EMMC上
#tftp41000000ramdisk.img
#moviwriterootfs41000000300000
5)设置启动参数
#setenvbootcmdmovireadkernel41000000\;movireaddtb42000000\;movireadrootfs43000000300000\;bootm410000004300000042000000
#saveenv
6)重新启动开发板,u-boot自动加载、执行内核
6.5网卡驱动的移植
6.5.1文件修改
1)设备树文件修改
$vimarch/arm/boot/dts/exynos4412-fs4412.dts
srom-cs1@5000000{
compatible="simple-bus";
#address-cells=<1>;
#size-cells=<1>;
reg=<0x50000000x1000000>;
ranges;
ethernet@5000000{
compatible="davicom,dm9000";
reg=<0x50000000x20x50000040x2>;
interrupt-parent=<&gpx0>;
interrupts=<64>;
davicom,no-eeprom;
mac-address=[000a2da655a2];
};
};
2)drivers/clk/clk.c文件的修改
修改
staticboolclk_ignore_unused;
为
staticboolclk_ignore_unused=true;
6.5.2内核的配置和编译
1)配置内核
makemenuconfig
[*]Networkingsupport--->
Networkingoptions--->
<*>Packetsocket
<*>Unixdomainsockets
[*]TCP/IPnetworking
[*]IP:
kernellevelautoconfiguration
DeviceDrivers--->
[*]Networkdevicesupport--->
[*]Ethernetdriversupport--->
<*>DM9000support
Filesystems--->
[*]NetworkFileSystems--->
<*>NFSclientsupport
[*]NFSclientsupportforNFSversion3(NEW)
[*]NFSclientsupportfortheNFSv3ACLprotocolextension(NEW)
[*]RootfilesystemonNFS(NEW)
2)编译内核和设备树
$makeuImage
$makedtbs
6.5.3测试
拷贝内核和设备树文件到/tftpboot目录下
$cparch/arm/boot/uImage/tftpboot
$cparch/arm/boot/dts/exynos4412-fs4412.dtb/tftpboot/
启动开发板,修改内核启动参数,通过NFS方式挂载根文件系统
6.5.4编译LED驱动为模块
1.配置内核时按“空格”选择,配置完成后保存退出
$makemenuconfig
DeviceDrivers--->
Characterdevices--->
FS4412LEDDeviceSupport
2.保存退出,重新编译内核和驱动模块然后把uImage拷贝到ubuntu的/tftpboot下,把驱动模块拷贝到ubuntu的/source/rootfs下
$makeuImage
$makemodules
$cparch/arm/boot/uImage/tftpboot/
$cpdrivers/char/fs4412_led_drv.ko/source/rootfs/
重新启动开发板,linux运行起来后在终端下操作
3.创建设备节点
#mknod/dev/ledc5000
4.加载LED驱动模块
#insmodfs4412_led_drv.ko
5.运行测试程序并观察现象
#./fs4412_led_app
6.6BOA移植
6.6.1BOA服务器移植
1)解压源码
tarxvfboa-0.94.13.tar.tarcp
cdboa-0.94.13
2)进入src/
./configure生成Makefile
修改Makefile
修改CC=gcc为CC=arm-none-linux-gnueabi-gcc
修改CPP=gcc-E为CPP=arm-none-linux-gnueabi-gcc-E
3)make编译
编译一个linux下的c系统,包含词法和语法分析模块,Linux上用bison和flex。
yacc是一个文法分析器的生成器,bison即是yacc的GNU版本.Lex和YACC是用于构造词法分析机和语法解释器的工具,利用Lex和YACC你可以轻松的构造一个语法解释器。
sudoapt-getinstallbisonflex
执行make
然后给boa瘦身
Arm-none-linux-gnueabi-stripboa
6.6.2Boa服务器配置
1)创建目录
mkdir/source/rootfs/etc/boa
2)将boa源码目录下的boa.conf拷贝到/source/rootfs/etc/boa目录下
cpboa.conf/source/rootfs/etc/boa
3)修改配置文件boa.conf
vim/source/rootfs/etc/boa
(1)Group的修改
修改Groupnogroup
为Group0
(2)user的修改
修改Usernobody
为User0
(3)ScriptAlias的修改
修改ScriptAlias/cgi-bin//usr/lib/cgi-bin/
为ScriptAlias/cgi-bin//www/cgi-bin/
(5)DocumentRoot的修改
修改DocumentRoot/var/www
为DocumentRoot/www
(6)ServerName的设置
修改#ServerNamewww.your.org.here
为ServerNamewww.your.org.here
否则会出现错误“gethostbyname:
:
Nosuchfileordirectory”
(7)AccessLog修改
修改AccessLog/var/log/boa/access_log
为#AccessLog/var/log/boa/access_log
(8)以下配置和boa.conf的配置有关,都是l在ARM根文件系统中创建
创建HTML文档的主目录/www
mkdir/www
创建CGI脚本所在录/www/cgi-bin
mkdir/www/cgi-bin
当不能使用cgi时
将#AddTypeapplication/x-httpd-cgicgi改为AddTypeapplication/x-httpd-cgicgi
6.6.3BOA服务器测试
1)将boa拷贝到开发板根文件系统的/etc/boa下
#cpsrc/boa/source/rootfs/etc/boa
将ubuntu下/etc/mime.types拷贝到开发板根文件系统的/etc下
#cp/etc/mime.types/source/rootfs/etc
2)将你的主页index.html拷贝到www目录下
3)运行boa,然后在主机游览器输入开发板网址
[root@farsightboa]#./boa
[30/10/2011:
19:
10:
36+0000][root@farsightboa]#boa:
serverversionBoa/0.94.13
[30/10/2011:
19:
10:
36+0000]boa:
serverbuilt10302011at19:
10:
36
[30/10/2011:
19:
10:
36+0000]boa:
startingserverpid=968,port80
6.7SQLite向arm-linux的移植
6.7.1SQLite环境的建立
1)首先从下载最新版本的sqlite源码包,我下载的是sqlite-amalgamation-3.7.3.tar.gz,并将下载的文件解压。
2)2.在解压生成的sqlite-3.7.3目录下执行./configure--host=arm-none-linux-gnueabi--prefix=/home/linux/project/sqlite-arm,其中host为设置交叉编译器,prefix为设置存放编译生成文件的目录,sqlite-arm为跟sqlite-3.7.3同级的目录。
3)执行上步操作之后会生成Makefile,打开Makefile文件,找到-DPACKAGE_STRING=\"sqlite\3.7.6.2\"处,把3.7.6.2前面的“\”和空格删除。
(我使用的这个版本有个错误,其他的版本不一定有),然后直接执行make(要是这样meke有错的话,可以在make之前先makeclean一下,然后在make),生成可执行文件,然后再执行makeinstall,配置环境变量。
sqlite-arm目录下会生成bin、include、share和lib四个目录。
6.7.2SQLite数据库的移植
1)去掉/home/linux/project/sqlite-arm目录下的sqlite3的调示信息(瘦身):
arm-none-linux-gnueabi-stripsqlite3。
(为了在PC环境下调试,最好备份一下sqlite3,一下瘦身的文件同理)
2)将sqlite3下载到开发板的/usr/bin目录:
cpsqlite3/source/rootfs/usr/bin
3)在/home/linux/project/sqlite-arm/lib中找到libsqlite3.so.0.8.6这个库文件,去掉调示信息后将libsqlite3.so.0.8.6拷贝到开发板目录/usr/lib下,在开发板目录/usr/lib下创建一个符号