第一篇:基于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的指紋識別門禁系統設計_圖文.
課程設計任務書
學生姓名: 廖年強 專業班級: 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的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輸入點,在軟件中把相應的輸入點設置為對應的報警功能即可。
(二)讀卡器斷網報警:當讀卡器和門禁控制器失去聯系,控制器會發生報警,紅色指示
燈閃爍,同時軟件監控時會發出警示,提醒操作員及時處理。
(三)門超時報警,需要安裝門磁設備,如果在設置的時間內,房門沒有關上,控制器就會產生報警,紅色指示燈閃爍,同時軟件監控時會發出警示,提醒操作員及時處理。
第六章、附則
第十一條 本辦法由長春農村商業銀行股份有限公司負責制訂、解釋和修改。第十二條 本辦法自發布之日起執行