第一篇:基于ARM的指纹识别门禁系统设计_图文.
课程设计任务书
学生姓名: 廖年强 专业班级: 06自动化
指导教师: 谢川 工作单位: 重庆工商大学 计信学院
题 目: 基于ARM的指纹识别门禁系统设计
已知技术参数和设计要求:
1、硬件主要选择基于Xscale内核的PXA255处理器;
2、传感器为美国豪威公司的CMOS图像传感器FPS200;
3、设计系统的硬件和软件部分;
4、硬件包括指纹识别模块、数据处理模块等;
5、软件部分包括系统初始化, 指纹处理识别, 电控锁控制部分等;
6、以小组为单位完成本任务,每个小组最多5人;
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1、完成元器件选型,设计硬件电路,并提供protel电路图;
2、设计中给出最小系统的电路图扩展相应的电路,并根据要求最终形成一个完整的电路图,并完成所有源代码;
3、每个组员完成不少于3000字的课程设计报告且报告内容不同。
4、课题指标从学生实际出发,难易适中,经过努力都能够完成任务,并有所收获。
时间安排:2009~2010学年第一学期17~18周 指导教师签名: 年 月 日 教研室主任签名: 年 月 日
重庆工商大学课程设计成绩评定表
学院:计信学院 班级:06自动化2班 学生姓名:廖年强 学号:2006003921
优秀
项目 分值
(100>x≥90 参考标准 参考标准 参考标准
(90>x≥80 参考标准
(80>x≥70(70>x≥60 参考标准
良好
中等
及格
不及格(x<60
评分
学习态度 15 学习态度认真,科学作风严谨,严格保证设计时间并按任务书中规定的进度开展各项工作 学习态度比较认真,科学作风良好,能按期圆满完成任务书规定的任务 学习态度尚好,遵守组织纪律,基本保证设计时间,按期完成各项工作
学习态度尚可,能遵守组织纪律,能按期完成任务
学习马虎,纪律涣散,工作作风不
严谨,不能保证设计时间和进度
技术水平与实际能力 25 设计合理、理论分析与计算正确,实验数据准确,有很强的实际动手能力、经济分析能力和计算机应用能力,文献查阅能力强、引用合设计合理、理论分析与计算正确,实验数据比较准确,有较强的实际动手能力、经济分析能力和计算机应用能力,设计合理,理论分析与计算基本正确,实验数据比较准确,有一定的实际动手能力,主要文献引用、调查调研比设计不合理,理论
设计基本合分析与计理,理论分算有原则析与计算无错误,实 大错,实验验数据不数据无大错 可靠,实
际动手能力差,文献引用、理、调查调研文献引用、非常合理、可调查调研比信 较合理、可
信
较可信
调查调研有较大的问题
创新 10
有较大改进有重大改进或
或新颖的见独特见解,有
解,实用性一定实用价值
尚可
有一定改进
有一定见解 观念陈旧
或新的见解
论文(计算书、图纸50 撰写质量 结构严谨,逻辑性强,层次清晰,语言准确,文字流畅,完全符合规范化要求,书写工整或用计算机打印成文;图纸非常工整、清晰
结构合理,符合逻辑,文章层次分明,语言准确,文字流畅,符合规范化要求,书写工整或用计算机打印成文;图纸工整、清晰
结构合理,层次较为分明,文理通顺,基本达到规范化要求,书写比较工整;图纸比较工整、清晰
结构基本合理,逻辑基本清楚,文字尚通顺,勉强达到规范化要求;图纸比较工整
内容空泛,结构混乱,文字表达不清,错别字较多,达不到规范化要求;图纸不工整或不清晰
指导教师评定成绩:
指导教师签名: 年 月 日
基于ARM的指纹识别门禁系统设计
计信学院 06自动化2班 廖年强 2006003921 【摘 要】 本设计介绍了基于ARM的指纹识别门禁系统的软硬件设计。其中硬件主要是Intel 公司基于Xscale内核的PXA255处理器和美国豪威公司的CMOS图像传感器FPS200。软件设计包括系统初始化, 指纹处理识别, 电控锁控制部分等。经过实际测试该系统工作稳定可靠, 达到了设计目的。
【关键词】 ARM 门禁系统 指纹识别 TCP/IP 图像
一、门禁系统概述
门禁系统(Access Contro l System , 又称出入口控制系统,是为保障人们生活、工作及财产安全, 对重要通道的出入口进行管理与控制的系统。随着技术的发展, 门禁系统已经从传统的卡式门禁系统发展到今天的生物特征识别门禁系统。生物特征识别门禁系统是以人体生物特征作为辨识条件的指纹比对、掌纹比对、语音比对等。这些生理特征相同的概率达到数十亿分之一,因此具有无法仿冒与借用、不怕遗失、不用携带、不会遗忘,有着个体特征独特性、唯一性、安全性的特点,适用于高度机密性场所的安全保护。其中指纹识别发展最早, 使用也最广泛。并逐渐与网络集成。
二、PXA 255处理器和指纹传感器FPS200简介
本系统采用Intel 公司基于Xscale 内核的PXA255处理器。Xscale微架构采用ARMV 5TE ISA 兼容指令集(浮点指令集除外,它以ARM 核为中心,在其周围扩展了指令和数据内存管理(Inst ruct ion andDataM emo ryM anagement Unit, 指令、数据和微小数据高速缓(Instruction,Data and Mini-DataCache,写缓冲、全缓冲、挂起缓冲和分支目标缓冲,电源管理单元, 性能监测单元, 调试和JTAG 单元以及协处理器接口、MAC 协处理器、核心存储总线等。FPS系列CMOS图像传感器芯片是美国豪威公司的产品。FPS200是高度集成的彩色摄像芯片, 可带1/4镜头。支持多种格式, 内设的SCCB(Serial Camera Cont ro lBus 串行控制总线接口, 提供简单控制方式。通过该接口, 我们可以对FPS200芯片内部所有寄存器值进行修改, 从而完成对FPS200的控制, 包括色彩饱和度的调整、gamma 校正等等。该芯片最高能达到每秒钟30帧的传输速率, 并且用户可以控制图像质量, 可以根据自己的需要选择合适的图像质量。另外FPS200内置了640×480分辨率的镜像阵列,A/D转换器, 并支持外部水平、垂直同步输入格式, 数字视频输出、增益
控制、黑平衡和白平衡等在内的控制寄存器功能模块。其内部框图如图1。
图1 FPS200内部结构框图
三、系统硬件设计
1、结构框图
系统的硬件架构原理框图如图2所示,本系统主要实现指纹的识别、处理、特征模板提取、图2 系统硬件结构图
结果显示,以及完成个人身份识别/注册功能。主要由ARM9处理、VGA控制及结果显示等模块组成。
2、指纹识别模块
指纹识别模块核心部分为FPS200传感芯片,该芯片是一种触摸式CMOS传感器件,其传感区域为1.28cm×1.50cm,500dpi分辨率,内置有8位ADC,且有微处理器总线、SPI总线三种接口模式。其通过改变电容阵列的参数值可在一秒钟内扫描多副指纹图像便自动选择最好的一幅。本指纹防盗系统采用了传感器的USB模式传感器的数据线直接与STR912x芯片扩展口相接,对FPS200图像传感器进行初始化控制和图像读取。指纹传感电路如图3所示。
图3 指纹传感电路
指纹采集电路的原理图如图4所示,其工作原理为:PXA255处理器通过I2C总线设置FPS200的寄存器,系统开GPIO72(VSYNC的中断使能并检测中断,当GPIO72(V SYNC 中断到来以后,打开GPIO73(HREF中断使能,关闭其它的中断使能。当GPIO73(HREF中断到来以后, 打开GPIO74(PCLK中断使能, 关闭其它中断。每当GPIO74(PCLK中断到来, 就将GPI2Obuffer 里的GPIO64~GPIO71数据采集出来, 保存到imgbuf数组中去。重复这一步一直到采满382×240 次为止。将imgbuf按照每隔320 个元素就舍弃62个元素进行处理,这样得到的数据就是320×240 大小的灰度指纹图像。
图4 指纹采集电路原理图
3、数据处理模块
数据处理模块主要完成指纹识别的整个处理过程,包括指纹图像软化、方向图提取、图像增强、二值化、图像滤波、图像细化等。该模块采用了TMS320VC5402,使用FLASH和SDRAM分别作ARM处理器的程序存储器。TMS320VC5402是16位定点DSP,采用改进的哈佛结构适应远程通信等实时嵌入式的需要。为了提高速度,本文对一些核心的算法进行了优化。
4、全局逻辑控制单元
系统中大多数外围器件与DSP 的握手信号都是通过可编程逻辑器件来完成的,CPLD电路设计按其所实现的功能可分为DSP寻址空间和芯片读写信号两个模块,其中DSP寻址空间模块根据DSP输出的控制信号和数据空间选择信号分时寻址SRAM和FLASH两个存储体。
四、系统软件设计
指纹识别系统的主程序流程图如图5所示。目标板上电后对整个识别系统进行初始化操作,包括DSP系统的初始化和目标板上外设的初始化,对他们进行参数设置。初始化完成后开始检测指纹传感器上是否有手指,如果有则进行指纹图像的识别识别完成后就对着枚指纹图像进行预处理工作,在预处理的前端,对识别进来的这枚指纹进行质量评估,以判断是否需要继续进行指纹图像的预处理工作,若指纹质量比较好则继续进行预处理和数据上传;如果图像的质量很差,则作废这枚指纹数据。
指纹图像的识别是在中断程序中开始的,当指纹传感器上没有手指时,系统将进入省电模式,通过指纹传感器FPS200的手指自动检测中断来唤醒系统,并进行一次指纹图像识别、预处理和数据上传。指纹登记个数≥3000枚。
图5 软件流程图
系统设计完成后,可脱机值守工作。122×32点阵LCD实时显示时钟、操作状态,并具有15键操作键盘,可独立完成建档及查询功能。系统核查指纹1:N与1:1两种方式兼容,提供RS232/R485、RJ45接口支持局域网连接。
五、结论及心得体会
本次设计主要介绍了基于ARM的指纹识别门禁系统的软硬件设计。ARM体系结构有丰富的接口, 在门禁、监控等领域正发挥越来越重要的作用, 面向可集成, 可扩展, 可移植的特定嵌入式系统越来越多的出现在工程领域。随着性价比的提高和软件开发的成熟,ARM 在嵌入式领域的应用会越来越广泛。本文从指纹识别的可靠性及速度上考虑, 在门禁系统中以ARM 微处理器做控制器,充分利用了其高速的运算处理能力。
通过此次课程设计,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习嵌入式更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
附:程序代码:
//fps200.h #ifndef _FPS200_H_ #define _FPS200_H_
#define ROW_NUM 300
#define COL_NUM 256
#define FPS200_IOCRESET _IO(FPS200_IOC_MAGIC
#define FPS_RAH 0x00
#define FPS_RAL 0x01
#define FPS_CAL 0x02
#define FPS_REH 0x03
#define FPS_REL 0x04
#define FPS_CEL 0x05
#define FPS_DTR 0x06
#define FPS_DTR_TIME 0x70
#define FPS_DCR 0x07
#define FPS_DCR_CURRENT 0x6
#define FPS_CTRLA 0x08
#define FPS_CTRL_ASM_ARCH_EP7211_HA_GETSUB 0x04
#define FPS_CTRLA_GETIMG 0x02
#define FPS_CTRLA_GETROW 0x01
#define FPS_CTRLA_AINSEL 0x08
#define FPS_CTRLB 0x09
#define FPS_CTRLB_MODE 0xC0
#define FPS_CTRLB_RDY 0x20
#define FPS_CTRLB_AFDEN 0x08
#define FPS_CTRLB_AUTOINCEN 0x04
#define FPS_CTRLB_XTALSEL 0x02
#define FPS_CTRLB_ENABLE 0x01
#define FPS_CTRLC 0x0A
#define FPS_SRA_ASM_ARCH_EP7211_H 0x0B
#define FPS_SRA_GETSUB 0x04
#define FPS_SRA_GETIMG 0x02
#define FPS_SRA_GETROW 0x01
#define FPS_PGC 0x0C
#define FPS_PGC_VALUE 0x4//0xb
#define FPS_ICR 0x0D
#define FPS_ICR_IP1_RISE 0x80
#define FPS_ICR_IP0_RISE 0x40
#define FPS_ICR_IT1_LEVEL 0x20
#define FPS_ICR_IT0_LEVEL 0x10
#define FPS_ICR_IM1 0x08
#define FPS_ICR_IM0 0x04
#define FPS_ICR_IE1 0x02
#define FPS_ICR_IE0 0x01
#define FPS_ISR 0x0E
#define FPS_ISR_CLRINT 0x01
#define FPS_THR 0x0F
#define FPS_THR_THV 0x40
#define FPS_THR_THC 0x09
#define FPS_CIDH 0x10
#define FPS_CIDL 0x11
#define FPS_TST 0x12
#include
#undef PDEBUG
#ifdef fps200_DEBUG
# ifdef __KERNEL__
/* 调试的内核空间*/
# define PDEBUG(fmt, args...printk(KERN_DEBUG“fps200: ” fmt, ## args # else
/* 用户空间 */
# define PDEBUG(fmt, args...fprintf(stderr, fmt, ##args # endif #else
# define PDEBUG(fmt, args...调试*/
不
/*
#endif
#undef PDEBUGG
#define PDEBUGG(fmt, args.../*不调试*/
/* 设备结构类型 */
typedef struct FPS200_Dev {
unsigned char flag;
void *data;
} FPS200_Dev;
/* 用于 ioctl */
#define FPS200_IOC_MAGIC 'k'
/*
* S代表 “Set” through a ptr
* G代表 “Get”: reply by setting through a pointer
* C代表 “Check” */
#define FPS200_IOCSDTR _IOC(_IOC_WRITE, FPS200_IOC_MAGIC, 1, 1
#define FPS200_IOCSDCR _IOC(_IOC_WRITE, FPS200_IOC_MAGIC, 2, 1
#define FPS200_IOCSPGC _IOC(_IOC_WRITE, FPS200_IOC_MAGIC, 3, 1
#define FPS200_IOCGDTR _IOC(_IOC_READ, FPS200_IOC_MAGIC, 4, 1
#define FPS200_IOCGDCR _IOC(_IOC_READ, FPS200_IOC_MAGIC, 5, 1
#define FPS200_IOCGPGC _IOC(_IOC_READ, FPS200_IOC_MAGIC, 6, 1
#define FPS200_IOCFCAP _IOC(_IOC_READ, FPS200_IOC_MAGIC,7, 4
#define FPS200_IOCGDATA _IOC(_IOC_READ, FPS200_IOC_MAGIC, 8, 4
#define FPS200_IOCEINT _IOC(_IOC_NONE, FPS200_IOC_MAGIC, 9, 0
#define FPS200_IOCDINT _IOC(_IOC_NONE, FPS200_IOC_MAGIC, 10, 0
#define FPS200_IOCCINT _IOC(_IOC_READ, FPS200_IOC_MAGIC, 11, 1
#define FPS200_IOCCRDY _IOC(_IOC_READ, FPS200_IOC_MAGIC, 12, 1
#define FPS200_IOCCLR _IOC(_IOC_NONE, FPS200_IOC_MAGIC, 13, 0
#define FPS200_IOC_MAXNR 13
int fps200_open(struct inode *inode, struct file *filp;
int fps200_release(struct inode *inode, struct file *filp;
int fps200_ioctl(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg;
void fps_get_image(;
#endif /* _FPS200_H_ */
//fps200.c #ifndef __KERNEL__
# define __KERNEL__ #endif
#ifndef MODULE
# define MODULE #endif
#include
#include
#include
/* printk(*/
#include
#include
#include
#include
#include
#include
#include
iounmap(*/
#include
#include
#include
/* kmalloc(*/
/* everything...*/ /* size_t */ /* udelay(*/
/* ioremap(,/* error codes */
#include
#include
#include “fps200.h”
/* local definitions */
#define FPS200_VR 0xfd000000
#define FPS_INDEX(*(volatile unsigned char *FPS200_VR
#define FPS_DATA(*(volatile unsigned char *(FPS200_VR+1
#define FPS200_MAJOR 240
#define FPS200_NR_DEVS 0
#define FPS200_IRQ IRQ_EINT2
#define FPS200_DATASIZE 76800
int fps200_major = FPS200_MAJOR;
int fps200_nr_devs = FPS200_NR_DEVS;
fps200 devices(no use here */
// irq = 6
/* number of bare
MODULE_PARM(fps200_major,“i”;
MODULE_PARM(fps200_nr_devs,“i”;
MODULE_AUTHOR(“Nankai Unversity 5-304”;
MODULE_LICENSE(“GPL”;
struct file_operations fps200_fops = {
open: fps200_open,ioctl: fps200_ioctl,release: fps200_release };
struct file_operations *fps200_fop_array[]={
&fps200_fops,/* type 0 */
/* add more later */ };
#define FPS200_MAX_TYPE 0
FPS200_Dev *fps200_device;
void fps200_interrupt(int irq, void *dev_id, struct pt_regs *regs {
disable_irq(irq;
//fps_get_image(;
fps200_device->flag = 1;}
void fps_get_image(void {
int i = 0;
int j = 0;
FPS_INDEX = FPS_CTRLA;
FPS_DATA = FPS_CTRLA_GETIMG;
for(i=0;i<300;i++ {
FPS_INDEX = FPS_CTRLB;
while(!(FPS_CTRLB_RDY&FPS_DATA{udelay(1;};
for(j=0;j<256;j++ {
FPS_INDEX = FPS_CTRLB;
while(!(FPS_CTRLB_RDY&FPS_DATA{udelay(1;};
FPS_INDEX = FPS_CTRLA;
*((unsigned char *(fps200_device->data+i*256+j=FPS_DATA;
}
} }
int fps200_open(struct inode *inode, struct file *filp {
MOD_INC_USE_COUNT;
return(0;
}
int fps200_release(struct inode *inode, struct file *filp {
MOD_DEC_USE_COUNT;
return(0;}
int fps200_ioctl(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg {
int err = 0;
int ret = 0;
unsigned char tmp;
if(_IOC_TYPE(cmd!= FPS200_IOC_MAGIC
return-ENOTTY;
if(_IOC_NR(cmd > FPS200_IOC_MAXNR
return-ENOTTY;
if(_IOC_DIR(cmd & _IOC_READ
err = verify_area(VERIFY_WRITE,(void *arg,_IOC_SIZE(cmd;
else if(_IOC_DIR(cmd & _IOC_WRITE
err = verify_area(VERIFY_READ,(void *arg,_IOC_SIZE(cmd;
if(err
return err;
switch(cmd
{
case FPS200_IOCSDTR:
ret = __get_user(tmp,(unsigned char *arg;
if(tmp > 0x7f
tmp = 0x7f;
FPS_INDEX = FPS_DTR;
FPS_DATA = tmp;
break;
case FPS200_IOCSDCR:
ret = __get_user(tmp,(unsigned char *arg;
if(tmp > 0x1f
tmp = 0x1f;
FPS_INDEX = FPS_DCR;
FPS_DATA = tmp;
break;
case FPS200_IOCSPGC:
ret = __get_user(tmp,(unsigned char *arg;
if(tmp > 0x0f
tmp = 0x0f;
FPS_INDEX = FPS_PGC;
FPS_DATA = tmp;
break;
case FPS200_IOCGDTR:
FPS_INDEX = FPS_DTR;
tmp = FPS_DATA;
ret = __put_user(tmp,(unsigned char *arg;
break;
case FPS200_IOCGDCR:
FPS_INDEX = FPS_DCR;
tmp = FPS_DATA;
ret = __put_user(tmp,(unsigned char *arg;
break;
case FPS200_IOCGPGC:
FPS_INDEX = FPS_PGC;
tmp = FPS_DATA;
ret = __put_user(tmp,(unsigned char *arg;
break;
case FPS200_IOCEINT:
enable_irq(FPS200_IRQ;
break;
case FPS200_IOCDINT:
disable_irq(FPS200_IRQ;
break;
case FPS200_IOCFCAP:
fps_get_image(;
case FPS200_IOCGDATA:
copy_to_user((void *arg, fps200_device->data,FPS200_DATASIZE;
ret = 0;
fps200_device->flag = 0;
break;
case FPS200_IOCCLR:
memset(fps200_device->data, 0, FPS200_DATASIZE;
fps200_device->flag = 0;
break;
case FPS200_IOCCINT:
if(((clps_readw(INTSR1&0x40 == 0
{
udelay(100;
if(((clps_readw(INTSR1&0x40 == 0
ret = __put_user(0x01,(unsigned char *arg;
else
ret = __put_user(0x0,(unsigned char *arg;
}
else
ret = __put_user(0x0,(unsigned char *arg;
break;
case FPS200_IOCCRDY:
ret = __put_user(fps200_device->flag,(unsigned char
*arg;
break;
default:
return-ENOTTY;
}
return ret;}
static int __init fps200_init_module(void {
int result;
char tmp;
if((result = check_region(FPS200_VR,2
{
printk(“<1> can't get I/O port address n”;
return(result;
}
if(!request_region(FPS200_VR,2,“fps200”
return-EBUSY;
SET_MODULE_OWNER(&fps200_fops;
result = register_chrdev(fps200_major, “fps200”,&fps200_fops;
if(result < 0
{
printk(“<1>fps200: can't get major %dn”,fps200_major;
return result;
}
if(fps200_major == 0
fps200_major = result;
/* read chip id first, if not equal 0x20xx, print error*/
FPS_INDEX = FPS_CIDH;
tmp = FPS_DATA;
if(tmp!= 0x20
{
printk(“<1>wrong chip ID, insmod fail.n”;
/* dynamic */
return-EIO;
}
/* row auto inc.inner 12MHz vibrator.no low-power state*/ FPS_INDEX = FPS_CTRLB;
FPS_DATA =(FPS_CTRLB_AFDEN|FPS_CTRLB_AUTOINCEN|FPS_CTRLB_ENABLE;
/* 等待30us */
udelay(35;
// 使时延大于 30us
/* 中断 */
FPS_INDEX = FPS_ICR;
FPS_DATA =(FPS_ICR_IE0|FPS_ICR_IT0_LEVEL;
FPS_INDEX = FPS_THR;
FPS_DATA =(FPS_THR_THV | FPS_THR_THC;
/* DTR, DCR, PGC */
FPS_INDEX = FPS_DTR;
FPS_DATA = 0x23;
FPS_INDEX = FPS_DCR;
FPS_DATA = 0x1;
FPS_INDEX = FPS_PGC;
FPS_DATA = 0;
FPS_INDEX = FPS_RAL;
// raw 地址
FPS_DATA = 0;
FPS_INDEX = FPS_RAH;
FPS_DATA = 0;
FPS_INDEX = FPS_REL;
FPS_DATA = 0;
FPS_INDEX = FPS_REH;
/* other initial */
FPS_DATA = 0;
FPS_INDEX = FPS_CAL;
// column 地址
FPS_DATA = 0;
FPS_INDEX = FPS_CEL;
FPS_DATA = 0;
FPS_INDEX = FPS_CTRLC;
FPS_DATA = 0;
FPS_INDEX = FPS_CTRLA;
FPS_DATA = 0;// clear FPS_CTRLA_AINSEL
if(result
{
printk(“<1>can't get assigned irq.n”;
设置 irq */ /*
return-EIO;
}
fps200_device = kmalloc(sizeof(FPS200_Dev,GFP_KERNEL;
if(!fps200_device
{
FPS_INDEX = FPS_CTRLB;
FPS_DATA = 0;
return-ENOMEM;
}
memset(fps200_device, 0, sizeof(FPS200_Dev;
fps200_device->data = kmalloc(FPS200_DATASIZE,GFP_KERNEL;
if(!fps200_device
{
FPS_INDEX = FPS_CTRLB;
FPS_DATA = 0;
kfree(fps200_device;
return-ENOMEM;
}
memset(fps200_device->data, 0, FPS200_DATASIZE;
result = request_irq(FPS200_IRQ, fps200_interrupt,SA_INTERRUPT, “fps200”, NULL;
return(0;}
static void __exit fps200_cleanup_module(void {
设置 irq */
/*
kfree(fps200_device->data;
kfree(fps200_device;
FPS_INDEX = FPS_CTRLB;
FPS_DATA = 0;
release_region(FPS200_VR,2;
free_irq(FPS200_IRQ, NULL;
unregister_chrdev(fps200_major, “fps200”;}
module_init(fps200_init_module;
module_exit(fps200_cleanup_module;//main.c void main(void {
BYTE temp;
WORD port = 1001;
LocalMACAddr[0]=0x52;
LocalMACAddr[1]=0x54;
LocalMACAddr[2]=0x4c;
LocalMACAddr[3]=0x30;
LocalMACAddr[4]=0x2e;
LocalMACAddr[5]=0x2f;
LocalIPAddress = 0xc0a8020d;/* 本地地址192.168.2.14*/
ServerIPAddress = 0xc0a8020e;/* 目的地址192.168.2.13*/
/*初始化 */
SerialInitial(;
MemInitial(;
NetInInitial(;
RTLInitial(;
Start8019(;
InterruptInitial(;
// 建立一个ARP包
p[0] =0xff;
p[1] =0xff;
p[2] =0xff;
p[3] = 0xff;
p[4] = 0xff;
p[5] = 0xff;
p[6] = 0x52;
p[7] =0x54;
p[8] =0x4c;
p[9] =0x30;
p[10] =0x2e;
p[11] =0x2f;
p[12] = 0x08;
p[13] = 0x06;
p[14] = 0x00;
p[15] = 0x01;
p[16] = 0x08;
p[17] = 0x00;
p[18] = 0x06;
p[19] = 0x04;
p[20] = 0x00;
p[21] = 0x01;
// 发送ARP包
RTLSendPacket(p,60;
while(1;
#ifdef DEBUG
printf(“n-------bigine-------”;#endif
/* 处理 */
TCPBind(port;
if(TCPConnect(ServerIPAddress,1001 == TRUE
{
while(UserFunc(;
}
/* 延时 */
for(temp;temp<255;temp++;
#ifdef DEBUG
printf(“n run over!”;#endif
Stop8019(;
while(1;}
/* 存储 */
第二篇:基于ARM的指纹识别门禁系统设计
HUBEI NORMAL UNIVERSITY
嵌入式课程设计报告
课题: 指纹识别门禁系统设计
姓名: 万苗
学号: 20*** 院系: 计算机科学与技术学院
班级: 1303班
导师: 曹杉杉
第 1 / 23页 基于ARM的指纹识别门禁系统设计
【摘 要】 本设计介绍了基于ARM的指纹识别门禁系统的软硬件设计。其中硬件主要是Intel 公司基于Xscale内核的PXA255处理器和美国豪威公司的CMOS图像传感器FPS200。软件设计包括系统初始化, 指纹处理识别, 电控锁控制部分等。经过实际测试该系统工作稳定可靠, 达到了设计目的。
【关键词】 ARM 门禁系统 指纹识别 TCP/IP 图像
一、门禁系统概述
门禁系统(Access Contro l System), 又称出入口控制系统,是为保障人们生活、工作及财产安全, 对重要通道的出入口进行管理与控制的系统。随着技术的发展, 门禁系统已经从传统的卡式门禁系统发展到今天的生物特征识别门禁系统。生物特征识别门禁系统是以人体生物特征作为辨识条件的指纹比对、掌纹比对、语音比对等。这些生理特征相同的概率达到数十亿分之一,因此具有无法仿冒与借用、不怕遗失、不用携带、不会遗忘,有着个体特征独特性、唯一性、安全性的特点,适用于高度机密性场所的安全保护。其中指纹识别发展最早, 使用也最广泛。并逐渐与网络集成。
二、PXA 255处理器和指纹传感器FPS200简介
本系统采用Intel 公司基于Xscale 内核的PXA255处理器。Xscale微架构采用ARMV 5TE ISA 兼容指令集(浮点指令集除外),它以ARM 核为中心,在其周围扩展了指令和数据内存管理(Inst ruct ion andDataM emo ryM anagement Unit), 指令、数据和微小数据高速缓(Instruction,Data and Mini-DataCache),写缓冲、全缓冲、挂起缓冲和分支目标缓冲,电源管理单元, 性能监测单元, 调试和JTAG 单元以及协处理器接口、MAC 协处理器、核心存储总线等。FPS系列CMOS图像传感器芯片是美国豪威公司的产品。FPS200是高度集成的彩色摄像芯片, 可带1/4镜头。支持多种格式, 内设的SCCB(Serial Camera Cont ro lBus)串行控制总线接口, 提供简单控制方式。通过该接口, 我们可以对FPS200芯片内部所有寄存器值进行修改, 从而完成对FPS200的控制, 包括色彩饱和度的调整、gamma 校正等等。该芯片最高能达到每秒钟30帧的传输速率, 并且用户可以控制图像质量, 可以根据自己的需要选择合适的图像质量。另外FPS200内置了640×480
第 2 / 23页 分辨率的镜像阵列,A/D转换器, 并支持外部水平、垂直同步输入格式, 数字视频输出、增益 控制、黑平衡和白平衡等在内的控制寄存器功能模块。其内部框图如图1:
图1 FPS200内部结构框图
第 3 / 23页
三、系统硬件设计
1、结构框图
系统的硬件架构原理框图如图2所示,本系统主要实现指纹的识别、处理、特征模板提取、结果显示,以及完成个人身份识别/注册功能。主要由ARM9处理、VGA控制及结果显示等模块组成。
第 4 / 23页
2、指纹识别模块
指纹识别模块核心部分为FPS200传感芯片,该芯片是一种触摸式CMOS传感器件,其传感区域为1.28cm×1.50cm,500dpi分辨率,内置有8位ADC,且有微处理器总线、SPI总线三种接口模式。其通过改变电容阵列的参数值可在一秒钟内扫描多副指纹图像便自动选择最好的一幅。本指纹防盗系统采用了传感器的USB模式传感器的数据线直接与STR912x芯片扩展口相接。
第 5 / 23页 指纹采集电路的原理图如图4所示,其工作原理为:PXA255处理器通过I2C总线设置FPS200的寄存器,系统开GPIO72(VSYNC)的中断使能并检测中断,当GPIO72(V SYNC)中断到来以后,打开GPIO73(HREF)中断使能,关闭其它的中断使能。当GPIO73(HREF)中断到来以后, 打开GPIO74(PCLK)中断使能, 关闭其它中断。每当GPIO74(PCLK)中断到来, 就将GPI2Obuffer 里的GPIO64~GPIO71数据采集出来, 保存到imgbuf数组中去。重复这一步一直到采满382×240 次为止。将imgbuf按照每隔320 个元素就舍弃62个元素进行处理,这样得到的数据就是320×240 大小的灰度指纹图像。
图4 指纹采集电路原理图
第 6 / 23页
3、数据处理模块
数据处理模块主要完成指纹识别的整个处理过程,包括指纹图像软化、方向图提取、图像增强、二值化、图像滤波、图像细化等。该模块采用了TMS320VC5402,使用FLASH和SDRAM分别作ARM处理器的程序存储器。TMS320VC5402是16位定点DSP,采用改进的哈佛结构适应远程通信等实时嵌入式的需要。为了提高速度,本文对一些核心的算法进行了优化。
4、全局逻辑控制单元
系统中大多数外围器件与DSP 的握手信号都是通过可编程逻辑器件来完成的,CPLD电路设计按其所实现的功能可分为DSP寻址空间和芯片读写信号两个模块,其中DSP寻址空间模块根据DSP输出的控制信号和数据空间选择信号分时寻址SRAM和FLASH两个存储体。
四、系统软件设计
指纹识别系统的主程序流程图如图5所示。目标板上电后对整个识别系统进行初始化操作,包括DSP系统的初始化和目标板上外设的初始化,对他们进行参数设置。初始化完成后开始检测指纹传感器上是否有手指,如果有则进行指纹图像的识别识别完成后就对着枚指纹图像进行预处理工作,在预处理的前端,对识别进来的这枚指纹进行质量评估,以判断是否需要继续进行指纹图像的预处理工作,若指纹质量比较好则继续进行预处理和数据上传;如果图像的质量很差,则作废这枚指纹数据。
指纹图像的识别是在中断程序中开始的,当指纹传感器上没有手指时,系统将进入省电模式,通过指纹传感器FPS200的手指自动检测中断来唤醒系统,并进行一次指纹图像识别、预处理和数据上传。指纹登记个数≥3000枚。系统设计完成后,可脱机值守工作。122×32点阵LCD实时显示时钟、操作状态,并具有15键操作键盘,可独立完成建档及查询功能。系统核查指纹1:N与1:1两种方式兼容,提供RS232/R485、RJ45接口支持局域网连接。
第 7 / 23页
五、结论及心得体会
本次设计主要介绍了基于ARM的指纹识别门禁系统的软硬件设计。ARM体系结构有丰富的接口, 在门禁、监控等领域正发挥越来越重要的作用, 面向可集成, 可扩展, 可移植的特定嵌入式系统越来越多的出现在工程领域。随着性价比的提高和软件开发的成熟,ARM 在嵌入式领域的应用会越来越广泛。本文从指纹识别的可靠性及速度上考虑, 在门禁系统中以ARM 微处理器做控制器,充分利用了其高速的运算处理能力。
通过此次课程设计,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习嵌入式更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
第 8 / 23页
六、程序代码:
//fps200.h #ifndef _FPS200_H_ #define _FPS200_H_ #define ROW_NUM 300 #define COL_NUM 256 #define FPS200_IOCRESET _IO(FPS200_IOC_MAGIC)#define FPS_RAH 0x00 #define FPS_RAL 0x01 #define FPS_CAL 0x02 #define FPS_REH 0x03 #define FPS_REL 0x04 #define FPS_CEL 0x05 #define FPS_DTR 0x06 #define FPS_DTR_TIME 0x70 #define FPS_DCR 0x07 #define FPS_DCR_CURRENT 0x6 #define FPS_CTRLA 0x08 #define FPS_CTRL_ASM_ARCH_EP7211_HA_GETSUB 0x04 #define FPS_CTRLA_GETIMG 0x02 #define FPS_CTRLA_GETROW 0x01 #define FPS_CTRLA_AINSEL 0x08 #define FPS_CTRLB 0x09 #define FPS_CTRLB_MODE 0xC0 #define FPS_CTRLB_RDY 0x20 #define FPS_CTRLB_AFDEN 0x08 #define FPS_CTRLB_AUTOINCEN 0x04 #define FPS_CTRLB_XTALSEL 0x02 #define FPS_CTRLB_ENABLE 0x01
第 9 / 23页 #define FPS_CTRLC 0x0A #define FPS_SRA_ASM_ARCH_EP7211_H 0x0B #define FPS_SRA_GETSUB 0x04 #define FPS_SRA_GETIMG 0x02 #define FPS_SRA_GETROW 0x01 #define FPS_PGC 0x0C #define FPS_PGC_VALUE 0x4//0xb #define FPS_ICR 0x0D #define FPS_ICR_IP1_RISE 0x80 #define FPS_ICR_IP0_RISE 0x40 #define FPS_ICR_IT1_LEVEL 0x20 #define FPS_ICR_IT0_LEVEL 0x10 #define FPS_ICR_IM1 0x08 #define FPS_ICR_IM0 0x04 #define FPS_ICR_IE1 0x02 #define FPS_ICR_IE0 0x01 #define FPS_ISR 0x0E #define FPS_ISR_CLRINT 0x01 #define FPS_THR 0x0F #define FPS_THR_THV 0x40 #define FPS_THR_THC 0x09 #define FPS_CIDH 0x10 #define FPS_CIDL 0x11 #define FPS_TST 0x12 #include
第 10 / 23页 # define PDEBUG(fmt, args...)fprintf(stderr, fmt, ##args)# endif #else # define PDEBUG(fmt, args...)
/* 不调试*/ #endif #undef PDEBUGG #define PDEBUGG(fmt, args...)
调试*/ /* 设备结构类型 */ typedef struct FPS200_Dev { unsigned char flag;void *data;} FPS200_Dev;
/* 用于 ioctl */ #define FPS200_IOC_MAGIC 'k' /* * S代表 “Set” through a ptr * G代表 “Get”: reply by setting through a pointer * C代表 “Check” */ #define FPS200_IOCSDTR _IOC(_IOC_WRITE, FPS200_IOC_MAGIC, 1, 1)#define FPS200_IOCSDCR _IOC(_IOC_WRITE, FPS200_IOC_MAGIC, 2, 1)#define FPS200_IOCSPGC _IOC(_IOC_WRITE, FPS200_IOC_MAGIC, 3, 1)#define FPS200_IOCGDTR _IOC(_IOC_READ, FPS200_IOC_MAGIC, 4, 1)#define FPS200_IOCGDCR _IOC(_IOC_READ, FPS200_IOC_MAGIC, 5, 1)#define FPS200_IOCGPGC _IOC(_IOC_READ, FPS200_IOC_MAGIC, 6, 1)#define FPS200_IOCFCAP _IOC(_IOC_READ, FPS200_IOC_MAGIC,7, 4)
第 11 / 23页
不
/* #define FPS200_IOCGDATA _IOC(_IOC_READ, FPS200_IOC_MAGIC, 8, 4)#define FPS200_IOCEINT _IOC(_IOC_NONE, FPS200_IOC_MAGIC, 9, 0)#define FPS200_IOCDINT _IOC(_IOC_NONE, FPS200_IOC_MAGIC, 10, 0)#define FPS200_IOCCINT _IOC(_IOC_READ, FPS200_IOC_MAGIC, 11, 1)#define FPS200_IOCCRDY _IOC(_IOC_READ, FPS200_IOC_MAGIC, 12, 1)#define FPS200_IOCCLR _IOC(_IOC_NONE, FPS200_IOC_MAGIC, 13, 0)#define FPS200_IOC_MAXNR 13 int fps200_open(struct inode *inode, struct file *filp);int fps200_release(struct inode *inode, struct file *filp);int fps200_ioctl(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg);void fps_get_image();#endif /* _FPS200_H_ */ //fps200.c #ifndef __KERNEL__ # define __KERNEL__ #endif #ifndef MODULE # define MODULE #endif #include
*/ #include
*/ #include
everything...*/ #include
#include
#include
第 12 / 23页
/* printk()/* kmalloc()
/* error codes */ /* size_t */
/* #include
/* udelay()*/ #include
/* ioremap(), iounmap()*/ #include
local definitions */ #define FPS200_VR 0xfd000000 #define FPS_INDEX(*(volatile unsigned char *)FPS200_VR)#define FPS_DATA(*(volatile unsigned char *)(FPS200_VR+1))#define FPS200_MAJOR 240 #define FPS200_NR_DEVS 0 #define FPS200_IRQ IRQ_EINT2
#define FPS200_DATASIZE 76800 int fps200_major = FPS200_MAJOR;int fps200_nr_devs = FPS200_NR_DEVS;
fps200 devices(no use here)*/ MODULE_PARM(fps200_major,“i”);MODULE_PARM(fps200_nr_devs,“i”);MODULE_AUTHOR(“Nankai Unversity 5-304”);MODULE_LICENSE(“GPL”);struct file_operations fps200_fops = { open: fps200_open, ioctl: fps200_ioctl, release: fps200_release };struct file_operations *fps200_fop_array[]={
第 13 / 23页
/*
// irq = 6
/* number of bare &fps200_fops,/* type 0 */
/* add more later */ };#define FPS200_MAX_TYPE 0 FPS200_Dev *fps200_device;void fps200_interrupt(int irq, void *dev_id, struct pt_regs *regs){ disable_irq(irq);//fps_get_image();fps200_device->flag = 1;} void fps_get_image(void){ int i = 0;int j = 0;FPS_INDEX = FPS_CTRLA;FPS_DATA = FPS_CTRLA_GETIMG;for(i=0;i<300;i++){
FPS_INDEX = FPS_CTRLB;
while(!(FPS_CTRLB_RDY&FPS_DATA)){udelay(1);};
for(j=0;j<256;j++){
FPS_INDEX = FPS_CTRLB;
while(!(FPS_CTRLB_RDY&FPS_DATA)){udelay(1);};
FPS_INDEX = FPS_CTRLA;
*((unsigned char *)(fps200_device->data+i*256+j))=FPS_DATA;
} } } int fps200_open(struct inode *inode, struct file *filp){ MOD_INC_USE_COUNT;
第 14 / 23页 return(0);} int fps200_release(struct inode *inode, struct file *filp){ MOD_DEC_USE_COUNT;return(0);} int fps200_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg){ int err = 0;int ret = 0;unsigned char tmp;if(_IOC_TYPE(cmd)!= FPS200_IOC_MAGIC)return-ENOTTY;if(_IOC_NR(cmd)> FPS200_IOC_MAXNR)return-ENOTTY;if(_IOC_DIR(cmd)& _IOC_READ)err = verify_area(VERIFY_WRITE,(void *)arg, _IOC_SIZE(cmd));else if(_IOC_DIR(cmd)& _IOC_WRITE)err = verify_area(VERIFY_READ,(void *)arg, _IOC_SIZE(cmd));if(err)return err;switch(cmd){ case FPS200_IOCSDTR:
ret = __get_user(tmp,(unsigned char *)arg);
if(tmp > 0x7f)
tmp = 0x7f;
FPS_INDEX = FPS_DTR;
第 15 / 23页
FPS_DATA = tmp;
break;case FPS200_IOCSDCR:
ret = __get_user(tmp,(unsigned char *)arg);
if(tmp > 0x1f)
tmp = 0x1f;
FPS_INDEX = FPS_DCR;
FPS_DATA = tmp;
break;case FPS200_IOCSPGC:
ret = __get_user(tmp,(unsigned char *)arg);
if(tmp > 0x0f)
tmp = 0x0f;
FPS_INDEX = FPS_PGC;
FPS_DATA = tmp;
break;case FPS200_IOCGDTR:
FPS_INDEX = FPS_DTR;
tmp = FPS_DATA;
ret = __put_user(tmp,(unsigned char *)arg);
break;case FPS200_IOCGDCR:
FPS_INDEX = FPS_DCR;
tmp = FPS_DATA;
ret = __put_user(tmp,(unsigned char *)arg);
break;case FPS200_IOCGPGC:
FPS_INDEX = FPS_PGC;
tmp = FPS_DATA;
ret = __put_user(tmp,(unsigned char *)arg);
break;case FPS200_IOCEINT:
第 16 / 23页
enable_irq(FPS200_IRQ);
break;case FPS200_IOCDINT:
disable_irq(FPS200_IRQ);
break;case FPS200_IOCFCAP:
fps_get_image();case FPS200_IOCGDATA:
copy_to_user((void *)arg, fps200_device->data,FPS200_DATASIZE);
ret = 0;
fps200_device->flag = 0;
break;case FPS200_IOCCLR:
memset(fps200_device->data, 0, FPS200_DATASIZE);
fps200_device->flag = 0;
break;case FPS200_IOCCINT:
if(((clps_readw(INTSR1))&0x40)== 0)
{
udelay(100);
if(((clps_readw(INTSR1))&0x40)== 0)
ret = __put_user(0x01,(unsigned char *)arg);
else
ret = __put_user(0x0,(unsigned char *)arg);}
else
ret = __put_user(0x0,(unsigned char *)arg);
break;case FPS200_IOCCRDY:
ret = __put_user(fps200_device->flag,(unsigned char
*)arg);
第 17 / 23页
break;default: return-ENOTTY;} return ret;} static int __init fps200_init_module(void){ int result;char tmp;if((result = check_region(FPS200_VR,2))){ printk(“<1> can't get I/O port address n”);return(result);} if(!request_region(FPS200_VR,2,“fps200”))return-EBUSY;SET_MODULE_OWNER(&fps200_fops);result = register_chrdev(fps200_major, “fps200”,&fps200_fops);if(result < 0){ printk(“<1>fps200: can't get major %dn”,fps200_major);return result;} if(fps200_major == 0)fps200_major = result;
/* read chip id first, if not equal 0x20xx, print error*/ FPS_INDEX = FPS_CIDH;tmp = FPS_DATA;if(tmp!= 0x20){
第 18 / 23页
/* dynamic */ printk(“<1>wrong chip ID, insmod fail.n”);return-EIO;} /* row auto inc.inner 12MHz vibrator.no low-power state*/ FPS_INDEX = FPS_CTRLB;FPS_DATA =(FPS_CTRLB_AFDEN|FPS_CTRLB_AUTOINCEN|FPS_CTRLB_ENABLE);
/* 等待30us */ udelay(35);
// 使时延大于 30us
/* 中断 */ FPS_INDEX = FPS_ICR;FPS_DATA =(FPS_ICR_IE0|FPS_ICR_IT0_LEVEL);FPS_INDEX = FPS_THR;FPS_DATA =(FPS_THR_THV | FPS_THR_THC);
/* DTR, DCR, PGC */ FPS_INDEX = FPS_DTR;FPS_DATA = 0x23;FPS_INDEX = FPS_DCR;FPS_DATA = 0x1;FPS_INDEX = FPS_PGC;FPS_DATA = 0;
/* other initial */ FPS_INDEX = FPS_RAL;
// raw 地址
FPS_DATA = 0;FPS_INDEX = FPS_RAH;FPS_DATA = 0;FPS_INDEX = FPS_REL;FPS_DATA = 0;FPS_INDEX = FPS_REH;
第 19 / 23页 FPS_DATA = 0;FPS_INDEX = FPS_CAL;
// column 地址
FPS_DATA = 0;FPS_INDEX = FPS_CEL;FPS_DATA = 0;FPS_INDEX = FPS_CTRLC;FPS_DATA = 0;FPS_INDEX = FPS_CTRLA;FPS_DATA = 0;// clear FPS_CTRLA_AINSEL
if(result){ printk(“<1>can't get assigned irq.n”);return-EIO;} fps200_device = kmalloc(sizeof(FPS200_Dev), GFP_KERNEL);if(!fps200_device){ FPS_INDEX = FPS_CTRLB;FPS_DATA = 0;return-ENOMEM;} memset(fps200_device, 0, sizeof(FPS200_Dev));fps200_device->data = kmalloc(FPS200_DATASIZE, GFP_KERNEL);if(!fps200_device){ FPS_INDEX = FPS_CTRLB;FPS_DATA = 0;
第 20 / 23页
设置 irq */ /* kfree(fps200_device);return-ENOMEM;} memset(fps200_device->data, 0, FPS200_DATASIZE);
/* 设置 irq */ result = request_irq(FPS200_IRQ, fps200_interrupt, SA_INTERRUPT, “fps200”, NULL);return(0);} static void __exit fps200_cleanup_module(void){ kfree(fps200_device->data);kfree(fps200_device);FPS_INDEX = FPS_CTRLB;FPS_DATA = 0;release_region(FPS200_VR,2);free_irq(FPS200_IRQ, NULL);unregister_chrdev(fps200_major, “fps200”);} module_init(fps200_init_module);module_exit(fps200_cleanup_module);//main.c void main(void){ BYTE temp;WORD port = 1001;LocalMACAddr[0]=0x52;LocalMACAddr[1]=0x54;LocalMACAddr[2]=0x4c;LocalMACAddr[3]=0x30;LocalMACAddr[4]=0x2e;
第 21 / 23页 LocalMACAddr[5]=0x2f;LocalIPAddress = 0xc0a8020d;/* 本地地址192.168.2.14*/ ServerIPAddress = 0xc0a8020e;/* 目的地址192.168.2.13*/
/*初始化 */ SerialInitial();MemInitial();NetInInitial();RTLInitial();
Start8019();InterruptInitial();
// 建立一个ARP包
p[0] =0xff;p[1] =0xff;p[2] =0xff;p[3] = 0xff;p[4] = 0xff;p[5] = 0xff;p[6] = 0x52;p[7] =0x54;p[8] =0x4c;p[9] =0x30;p[10] =0x2e;p[11] =0x2f;p[12] = 0x08;p[13] = 0x06;p[14] = 0x00;p[15] = 0x01;p[16] = 0x08;p[17] = 0x00;p[18] = 0x06;
第 22 / 23页 p[19] = 0x04;p[20] = 0x00;p[21] = 0x01;
// 发送ARP包
RTLSendPacket(p,60);while(1);
#ifdef DEBUG printf(“n-------bigine-------”);#endif
/* 处理 */ TCPBind(port);if(TCPConnect(ServerIPAddress,1001)== TRUE){
while(UserFunc());}
/* 延时 */ for(temp;temp<255;temp++);#ifdef DEBUG printf(“n run over!”);#endif
/* 存储 */ Stop8019();while(1);}
第 23 / 23页
第三篇:基于ARM的IP网络电话系统设计.
海思工作室
杭州汇文教育咨询有限公司 ——VoIP电话方案投标书 海思工作室
海思工作室 VoIP电话方案投标书 目 录
一、公司介绍以及项目综述...........................................................................................................1 1.1 公司介绍..........................................................................................................................1 1.2 公司在本项目中的优势..................................................................................................2 1.3 VoIP简述.........................................................................................................................2
二、项目技术方案...........................................................................................................................3 2.1 系统框架..........................................................................................................................3 2.2 项目目标..........................................................................................................................4 2.2.1 系统实现基本功能...............................................................................................4 2.2.2 系统实现拓展功能...............................................................................................4 2.3 技术路线..........................................................................................................................4 2.3.1 VoIP电话基本传输过程......................................................................................4 2.3.2 VoIP电话的关键技术..........................................................................................5 2.3.3 嵌入式VoIP终端软件的设计和实现.................................................................6 2.4 使用与维护......................................................................................................................7 2.4.1 维护简介...............................................................................................................7 2.4.2 承诺与服务...........................................................................................................8
三、项目管理方案...........................................................................................................................8 3.1 项目计划成熟度..............................................................................................................8
3.1.1 整体管理...............................................................................................................8 3.1.2 沟通管理...............................................................................................................9 3.1.3 项目的状态周报制度.........................................................................................10 3.2 质量控制管理................................................................................................................10 3.2.1 质量基本规划.....................................................................................................10 3.2.2 质量保证.............................................................................................................11 3.2.3 质量检查.............................................................................................................11 3.3 配置管理........................................................................................................................11 3.4 风险控制........................................................................................................................11
四、项目实施.................................................................................................................................12 4.1 实施计划........................................................................................................................12 4.2 所需的资源列表............................................................................................................12 4.2.1 硬件资源.............................................................................................................12 4.2.2 人力资源.............................................................................................................13 4.2.3 软件资源.............................................................................................................13 4.3 项目报价........................................................................................................................13 Happy、Strive、Solidarity 0
海思工作室 VoIP电话方案投标书 VoIP电话方案投标书
首先,感谢杭州汇文教育咨询有限公司的关注,以及提供我们参与此次项目的机会,让我们工作室的学员们能够更好地积累实战经验,为踏上社会之路做充分的准备。冀望于此次接触机会及交流过程,能够成为中国计量学院和杭州汇文教育咨询有限公司打开双方合作之门的良好基石。
在调查和理解VoIP电话项目的目标,以及对VoIP电话相关背景分析的基础上,我们撰写本文。旨在向杭州汇文教育咨询有限公司介绍我们对此项目的思路及相关建议,且展示海思工作室在此次项目上的计划与执行能力。
一、公司介绍以及项目综述 1.1 公司介绍
本公司全称:海思工作室。公司成立于2010年3日12日,位于风景秀丽的西子湖畔。海思是HSS(Happy、Strive、Solidarity)的谐音,代表着快乐、奋斗以及团结的精神。海思的成员一致把这个作为心中的理念。
公司目前拥有12名人员,人员结构分配合理。其中包括CEO&PM、CTO&SE、PJM&CFO、人事执行经理、客户代表、软件工程师、测试工程师等。其中公司里的不少精英在电子领域方面取得了许多奖项,因此本公司擅长有关电子产品的开发,目前专业从事于一些嵌入式产品的技术研究和开发。公司设有两个技术团队,分别进行2个项目工程。团队成员各司其职,分工明确,工作严谨。公司成员从大一开始就已经学习掌握C语言知识,距今已近三年,因此底蕴深厚,对于C语言和嵌入式也是非常了解。部分成员在校期间曾获多次奖学金和各类奖项。我们竭尽所能把一切资源投在产品开发上,力求高效、质优、价廉、款佳。面对任何机遇与挑战,我们正以饱满的热情,坚定不移的信心,在嵌入式的道路上阔步前进。以一流的人才,一流的管理,一流的的服务,立足中国,面向世界,与您携手并肩,共创美好的明天。
我们的理想和目标是:生产出让客户满意的产品。Happy、Strive、Solidarity 1
海思工作室 VoIP电话方案投标书 1.2 VoIP简述
VoIP又称IP电话或IP网络电话,是Voice over IP的缩写。VoIP是建立在IP技术上的分组化、数字化语音传输技术。其基本原理是:通过语音压缩算法对语音数据进行压缩编码处理,然后把这些语音数据按IP等相关协议进行打包,经过IP网络把数据包传输到接收地,再把这些语音数据包串起来,经过解码解压处理后,恢复成原来的语音信号,从而达到由IP网络传送语音的目的。VoIP系统把传统电话的模拟信号转换成计算机可联入因特网传送的IP数据包,同时也将收到的IP数据包转换成声音的模拟电信号。作为ngn(下一代网络)中的重要组成部
分,VoIP是面向未来、可持续发展的语音解决方案,可以为商业和家庭用户提供质优价廉的IP语音服务。随着ngn网络技术的快速发展,VoIP的通信量也已得到快速增长,并以其低廉的价格优势迅速占有市场。VoIP最大的优势是能广泛地采用Internet和全球IP互连的环境,提供比传统业务更多、更好的服务。因此目前VoIP网络电话在市场上有很大的潜力可以挖掘。VoIP电话的特点:
带宽和设备的使用率高。通信费用低。易融于商业应用。
1.3 公司在本项目中的优势
在研发VoIP网络电话方面,我公司有着得天独厚的优势。不少成员在有关方面有着深入的研究并获得过许多奖项,并且我们有过开发类似此类项目的先例。此项目,在Linux下比较容易实现,而我公司成员对Linux上的一些操作比较熟悉。同时在配置S2440开发板内部设置方面,公司成员有比较强的设计能力。我们所有的成员都学过计算机网络和数据通信与网络课程等有关方面的课程,在制作VoIP网络电话方面有着丰富的经验,另外,我公司的CTO,他在电子竞赛方面取得了骄人的成绩,获得了学校的三等奖。他本人也对此项目有着很大的信心。因此在技术的运用上我公司有比较大的优势。此外,公司的一些成员同时还在参与另外一个类似的项目,客户完全可以对我们的操作能力放心。我们承诺用性价比高的材料制作项目,因此在质量方面客户可以完全放心。同时,我 Happy、Strive、Solidarity 2
们将对客户给出最适合的价位和周到的售后服务工作,尽一切可能满足客户,让客户满意。所以我们深信我们能够在这个项目比其他公司取得更理想的成果,令客户满意。
二、项目技术方案 2.1 系统框架
当一端的PC机通过软件形式的IP电话进行通话时,另一端可以是软件形式的IP电话,也可以是传统的电话。但是传统电话必须通过一个语音网关,来将数字信号转换成模拟信号。本方案是采用软件形式的IP电话进行通信。即通过两块开发板实现简单的通话。
系统环境框图如图1所示,其中应用服务器(Application server)是用来存放IP电话机的应用和配置文件,当一方的IP电话用户需要读取一些数据库中的信息时,就会到应用服务器中来查找。MCU(Multipoint Control Unit)是用
图1 系统环境框图 电话 Happy、Strive、Solidarity 3 海思工作室 VoIP电话方案投标书
2.2 项目目标
2.2.1 系统实现基本功能
1.输入对方的IP地址和自己希望对方看到自己的昵称。2.可以拨号、挂断、暂停、声音调整等功能。3.可以进行顺畅地通话。
4.可进行新用户的注册并把注册信息存储于服务器。2.2.2 系统实现拓展功能
1.PC端软件形式的IP电话拨打普通电话。2.客户端可对好友进行增、删、改、查操作。3.客户端可实现文本短信功能。4.客户端可实现来电显示功能。5.客户端之间可实现视频聊天。6.实现呼叫详细记录功能。7.实现多人同时通话。2.3 技术路线
2.3.1 VoIP电话基本传输过程
语音信号在IP网络上传送之前要经过从模拟信号到数字信号的转换、语音压缩算法对语音数据进行压缩编码处理、数字语音封装成IP数据报、IP数据报通过网络传送、IP分组解包、解码解压处理和数字语音还原到模拟信号等过程。整个过程如图2所示。
图2 VoIP的数据处理流程图 Happy、Strive、Solidarity 4
海思工作室 VoIP电话方案投标书 2.3.2 VoIP电话的关键技术
传统的IP网络主要是用来传输数据业务,采用的是尽力而为的、无连接的技术,因此没有服务质量保证,存在分组丢失、失序到达和时延抖动等情况。数据业务对此要求不高,但话音属于实时业务,对时序、时延等有严格的要求。因此必须采取特殊措施来保障一定的业务质量。VoIP电话的关键技术包括:信令技术、编码技术、实时传输技术以及网络传输技术等。信令技术
信令技术保证电话呼叫的顺利实现和语音质量,目前IP电话中比较流行的是H.323、会话发起协议(SIP)、MEGACO和MGCP。SIP是建立VoIP连接的IETF标准。SIP是一种应用层控制协议,用于和一个或多个参与者创建、修改和终止会话。SIP的结构与HTTP(客户-服务器协议)相似。客户机发出请求,并发送给服务器,服务器处理这些请求后给客户机发送一个响应。该请求与响应形成一次事务。本方案采用SIP协议。编码技术
话音压缩编码技术是VoIP电话技术的一个重要组成部分。目前,主要的编码技术有G.711、G.726、G.728、G.729、G.723.1、iLBC等。其中G.729可将经过采样的64kbit/s话音以几乎不失真的质量压缩至8kbit/s。由于在分组交换网络中,业务质量不能得到很好保证,因而需要话音的编码具有一定的灵活性,即编码速率、编码尺度的可变可适应性。G.729是8kbit/s的话音编码标准,现在的工作范围扩展至6.4~11.8kbit/s。G723.1采用5.3和6.3Kbit/s双速率话音编码,其话音质量好,但是处理时延较大,它是目前已标准化的最低速率的话音编码算法。G.711采用64kbit/sPCM语音编码技术,经过G.711编码后的语音已经可以在公共电话网上或PBX上作为数字语音传输。本方案选用G.711编码技术。实时传输技术
实时传输技术主要是采用实时传输协议RTP。RTP是提供端到端的包括音频在内的实时数据传送的协议。RTP包括数据和控制两部分,后者叫RTCP。RTP提供了时间标签和控制不同数据流同步特性的机制,可以让接收端重组发送端的数据包,可以提供接收端到多点发送组的服务质量反馈。Happy、Strive、Solidarity 5
海思工作室 VoIP电话方案投标书 服务质量(QoS)保证技术
VoIP电话中主要采用资源预留协议(RSVP)以及进行服务质量监控的实时传输控制协议RTCP来避免网络拥塞,保障通话质量。网络传输技术
VoIP电话中网络传输技术主要是TCP和UDP,此外还包括网关互联技术、路由选择技术、网络管理技术以及安全认证和计费技术等。由于实时传输协议RTP提供具有实时特征的、端到端的数据传输业务,因此VoIP电话中可用UDP和RTP来传送话音数据。在RTP报头中包含装载数据的标识符、序列号、时间以及传送监
视等,通常RTP协议数据单元是用UDP分组来承载,而且为了尽量减少时延,话音净荷通常都很短。IP、UDP和RTP报头都按最小长度计算。VoIP话音分组开销很大,采用RTP协议的VoIP电话格式,在这种方式中将多路话音插入话音数据段中,这样提高了传输效率。
此外,静音检测技术和回声消除技术也是VoIP电话中十分关键的技术。静音检测技术可有效剔除静默信号,从而使话音信号的占用带宽进一步降低到3.5kbit/s左右;回声消除技术主要利用数字滤波器技术来消除对通话质量影响很大回声干扰,保证通话质量。
2.3.3 嵌入式VoIP终端软件的设计和实现
嵌入式VoIP终端软件主要指系统层次结构中协议栈和用户程序两个层次。协议栈层担负SIP消息解析,UAS和UAC事务处理,多媒体流传输等任务。主要包括SIP模块、RTP模块和语音处理模块三个模块。SIP模块
系统选用了开源协议栈oSIP。oSIP主要包括三个模块:解析器模块、状态机模块和工具模块。解析器模块:该模块主要完成对SIP消息(INVITE、ACK、OPTIONS、CANCEL、BYE、REGISTER消息)结构剖析、SDP消息结构剖析以及URI结构的剖析。此外,该模块还可以解析一部分SIP头域。状态机模块:SIP中是以事务为单位来描述各种请求和响应的交互过程的。该模块主要完成对某个SIP事务(注册过程、呼叫过程等)状态的记录,并在特定状态下触发相应 Happy、Strive、Solidarity 6
海思工作室 VoIP电话方案投标书 的时间或回调函数。回调函数为上层应用程序控制SIP会话提供了丰富的接口。工具模块:该模块为可选项,主要提供一些处理SDP协商及会话等的一些工具。RTP模块
本系统的RTP模块采用开源的RTP协议栈oRTP,利用该协议栈可以较方便的实现对实时媒体的传输和控制,如对本地待发数据的RTP封装,对接收到的RTP包拆包以及通过对网络RTCP监测,适当的调整本地的编解码器策略。语音处理模块
语音处理模块的工作是完成语音信号的采集、编码、解码和回放,分为语音数据发送和语音数据接收两个部分。语音数据发送的过程为:通过编解码芯片完成语音信号的脉冲编码调制(PCM),将模拟信号转化成数字信号;采用选定的编码标
准对数字信号进行压缩编码;加上RTP头和其它头部字段,封装数据包送到UDP协议层传输,完成音频信号的发送。2.4 使用与维护 2.4.1 维护简介 软件系统的维护
提供每台机器操作系统的安装与配置,另外,还提供使用过程中的技术支持和应用培训工作。前者是每个软件项目都必须具备的,后者在实际操作中,管理人员的培训有利于系统的稳定运行。数据备份
数据备份工作的关键是制度的建立,除了技术上的要求外,数据备份的流程、所使用的介质、备份的周期、档案的管理等都必须形成一整套的制度和规定。人员培训
系统的使用和管理是否恰当,直接影响系统运行的稳定性。因此系统维护工作还包括对管理人员、使用人员的培训。培训应针对不同对象采用不同的培训方法和内容,其目的是让管理人员能及时发现问题,排除简单故障;使用人员能按操作流程和规章使用网络。Happy、Strive、Solidarity 7
海思工作室 VoIP电话方案投标书 2.4.2 承诺与服务 文档提供承诺
项目系统在开发、安装、发布后,并且经过客户验收后,向客户提交符合国家软件开发标准的有关文档。文档清单如下: 《项目需求文档》 《用户使用手册》 《客户培训文档》 维护承诺
项目系统在开发、安装、发布后: 第一年提供免费维护支持。第二年开始有偿维护支持。系统安装
项目系统在开发完成后,在硬件到位的前提下负责软件的安装调试。安装承诺:免费提供系统安装、使用、技术培训和维护的资料及介质。服务响应承诺 无论软件发生何种故障(不可抗拒因素及自然灾害出外),我们承诺在4 小时内做出反应,24小时内完成修复。平时提供7*24小时的技术支持承诺。
三、项目管理方案 3.1 项目计划成熟度 3.1.1 整体管理
项目的整体管理是做一个项目之前一个比较重要的过程,它包括了项目计划的制定和项目计划的执行。在项目的计划制定中,我们小组每个人都行动起来,去找资料,整体的了解这个项目,把一些有关的信息都罗列出来,然后大家一起再进行刷选、一起讨论,把整体的一个思路搞清楚。Happy、Strive、Solidarity 8
海思工作室 VoIP电话方案投标书 3.1.2 沟通管理 项目会议制定(1)定期的会议
会议的目标:沟通项目状态,提出项目问题、风险和依赖条件;协调项目资源; 对项目提出建议,问题的解决方法,行动计划。会议的时间:每周周日下午6点。
参加人员:甲乙两方的项目经理,和各自项目经理制定的几个工作人员。
主要内容:更新项目状态,包括:项目的状态信息,时间进度表;问题,风险,技术和管理;对提出的问题的讨论和决定计划;甲乙双方做会议记录,并讨论下一步行动计划。(2)不定期的会议
会议的目标:使项目全体人员明确目前项目的状态、问题、解决方法。会议的时间:根据实际情况需要确定。
参加人员:全体项目人员。
会议内容:项目状态,存在的问题及解决方法;下阶段项目计划。(3)重大问题汇报会议
会议的目标:汇报项目进行中发现的重大问题,讨论并决定采取的方案。会议的时间:出现重大情况时。
参加人员:问题发起人,全体的项目人员。
会议的内容:汇报项目出现的重大问题,找出解决方案,制定计划。(4)项目内部讨论
会议的目标:对项目组内部遇到的问题进行讨论,找出解决方案,并讨论决定采 取何行动。
会议的时间:根据开发的进程和状态。参加人员:所有有关该项目的人员。
会议内容:讨论出现的各种相关问题,找出解决方案,决定行动计划。沟通手段(1)开会或直接交谈
Happy、Strive、Solidarity 9
海思工作室 VoIP电话方案投标书
按需要组织会议进行沟通,或直接找相关的人进行讨论,注意记录沟通和讨论结果,重要问题讨论必须有书面会议记录。(2)电话或电话会议
通过电话的方式进行信息沟通。对比较重要的事情,需要包括开发地点以外的人员,则需要利用电话会议的方式进行讨论,沟通。(3)电子邮件
建立项目组电子邮件系统及与外界联系的电子邮件系统。3.1.3 项目的状态周报制度
项目的各组人员每周写下周报,包括的内容:上一周所完成的内容,这周计划将要完成的内容。每一组统一上交到已方的项目经理处,再有乙方项目经理在每周的定期会议上提交给甲方的项目经理。甲方项目经理根据周报情况,做总结形成项目组的状态周报,记录在案。3.2 质量控制管理 3.2.1 质量基本规划
(1)质量目标:针对VoIP电话,保证100%的满足项目的需求,并做到正确性和精确性,用户满意度达90%以上,甲乙双方应针对项目的质量目标进行质量管理。
(2)质量管理原则: 1客户满足优先。○ 2开发人员的责任。○ 3持续的改进。○ 4可进行维护的。○
(3)质量保证计划:合同生效后,甲乙双方应在质量方针、质量目标、质量原则及项目范围等的前提下建立质量保证计划,明确相关干系人质量管理职责、项目质量管理任务的定义与责任人、需遵守的制度、规程、规范与标准、质量控制的方法、工具、记录与跟踪等,便以此为基础,有效地开展质量管理活动。(4)测试要求:在初步的测试当中,产品通过甲乙双方的认同。在进一步的改 Happy、Strive、Solidarity 10
海思工作室 VoIP电话方案投标书 进后,要通过评审及试用户的肯定。3.2.2 质量保证
(1)规则的指导:双方项目经理组织各自的项目人员做有关制度、规程、标准等等的指导。
(2)文档的管理:每期的文档要有统一且有序的文档标号,所有的文档必须经项目经理或质量保证人员的审核通过,正式提交件必须经过相关评审认可。双方必须明确文档的存储人员。
(3)问题跟踪:乙方负责指定专人对项目实施过程中出现的问题与缺陷进行跟踪解决,每周出具相关统计信息。
(4)质量汇报:双方项目经理应本着实事求是的原则,向双方管理层及时准确地汇报项目情况,保证项目的可视性。3.2.3 质量检查
甲乙双方应就项目进展情况定期进行质量检查工作,保证项目按既定计划,保证质量地实施。乙方应配合甲方有关项目管理部门进行质量检查,并及时根据检查结果,进行跟踪解决。3.3 配置管理
配置库分为文档库和代码库。文档库管理项目的所有有关文档,代码库就管理项目中的所有代码。配置库按照项目的进行阶段,有序的存放。经测试和审核,配
置库统一由甲方管理,不得向任何无关人员透露,也不得对任何项进行任何的更改。
3.4 风险控制
做什么项目都存在风险,所以我们不保证一定不存在风险,但尽可能的把风险降至最低。我们的目标是实现项目的需求,但对我们而言,刚接受做一个项目,可以说存在难度,不管是技术上,还是管理上…我们尽自己最大的努力去完成它。当我们发现问题及时的讨论并找出解决方案,从自个方面寻找资料、信息,每一次都进行组内沟通和交流,力争把项目做的好,降低项目的风险程度。Happy、Strive、Solidarity 11
海思工作室 VoIP电话方案投标书
四、项目实施 4.1 实施计划
详见附件:VoIP.mpp。4.2 所需的资源列表 4.2.1 硬件资源
1、两块 S2440 嵌入式开发板
(1)S3C2440A:32bit ARM920T内核,标称工作频率:400MHz(2)系统时钟:内部PLL产生400MHz CPU内核工作频率,外部总线频率:100~133MHz(3)100MHz以太网控制器(4)音频输入输出接口(5)触摸屏(6)5V电源
Happy、Strive、Solidarity 12
海思工作室 VoIP电话方案投标书
(7)支持的操作系统:WINCE /Linux
2、PC机(1)CPU(2)内存
(3)硬盘
(4)网卡:普通以太网卡一块或无线以太网卡一块(IEEE 802.11g、IEEE 802.11b网络标准)(5)显示器
(6)普通键盘/鼠标一个
3、两个摄像头
4、两个耳麦(耳机+麦克)
5、两根网线 4.2.2 人力资源
1、相关专业的研发人员
2、资深专家的技术指导(如有需要)
3、检测人员 4.2.3 软件资源
1、LINUX系统开发平台
2、语音压缩编码、语音解码
3、视频压缩编码、视频解码
4、INTERNET接入环境
4.3 项目报价
Happy、Strive、Solidarity 13
海思工作室 VoIP电话方案投标书 Happy、Strive、Solidarity 14
第四篇:嵌入式系统ARM实验报告
南京邮电大学通信与信息工程学院
实验报告
实验名称:实验一基于ADS开发环境的设计
实验二嵌入式Linux交叉开发环境的建立 实验三嵌入式Linux环境下的程序设计
课程名称嵌入式系统B
班级学号B13010711 姓名马俊民
开课时间 2015/2016学年第1学期
实验一基于ADS开发环境的程序设计
一、实验目的
1、学习ADS开发环境的使用;
2、学习和掌握ADS环境下的汇编语言及C语言程序设计;
3、学习和掌握汇编语言及C语言的混合编程方法。
二、实验内容
1、编写和调试汇编语言程序;
2、编写和调试C语言程序;
3、编写和调试汇编语言及C语言的混合程序;
4、编写程序测试多寄存器传送指令的用法。
三、实验原理
ADS全称为ARM Developer Suite,是ARM公司推出的新一代ARM集成开发工具。现在常用的ADS版本是ADS1.2,它取代了早期的ADS1.1和ADS1.0。
ADS用于无操作系统的ARM系统开发,是对裸机(可理解成一个高级单片机)的开发。ADS具有极佳的测试环境和良好的侦错功能,它可使硬件开发工作者更深入地从底层去理解ARM处理器的工作原理和操作方法,为日后自行设计打基础,为BootLoader的编写和调试打基础。
1.ADS软件的组成
ADS由命令行开发工具、ARM运行时库、GUI开发环境(CodeWarrior和AXD)、实用程序、支持软件等组成。
2.GUI开发环境
ADS GUI开发环境包含CodeWarrior和AXD两种,其中Code Warrior是集成开发工具,而AXD是调试工具。
使用汇编语言进行编程简单、方便,适用于初始化硬件代码、启动代码等。汇编语言具有一些相同的基本特征:
1.一条指令一行。
2.使用标号(label)给内存单元提供名称,从第一列开始书写。3.指令必须从第二列或能区分标号的地方开始书写。4.注释必须跟在指定的注释字符后面,一直书写到行尾。
在ARM汇编程序中,每个段必须以AREA作为段的开始,以碰到下一个AREA作为该段的结束,段名必须唯一。程序的开始和结束需以ENTRY和END来标识。嵌入式C语言设计是利用基本的C语言知识,面向嵌入式工程实际应用进行程序设计。为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序之间的调用规定一定的规则。ATPCS就是ARM程序和Thumb程序中子程序调用的基本规则。
四、实验过程与关键代码分析
1.创建项目工程
在File菜单中选择New命令,打开一个新建工程对话框。在Project选项卡下,选择ARM Executable Image, 然后在Project name文本框里输入项目名称,点击确定。弹出工程窗口。
选择File菜单中的New命令,选择File标签页,在File name文本框中输入要创建的文件名。汇编程序以.s结尾,c程序以.c结尾。在Location文本框中指定文件的存放位置,选中Add to Project,在Targets中选中DebugRel,单击确定关闭窗口。
2.用汇编语言设计程序实现10的阶乘
AREA EXAMPLE, CODE, READONLY ENTRY start MOV R0, #10 MOV R1, #1 LOOP MUL R0, R0, R1 SUB R0, R0, 1 CMP R0, #1 BHI LOOP END 在这个程序中,我们首先对R0和R1赋值,将R0作为一个变量,而R1作为一个存贮阶乘值的寄存器。在每进行一次乘法之后,将R0减1。同时在做完减法后进行判断,如果此时R0大于1,则返回继续乘法,否则结束程序,输出结果。
3.用调用子程序的方法实现1!+2!+3!+„+10!,代码如下: asmp.s
AREA JC, CODE, READONLY
EXPORT JCP
ENTRY JCP
ADD R3, R0, #1
MOV R2, #1
MOV R1, #1 LOOP MUL R0, R1, R2
MOV R1, R0
ADD R2, R2, #1
CMP R2, R3
BNE LOOP
NOP
NOP
MOV PC, LR
END
PROGC.c #include
int main(){ int res=0;int m=10;int i;for(i=1;i<=m;i++)
res=res+JCP(i);printf(“The result =%dn”,res);return 0;} 在这个程序中,主程序由c语言完成作求和,子程序由汇编语言写成作阶乘。
5.实现字符串的逆序复制TEXT1=“HELLO”=>TEXT2=“OLLEH”
AREA invstring, CODE, READONLY start
ADR R1,TEXT1
ADR R2,TEXT2
MOV R3, #0 LOOP
LDRB R0,[R1], #1
ADD R3,R3,#1
CMP R0,#0
BNE LOOP
SUB R1,R1,#2
LOOP1
LDRB R0,[R1], #-1
STRB R0,[R2], #1
SUB R3,R3, #1
CMP R3,#1
BNE LOOP1
MOV R5,#&55
TEXT1
TEXT2 NOP =“HELLO”,0 ALIGN =“OELLH” END
五、实验小结
在这次实验中,学会了如何使用汇编程序进行编程。对汇编程序编程一些基本的要求有了一定的了解,学习了C语言的语法和在其中调用汇编程序的方法。学会了利用CodeWarrior IDE开发C和ARM汇编代码。学会了在AXD中进行代码调试的方法和过程,对AXD的调试有初步的了解。,实验二嵌入式Linux交叉开发环境的建立
一、实验目的
1、掌握嵌入式Linux交叉开发环境的建立方法
2、学习和掌握Linux常用命令
3、学习和掌握vi编辑器的使用
二、实验内容
1、搭建嵌入式Linux交叉开发环境
2、熟悉Linux的常用命令
3、熟悉vi编辑器的常用命令
三、实验原理
Linux系统是UNIX系统的分支,是UNIX的微机版。Linux具有异常丰富的驱动程序资源,支持各种主流的硬件设备与技术。Linux包含了现代的UNIX操作系统的所有功能特性,这些功能包括多任务、虚拟内存、虚拟文件系统、进程间通信、对称所处理器、多用户支持等。
Vi编辑器是所有UNIX和Linux下的标准编辑器。它包含3种工作模式。嵌入式系统是专用的计算机系统,它对系统的功能、可靠性、成本、体积、功耗等有严格的要求。大部分嵌入式系统没有大容量存储设备,一般不能安装大型开发软件,系统的开发需要采用交叉开发模式。
四、实验过程与关键代码分析
实验用的是UP-NetARM2410-S试验箱,里面配有三星的芯片S3c2410X。打开电脑上VMWare软件,在Windows系统下启动虚拟机里的Linux系统。接着需要
1.宿主机的环境搭建
下载并运行VMWare,根据向导创建一台新虚拟机并选择Linux作为客户操作系统,再根据向导安装RedHat Linux 9.0。
2.虚拟机中启动Linux操作系统
使用root登陆,用户名为root,密码为123456。之后对共享文件设置进行调整:打开settings界面,打开shared folders功能,同时将路径设置到有课前下载的软件的目录下。
3.开发工具软件的安装(1)安装gcc 打开Linux后,打开终端窗口,在共享的目录下找到install.sh并运行,命令如下: ls./ install.sh 安装程序将自动建立/arm2410s目录,并将所有的开发软件包安装到/arm2410s 目录下,同时自动配置编译环境,建立合适的符号链接。安装完成后在目录/opt/host/armv4l/bin/下应该能看到主编译器。(2)配置PATH路径
vi.bash.profile 将里面PATH变量改为PATH=$PATH:$HOME/bin:/opt/host/armv41/bin/;存盘后执行
source.bash_profile 以后armv4l-unknown-linux-gcc将被自动搜索到
4.宿主机上的开发环境配置(1)配置IP地址
ifconfig eth0 192.168.0.121 命令配置了宿主机的IP地址。然后打开网络配置窗口,重新探测MAC地址。重新激活。(2)关闭防火墙
单击“Red”菜单→“系统设置”→“安全级别”→打开“安全级别配置”窗口,选择“无防火墙选项。”(3)配置NFS。
单击“Red”菜单→“系统设置”→“服务器设置”→“服务”,在“服务配置”窗口中勾选nfs,单击“开始”(4)NFS设置
单击“Red”菜单→“系统设置”→“服务器设置”→“NFS服务器”,打开“NFS服务器配置”窗口,设置NFS共享。
然后在NFS服务器中增加主机IP地址的链接许可和目录。完成配置。
5.目标机的信息输出
Windows系统下,“开始”→“所有程序”→“附件”→“通讯”→“超级终端”,新建一个通信终端。区号、电话号码随意输入。设置每秒位数为“115200”,数据位为“8”,无奇偶校验,停止位为“1”,无数据流控制。单击“确定”。
6.程序的运行
打开超级终端,启动Linux,屏幕显示:
[/mnt/yaffs] 在超级终端上执行挂载命令:
[/mnt] mount –t nfs 192.168.0.121:/arm2410s /mnt/nfs 挂载成功后可执行程序。
五、实验小结
在这次实验中,学会建立Linux交叉开发环境,学会了ls和vi,cd等常用的Linux命令,并掌握了Vi编辑器的使用方法。同时知道了如何在搭建失败时寻找错误进行排错。
实验三嵌入式Linux环境下的程序设计
一、实验目的
1、掌握嵌入式Linux环境下的程序设计方法
2、学会编写Makefile文件
二、实验内容
1、熟悉嵌入式教学实验箱的使用
2、编写C程序和Makefile文件
3、编译程序产生可执行程序
4、完成主机的挂载和程序的执行
三、实验原理
在嵌入式Linux环境下的程序设计方法有一下几个步骤:
1.编写源程序
2.编写Makefile文件 3.编译程序
4.运行和调试程序
5.将生产的可执行文件加入文件系统。
前三个步骤在宿主机上完成,后面的步骤在目标机上完成。
四、实验过程与关键代码分析
1.建立工作目录
mkdir hello cd hello
2.编写源程序
用vi编辑器编辑Hello.c文件
vi Hello.c 在Vi中输入源程序如下:
#include
printf(“hello world n”);}
3.编写Makefile文件
vi Makefile 在vi中编辑Makefile文件如下:
CC= armv4l-unknown-linux-gcc EXEC = hello OBJS = hello.o CFLAGS += LDFLAGS+=-static all: $(EXEC)$(EXEC):(OBJS)$(CC)$(LDFLAGS)–o $@ $(OBJS)clean:
-rm –f $(EXEC)*.elf *.gdb *.o
4.编译程序
在hello目录下运行“make”来编译程序。
make clean
make 编译成功后,生成可执行文件Hello.o。
5.下载调试
在宿主机上启动nfs服务,并将/arms2410s设置为共享目录。接下来启动超级终端,建立通讯,挂载。
[/mnt] mount –t nfs 192.168.0.121:/arm2410s /mnt/nfs 挂载成功后,进入/mnt/nfs,再进入/mnt/nfs/hello,直接运行刚刚编译生成的可执行文件Hello.o,查看运行结果
cd hello./hello 可以看见“Hello world”
只需要挂载一次便可,只要实验箱没有重启,就可以一直保持连接。反复修改、编译、调试,直至程序调试通过。
6.可执行文件加入文件系统
程序调试通过后,可以把可执行文件拖放到usr/bin目录下,然后使用mkcramfs制作工具生成新的文件系统。当系统启动后,就可以在相应目录下执行可执行程序hello.五、实验小结 在这次实验中,学会了在嵌入式Linux环境下设计程序。同时知道了如何对目标机进行挂载。以及如何在发现挂载不成功寻找错误进行修改。另外在编译文件时需要注意的也都有所了解。
实验四多线程程序设计
一、实验目的1、2、二、实验内容1、2、3、4、三、实验原理
四、实验过程与关键代码分析
五、实验小结
3+
第五篇:门禁系统管理制度
长春农村商业银行股份有限公司
门禁系统管理制度
第一章 总则
第一条
为规范长春农村商业银行股份有限公司(以下简称“本行”)安全保卫工作,有效防止盗窃、抢劫、诈骗、破坏和治安灾害事故,维护正常的工作秩序,根据公安部、中国人民银行、银监部门的有关要求,结合本行实际,本行特安装了门禁管理系统。
第二条
本行门禁管理系统属感应式卡出入管理控制系统(简称门禁系统),具有对门户出入控制、实时监控、保安防盗报警等多种功能,它主要方便内部员工或住户出入,杜绝外来人员随意进出,既方便了内部管理,又增强了内部的保安。
第二章 门禁系统管理人员
第三条
本办法所称门禁系统管理人员,是指总行科技部门禁系统专门管理人员。系统管理人员应当遵纪守法、政治过硬、业务精通、恪尽职守。违反国家法律、法规和受到行政处分的人员,不得从事系统管理工作。系统管理人员变动,应向上级科技管理部门备案。系统管理人员应定期接受政治思想教育、职业道德教育、安全保密教育。第三章 门禁信息数据管理权限分配
第四条
门禁管理系统由科技部专人管理权限 第五条
门禁卡是实名发卡制,根据各部门的需求实际情况,有人事部门,安全保卫部门监督发卡。(详情见门禁卡管理制度)
第六条
门禁系统由科技部分为专人管理,设置AB岗。门禁卡权限由各部门经理签发,由人事部门,安全保卫部门监督,科技部发卡。
第四章
门禁系统使用情况记录及管理
第七条
门禁系统在实时监控界面可以实时的显示出当前门禁工作的情况,包括成员进出信息、门状态、报警信息。门禁系统的监控流水记录,保留三个月。(详见OCS7.1门禁系统说明书)
第八条
主要有三大部分组成:文字监控、紧急门区、电子图监控。
(一)文字监控:以文字的形式实时显示监控记录,包括:刷卡信息(含进/出信息)、门状态信息、紧急信息。
(二)紧急门区:通过设置可以对相应门区下的所有房门进行紧急开/关门、紧急取消等操作。
(三)电子图监控:以电子图的形式实时显示监控信息,并可以对房门进行相应的控制管理。
第五章 门禁系统控制及应急措施 第九条
门禁监控
门禁系统有可以实现实时监控。(详见OCS7.1门禁系统说明书),第十条
门禁系统中常用报警参数有:火警、防盗、强行进入、门超时报警、水位检测报警、煤气检测报警、防撬报警、读卡机断网。
(一)火警、防盗、水位检测、煤气检测报警:在门禁系统中提供了报警信息的接口,需要外围设备的支持,门禁控制器接收到外围检测设备产生的信号,控制器响应这个触发信号后,马上进行处理。例如产生火警后,控制器会自动开门,防盗警会自动关门等。设置:控制器内置8个TTL输入点,在软件中把相应的输入点设置为对应的报警功能即可。
(二)读卡器断网报警:当读卡器和门禁控制器失去联系,控制器会发生报警,红色指示
灯闪烁,同时软件监控时会发出警示,提醒操作员及时处理。
(三)门超时报警,需要安装门磁设备,如果在设置的时间内,房门没有关上,控制器就会产生报警,红色指示灯闪烁,同时软件监控时会发出警示,提醒操作员及时处理。
第六章、附则
第十一条 本办法由长春农村商业银行股份有限公司负责制订、解释和修改。第十二条 本办法自发布之日起执行