版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
湖南工業(yè)大學課程設(shè)計資料袋計算機與通信學院學院〔系、部〕2023~2023學年第1學期課程名稱嵌入式系統(tǒng)根底及應(yīng)用指導教師職稱學生姓名專業(yè)班級學號題目嵌入式計算器的設(shè)計成績起止日期2023年11月21日~2023年11月27日目錄清單序號材料名稱資料數(shù)量備注1課程設(shè)計任務(wù)書12課程設(shè)計說明書13456湖南工業(yè)大學課程設(shè)計任務(wù)書2023—2023學年第1學期計算機與通信學院學院〔系、部〕通信工程專業(yè)班級課程名稱:綜合課程設(shè)計設(shè)計題目:嵌入式計算器的設(shè)計完成期限:自2023年11月21日至2023年11月27日共1周內(nèi)容及任務(wù)一、設(shè)計的主要技術(shù)參數(shù)利用PXA270-RP實驗箱上的小鍵盤實現(xiàn)嵌入式計算器。實現(xiàn)加減乘除運算,通過PXA270-RP實驗箱嵌入式linux的終端顯示表達式,如“12×3=36〞。二、設(shè)計任務(wù)基于嵌入式Linux平臺PXA270-RP設(shè)計小鍵盤驅(qū)動程序。編寫相應(yīng)的應(yīng)用程序?qū)崿F(xiàn)簡單的計算器。三、設(shè)計工作量一周進度安排起止日期工作內(nèi)容查閱課題相關(guān)資料制定課題實施方案編寫相關(guān)程序代碼調(diào)試課題辯論主要參考資料孫媛.嵌入式系統(tǒng)根底及應(yīng)用.機械工業(yè)出版社宋寶華.Linux設(shè)備驅(qū)動開發(fā)詳解.人民郵電出版社OURS.PXA270-RP實驗平臺Linux實驗指導書指導教師〔簽字〕:年月日系〔教研室〕主任〔簽字〕:年月日嵌入式系統(tǒng)根底及應(yīng)用設(shè)計說明書嵌入式計算器的設(shè)計起止日期:2023年11月21日至2023年11月27日學生姓名班級學號成績指導教師(簽字)計算機與通信學院2023年11月27日課題名稱嵌入式計算器的設(shè)計人數(shù)組長同組人員課題的主要內(nèi)容和要求主要要求:完成各局部功能的構(gòu)建;完成各局部程序的設(shè)計;3、完成各項性能測試以及聯(lián)合性能的測試。主要內(nèi)容:構(gòu)建嵌入式計算器的整體概念,了解操作系統(tǒng)的引導程序以及裝載原理,了解鍵盤掃描的原理以及理解運算的相應(yīng)處理過程,屢次調(diào)試驅(qū)動程序和應(yīng)用程序,最終完成計算器的設(shè)計。具體任務(wù)時間安排與完成情況11月21日分組、任務(wù)分配、課題理解11月22日-11月24日功能分析、設(shè)計程序11月25日-11月26日實驗驗證和測試,及校正修改,指導老師檢查11月27日整理程序,總結(jié)課題內(nèi)容,書寫課程設(shè)計報告一、設(shè)計概要計算器一般是指“電子計算器〞,是能進行數(shù)學運算的手持機器,擁有集成電路芯片,但結(jié)構(gòu)簡單比現(xiàn)代電腦結(jié)構(gòu)簡單得多,可以說是第一代的電子計算機〔電腦〕,且功能也較弱,但較為方便與廉價,可廣泛運用于商業(yè)交易中,是必備的辦公用品之一。本課程設(shè)計利用OURS-PXA270RP嵌入式實驗開發(fā)系實現(xiàn)簡易的計算器功能,主要用到的模塊有矩陣鍵盤。二、矩陣鍵盤電路圖:三、根本原理:PXA矩陣鍵盤原理圖:矩陣鍵盤的按鍵按N行M列排列,每個按鍵占據(jù)行列的一個交點,需要的I/O口數(shù)目是N+M,容許的最大按鍵數(shù)是N*M,矩陣鍵盤可以減少與微機接口的連線數(shù),簡化結(jié)構(gòu),是一般微機常用的鍵盤結(jié)構(gòu)。根據(jù)矩陣鍵盤的識鍵和譯鍵方法的不同,矩陣鍵盤又可以分為非編碼鍵盤和編碼鍵盤兩種。非編碼鍵盤:非編碼鍵盤主要用軟件的方法識鍵合譯鍵。編碼鍵盤:主要用硬件來實現(xiàn)鍵的掃描和識別,通常使用8279專用接口芯片,在硬件上要求較高。PXA270RP采用的是4*6的矩陣鍵盤鍵盤掃描程序流程圖:四、設(shè)計步驟與過程1、宿主機Linux環(huán)境的搭建:先在虛擬機下安裝RedHat9的安裝,建立宿主機開發(fā)環(huán)境,并且配置好ARMLinux的開發(fā)環(huán)境,2、配置宿主機下的minicom:minicom作為PXA270目標板的終端顯示窗口,所以在我們開始實驗前,先需要正確的配置minicom,翻開宿主機端一個終端窗口,點擊相關(guān)圖標啟動終端窗口,輸入minicom–s命令,顯示如下列圖所示3、TFTP配置:在宿主機PC機端,翻開一個終端窗口,點擊啟動終端窗口,輸入一條命令指令setup進入設(shè)置界面后,通過鍵盤上下選擇Systemservices,回車后,使用空格鍵將tftp一項選中,并使用空格鍵去掉ipchains和iptables兩項效勞,單擊鍵盤Tab鍵選中OK退出到設(shè)置主界面。再在一個終端窗口中輸入命令servicexinetdrestart以啟動TFTP效勞,再通過相關(guān)命令配置好IP地址4、燒寫各局部到目標板:通過JFLASH燒寫B(tài)ootLoader到目標板上,燒寫成功后,確認宿主機PC機的tftp效勞,minicom設(shè)置及IP地址都已經(jīng)正常配置,接下來要下載并燒寫的內(nèi)核、文件系統(tǒng)都拷貝到/tftpboot目錄中,分別是zImage、xscale_fs.jffs2、junk.jffs2三個文件。5、鍵盤驅(qū)動程序設(shè)計:在宿主機上,編寫鍵盤驅(qū)動程序,在中斷函數(shù)中采用鍵盤掃描的方法,使用阻塞模式的方法實現(xiàn)的,當沒有鍵按下時,就進行阻塞,當有鍵盤按下時就喚醒ssize_tSIMPLE_INT_read(structfile*file,char*buf,size_tcount,loff_t*f_ops)函數(shù),再將字符數(shù)據(jù)從內(nèi)核空間copy到用戶空間,再進行計算相關(guān)計算的操作。然后將驅(qū)動程序通過insmod加載到linux中去。6、應(yīng)用程序的設(shè)計:在宿主機上,編寫應(yīng)用程序,調(diào)用open函數(shù)翻開鍵盤驅(qū)動,并為它分配一個字符設(shè)備號,然后通過read函數(shù)將字符數(shù)據(jù)復(fù)制到應(yīng)用程序的應(yīng)用空間中,并且將這些字符數(shù)據(jù)轉(zhuǎn)換為數(shù)字數(shù)據(jù),在將它調(diào)用相關(guān)的運算計算出相關(guān)的操作。五、心得體會源程序:驅(qū)動程序:#include<linux/kernel.h>#include<linux/sched.h>#include<linux/timer.h>#include<linux/init.h>#include<linux/devfs_fs_kernel.h>#include<linux/module.h>#include<asm/hardware.h>#include<asm/arch-pxa/irqs.h>#include<asm/io.h>#include<asm/uaccess.h>#include<linux/delay.h>//HELLODEVICEMAJOR#defineSIMPLE_INT_MAJOR104//#defineSIMPLE_INT_IRQ 196#defineSIMPLE_INT_IRQ MAINSTONE_USIM_IRQ//#defineOURS_HELLO_DEBUG#defineVERSION"PXA270RP-key-V1.00-090214"#defineMY_KEY_NUM 0x11#defineMY_KEY_ENT 0x12#defineMY_KEY_ADD0x13#defineMY_KEY_SUB0x14#defineMY_KEY_MUL0x15#defineMY_KEY_DIV0x16#defineMY_KEY_DOT0x17#defineMY_KEY_NO00x00#defineMY_KEY_NO10x01#defineMY_KEY_NO20x02#defineMY_KEY_NO30x03#defineMY_KEY_NO40x04#defineMY_KEY_NO50x05#defineMY_KEY_NO60x06#defineMY_KEY_NO70x07#defineMY_KEY_NO80x08#defineMY_KEY_NO90x09staticlong*ioremap_addr;voidshowversion(void){printk("*********************************************\n");printk("\t%s\t\n",VERSION);printk("*********************************************\n\n");}static intSimpleINT_temp_count=0;staticstructsemaphoresem;staticwait_queue_head_toutq;staticintflag=0;staticcharvalues[1];//-------------------READ------------------------ssize_tSIMPLE_INT_read(structfile*file,char*buf,size_tcount,loff_t*f_ops){//longtmp;chartmp[1];ioremap_addr=ioremap(0x0c010000,0x0f);//KEYBOARDtmp[0]=inw(ioremap_addr);//printk("keyvalue=%x\n",tmp);copy_to_user(buf,tmp,1); #ifdefOURS_HELLO_DEBUG printk("SIMPLE_INT_read[--kernel--]\n"); #endifif(wait_event_interruptible(outq,flag!=0)){return0;}if(down_interruptible(&sem)){return0;}flag=0;if(copy_to_user(buf,values,1)){up(&sem);return0;}up(&sem); returncount;}//-------------------WRITE-----------------------ssize_tSIMPLE_INT_write(structfile*file,constchar*buf,size_tcount,loff_t*f_ops){ #ifdefOURS_HELLO_DEBUG printk("SIMPLE_INT_write[--kernel--]\n");#endifreturncount;}//-------------------IOCTL-----------------------ssize_tSIMPLE_INT_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongdata){ #ifdefOURS_HELLO_DEBUG printk("SIMPLE_INT_ioctl[--kernel--]\n");#endif return0; }//-------------------OPEN------------------------ssize_tSIMPLE_INT_open(structinode*inode,structfile*file){ #ifdefOURS_HELLO_DEBUG printk("SIMPLE_INT_open[--kernel--]\n");#endif MOD_INC_USE_COUNT; return0;}//-------------------RELEASE/CLOSE---------------ssize_tSIMPLE_INT_release(structinode*inode,structfile*file){ #ifdefOURS_HELLO_DEBUG printk("SIMPLE_INT_release[--kernel--]\n");#endif free_irq(SIMPLE_INT_IRQ,NULL); MOD_DEC_USE_COUNT; return0;}staticvoidSIMPLE_INT_interrupt(intnr,void*devid,structpt_regs*regs){inttmp;inttmp1;intret_byte;SimpleINT_temp_count++;tmp=inb(ioremap_addr);tmp1=inb(ioremap(0x0c010004,0x0f));//printk("---------%x\t",inb(ioremap(0x0c010004,0x0f)));//printk("%x\n",inb(ioremap(0x0c010000,0x0f)));if((tmp1!=0xf0)){switch(tmp){case0x69:{ret_byte=MY_KEY_NO1;values[0]='1';printk("1");break;}//scan1case0x72:{ret_byte=MY_KEY_NO2;values[0]='2';printk("2");break;}//scan2case0x7a:{ret_byte=MY_KEY_NO3;values[0]='3';printk("3");break;}//scan3case0x6b:{ret_byte=MY_KEY_NO4;values[0]='4';printk("4");break;}//scan4case0x73:{ret_byte=MY_KEY_NO5;values[0]='5';printk("5");break;}//scan5case0x74:{ret_byte=MY_KEY_NO6;values[0]='6';printk("6");break;}//scan6case0x6c:{ret_byte=MY_KEY_NO7;values[0]='7';printk("7");break;}//scan7case0x75:{ret_byte=MY_KEY_NO8;values[0]='8';printk("8");break;}//scan8case0x7d:{ret_byte=MY_KEY_NO9;values[0]='9';printk("9");break;}//scan9case0x70:{ret_byte=MY_KEY_NO0;values[0]='0';printk("0");break;}//scan0case0x79:{ret_byte=MY_KEY_ADD;values[0]='+';printk("+");break;}//scan+case0x7b:{ret_byte=MY_KEY_SUB;values[0]='-';printk("-");break;}//scan-case0x7c:{ret_byte=MY_KEY_MUL;values[0]='*';printk("*");break;}//scan* case0x4a:{ret_byte=MY_KEY_DIV;values[0]='/';printk("/");break;}//scan/ case0x77:{ret_byte=MY_KEY_NUM;values[0]='n';break;}//scann case0x5a:{ret_byte=MY_KEY_ENT;values[0]='e';break;}//scanecase0x71:{ret_byte=MY_KEY_DOT;values[0]='.';printk(".");break;}//scan.default:{ret_byte=tmp;break;}}//printk("keyvalue=%x\n\n",ret_byte);up(&sem);flag=1;wake_up_interruptible(&outq);}}//-------------------------------------------------structfile_operationsINT_ctl_ops={open: SIMPLE_INT_open, read: SIMPLE_INT_read, write: SIMPLE_INT_write, ioctl: SIMPLE_INT_ioctl, release: SIMPLE_INT_release,};//-------------------INIT------------------------staticint__initHW_HELLO_CTL_init(void){intret=-ENODEV; charkey;ret=devfs_register_chrdev(SIMPLE_INT_MAJOR,"keypad",&INT_ctl_ops);showversion();if(ret<0) { printk("pxa270init_modulefailedwith%d\n[--kernel--]",ret); returnret; } else { printk("pxa270int_driverregistersuccess!!![--kernel--]\n"); }ret=request_irq(SIMPLE_INT_IRQ,&SIMPLE_INT_interrupt,SA_INTERRUPT,"keypad",NULL);printk("\n...............\nret=%x\n...............\n",ret);ioremap_addr=ioremap(0x0c010000,0x0f);//KEYBOARD//outw(0x1,ioremap_addr);key=inb(ioremap_addr);returnret;}staticint__initpxa270_HELLO_CTL_init(void){intret=-ENODEV;#ifdefOURS_HELLO_DEBUGprintk("pxa270_HELLO_CTL_init[--kernel--]\n");#endifret=HW_HELLO_CTL_init();if(ret)returnret;else{init_MUTEX(&sem);init_waitqueue_head(&outq);}return0;}staticvoid__exitcleanup_HELLO_ctl(void){ #ifdefOURS_HELLO_DEBUG printk("cleanup_INT_ctl[--kernel--]\n");#endif devfs_unregister_chrdev(SIMPLE_INT_MAJOR,"keypad"); free_irq(SIMPLE_INT_IRQ,NULL);}MODULE_DESCRIPTION("simpleintdrivermodule");MODULE_AUTHOR("hr");MODULE_LICENSE("GPL");module_init(pxa270_HELLO_CTL_init);module_exit(cleanup_HELLO_ctl);應(yīng)用程序:#include<stdio.h>#include<string.h>floattoNumb(char*str){//printf("%s\n",str);inti=0,count=0;floatt1=0,t2=0;ints=0;intnum1=1;if(str[0]=='-')s=1; for(i=s;i<strlen(str);i++) { if(str[i]=='.') { num1=0; } elseif(num1) { t1=10*t1+str[i]-'0'; } else { t2=10*t2+str[i]-'0'; count++; } }for(i=0;i<count;i++){t2=t2/10;}//printf("t1=%f,t2=%f\n",t1,t2);returnt1+t2;}voidcalc(char*str){charc;inti,index=0,count=0;charst1[10];charst2[10];for(i=0;i<strlen(str);i++)if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'){c=str[i];index=i;}//printf("%d\n",index);for(i=0;i<index;i++)st1[i]=str[i];//strcat(st1,str[i]);st1[i]=0;/*else{st2[count]=str[i];count++;}*/for(i=index+1;i<strlen(str);i++)st2[count++]=str[i];//strcat(st1,str[i]);st2[count]=0;//printf("%s\n",st1);//printf("%s\n",st2);interors=0;//boolb1=false,b2=false;//intindex_st1=0,index_st2=0;if(erors>=1||st1[0]=='+'||st1[0]=='*'||st1[0]=='/'||st1[0]=='0') printf("errorexpression\n");else{floatc1=0,c2=0;intflag=1;if(st1[0]=='-')flag=-1;c1=toNumb(st1);c2=toNumb(st2);if(c=='+') { //returnc1+c2;//cout<<c1*flag+c2<<endl;printf("%f\n",c1*flag+c2); } elseif(c=='-') { //returnc1-c2; //cout<<c1*flag-c2<<endl;printf("%f\n",c1*flag-c2);} elseif(c=='*') { //returnc1*c2; //cout<<c1*flag*c2<<endl;printf("%f\n",c1*flag*c2); } else { //returnc1/c2; //cout<<c1*1.0/c2<<endl; printf("%lf\n",c1*flag/c2); }printf("c1=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 別的地區(qū)中考數(shù)學試卷
- 小學數(shù)學邏輯思維與未來職業(yè)規(guī)劃
- 2024年項目安全培訓考試題(鞏固)
- 2023年-2024年項目安全培訓考試題及解析答案可打印
- 2024年金融服務(wù)外包全額承包運營合同3篇
- 八上四章數(shù)學試卷
- 小學生如何通過自我朗讀提升表達能力
- 二零二五年度土地租賃稅費代繳服務(wù)合同范本3篇
- 八市州聯(lián)考數(shù)學試卷
- “合肥十?!甭?lián)考2025屆初中生物畢業(yè)考試模擬沖刺卷含解析
- 電纜及電纜橋架安裝施工方案
- 跨部門溝通與協(xié)調(diào)課件
- 醫(yī)生進修報告ppt通用模板
- 2022年版《義務(wù)教育信息科技技術(shù)新課程標準》試題與答案
- 汽車OTS工程樣件認可流程課件
- 明細賬(三欄式)模板
- 三年級數(shù)學思維訓練【奧數(shù)舉一反三】附部分答案解析
- 2023年數(shù)學競賽AMC8真題A卷(含答案)
- 審計控制活動方案
- 單位洗車房管理制度
- 2023年醫(yī)療軟件實施工程師年度總結(jié)及下年規(guī)劃
評論
0/150
提交評論