嵌入式系統(tǒng)編程題匯編_第1頁
嵌入式系統(tǒng)編程題匯編_第2頁
嵌入式系統(tǒng)編程題匯編_第3頁
嵌入式系統(tǒng)編程題匯編_第4頁
嵌入式系統(tǒng)編程題匯編_第5頁
免費預(yù)覽已結(jié)束,剩余8頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、嵌入式系統(tǒng)編程題匯編(帶答案)O從一數(shù)到十COUNTEQU0x30003100;定義變量COUNT的基地址AREAExample1,CODE,READONLY;聲明代碼段Examplel為只讀ENTRYCODE32STARTLDRR1,=COUNTMOVR0,#0STRR0,R1儲單元LOOPLDRR1,=COUNTLDRR0,R1到R0中;標(biāo)識程序入口;聲明32位ARM指令;將0X30003100賦給R1;執(zhí)行R0=0;存儲R0寄存器的數(shù)據(jù)到R1指向的存;將0X30003100賦給R1;將R1中的數(shù)值作為地址,取出此地址中的數(shù)據(jù)保存ADDR0,R0,#1CMPR0,#10MOVHSR0,#0

2、STRR0,R1址單元BLOOPEND;執(zhí)行R0=R0+1;將R0與10進(jìn)行比較;若R0大于等于10,則R0=0;存儲R0寄存器的數(shù)據(jù)到R1指向的地;跳轉(zhuǎn)到LOOP;匯編文件結(jié)束;初始化X為9;初始化N為8XEQU9nEQU8AREAExample3,CODE,READONLY;生明代碼段Example3為只讀ENTRY;標(biāo)識程序入口路CODE32;聲明32位ARM指令STARTLDRSP,=0x30003F00;把0x30003F00賦給SP(R13)LDRR0,=XLDRR1,=nBLPOW;把9賦給R0;把8賦給R1;跳轉(zhuǎn)到POW,并把下一條指令地址存入到R14中HALTHALT;等待跳

3、轉(zhuǎn)POWSTMFDSP!,R1-R12,LRMOVSR2,R1MOVEQR0,#1BEQPOW_ENDMOVR1,R0SUBR2,R2,#1POW_L1BLDO_MULR14中SUBSR2,R2,#1;將R1-R12入棧,滿遞減堆棧;將R1賦給R2,并影響標(biāo)志位若Z=1,則R0=1;若2=1,跳轉(zhuǎn)至ijPOW_END;將R0中值賦給R1;將R2-1的只賦給R2;跳轉(zhuǎn)到DO-MUL,并把下一條指令地址存入;將R2-1的值賦給R2,并影響標(biāo)志BNEPOW_ENDLDMFDDO_MULMULMOVPOW_L1SP!,R1-R12,PCR0,R1,R0PC,LR;若2=0,跳轉(zhuǎn)到POW_L1;數(shù)據(jù)出棧

4、,存入到R1-R12,PC中;把R1*R0的值賦給R0;LR中的值賦給PCEND:從直加到一百;匯編結(jié)束程序清單(一)C語言實驗參考程序#defineuint8unsignedchar;定義一個無符號字符常量uint8#defineuint32unsignedint;定義一個無符號整形常量unint32#defineN100;定義一個常量N=100(宏定義,100用N代替)uint32sum;定義sum為無符號整型常量(聲明一個unsignedint型的變量sum)voidMain(void);主函數(shù)uint32i;定義無符號整型常量i(聲明一個unsignedint型的變量i)sum=0;f

5、or(i=0;i<=N;i+)sum+=i;while(1);sum初始值為0;i在N內(nèi)自增加1(i從0開始,i<=N時循環(huán)成立);把sum+i賦給sum;為真循環(huán)程序清單(二)簡單的啟動代碼IMPORT|Image$RO$Limit|IMPORT|Image$RW$Base|IMPORT|Image$ZI$Base|IMPORT|Image$ZI$Limit|IMPORTMain;R0輸出段存儲區(qū)域界限;RW輸出段運行時起始地址;ZI輸出段運行時起始地址;ZI輸出段存儲區(qū)域界限;主函數(shù)AREAStart,CODE,READONLY;聲明代碼段start,為只讀ENTRY;程序入口

6、CODE32;聲明32位ARM指令ResetLDRSP,=0x40003f00;將0x40003f00賦給SPLDRR0,=|Image$RO$Limit|;將R0輸出段存儲區(qū)域界限賦給R0LDRR1,=|Image$RW$Base|XRW輸出段運行時起始地址賦給R1LDRR3,=|Image$ZI$Base|;將21輸出段運行時起始地址賦給R3CMPR0,R1BEQLOOP1LOOP0CMPR1,R3LDRCCR2,R0,#4R0=R0+4;比較R0和R1,相等Z=1,反之Z=0;Z=1,則跳到LOOP1;比較R1和R3,若R1<R3,C=0;若C=0,讀取R0地址單元內(nèi)容并且存入R2

7、,且STRCCR2,R1,#4;C=0,讀取R2中的數(shù)據(jù)存入R1,且R1=R1+4BCCLOOP1LDRMOVLOOP0R1,=|Image$ZI$Limit|R2,#0;C=0,跳轉(zhuǎn)到LOOP0;將ZI輸出段存儲區(qū)域賦給R1;把0賦給R2LOOP2CMPR3,R1;比較R1和R3,若R1<R3,C=0STRCCR2,R3,#4;C=0,將R2中數(shù)據(jù)保存到內(nèi)存單元R3中,且R3=R3+4BCCLOOP2BMainEND;C=0,跳轉(zhuǎn)到LOOP2;跳轉(zhuǎn)到主程序;匯編結(jié)束實驗四程序清單(一)C語言調(diào)用匯編的參考程序#defineuint8unsignedchar;定義一個無符號字符常量uin

8、t8#defineuint32unsignedint;定義一個無符號整型常量.uint32externuint32Add(uint32x,uint32y);/聲明子程序Add為一個無符號整型常量,它為2個無符號整型常量x,y的和;定義sum為無符號整型常量;無返回主程序;sum等于555+168;為真循環(huán)uint32sum;voidMain(void)sum=Add(555,168);while(1);程序清單(二)匯編加法函數(shù)程序EXPORTAdd;聲明子程序Add方便調(diào)用AREAStart,CODE,READONLY;聲明代碼段start,為只讀;程序入口;聲明32位ARM指令;將R0+R

9、1值賦給R0;將LR值賦給PC;匯編結(jié)束ENTRYCODE32AddADDR0,R0,R1MOVPC,LREND指令條件碼列表條件碼助記符標(biāo)志含義EQZ=1梢等NEz=o不相等CS/H5C=L無符號數(shù)大于或等于cc/wC=Q無符號數(shù)小于MINfL負(fù)數(shù)PL20正數(shù)或零VSV=L溢出1VC;二。沒有溢出HIC=l.2=0無符號數(shù)大于LSGEC=0,Z=lN二甘無符號數(shù)小于或等于帶符號數(shù)大于或等于11X:=V帶符號數(shù)小于GTZ=0>N=V帶符號數(shù)大于LE帶符號數(shù)小于或等于二任何無條件執(zhí)行(指令默認(rèn)條件)14、設(shè)計編程:LPC2131的P0.7引腳連接了一個蜂鳴器,編程發(fā)出等周期的滴滴聲。答:#

10、defineVoidDelayNS(intm)inti;for(;m>0;m-)for(i=0;i<50000;i+)main()PINSEL0=0x00000000;IO0DIR=1<<7;while(1)(IO0SET=1<<7;DelayNS(50);IO0CLR=1<<7;DelayNS(50);)15、設(shè)計編程:LPC2131的P01:0兩引腳分別連接了2個按鍵K1和K4;P07:6兩引腳分別連接了2個指示燈LED1和LED2請編制驅(qū)動程序,使Kx按鍵時,LEDx燈亮。答:#definek11<<0#definek21<

11、;<1#defineLED11<<7#defineLED21<<8main()(PINSEL0=0x00000000;IO0DIR=IO0DIR&(k1);IO0DIR=IO0DIR&(k2);IO0DIR=IO0DIR|LED1;IO0DIR=IO0DIR|LED2;IO0CLR=IO0CLR|LED1|LED2;While(1)(If(IO0PIN&k1)=0)IO0SET=LED1;elseIO0SET=LED1;If(IO0PIN&k2)=0)IO0SET=LED2;elseIO0SET=LED2;)16、ARM芯片中定時器

12、結(jié)構(gòu)原理如下圖,試設(shè)計一個周期為2秒的方波發(fā)生器。(假設(shè)該系統(tǒng)的外圍設(shè)備時鐘頻率Fpclk=10MHz)答:intmianPINSEL0=PINSEL0&(1(3<<10)|(2<<10);T0CTCR=0x00;T0TC=0;T0PR=99;T0MCR=0x02<<3;T0MR1=Fpclk/100;T0EMR|=0xc2;T0TCR=0x01;While(1);)17、使用學(xué)過的知識設(shè)計設(shè)計一個汽車用“車速表”,寫出你的設(shè)計方案并編程實現(xiàn)。提示:可用霍爾元件將車輪的轉(zhuǎn)動轉(zhuǎn)換為脈沖。車輪每轉(zhuǎn)動一圈會產(chǎn)生一個方波脈沖。轉(zhuǎn)動脈沖:void_irqIRQ

13、_Timer0(void)if(IO0SET&BEEP)=0)IO0SET=BEEP;/*關(guān)閉BEEP*/elseIO0CLR=BEEP;T0IR=0x01;/*清除中斷標(biāo)志*/VICVectAddr=0x00;/*通知VIC中斷處理結(jié)束*/)intmain(void)intspped=1;PINSEL1=0x00000000;/*設(shè)置管腳連接GPIO*/IO0DIR=BEEP;/*設(shè)置BEEP空制口輸出*/IRQEnable();/*IRQ中斷使能*/*定時器0初始化*/T0TC=0;/*定時器設(shè)置為0*/T0PR=0;/*時鐘不分頻*/T0MCR=0x03;/*設(shè)置T0MR也配后復(fù)

14、位T0TC并產(chǎn)生中斷標(biāo)志*/T0MR0=Fpclk/spped;/*0.5秒鐘定時*/T0TCR=0x01;/*啟動定時器*/*設(shè)置定時器0中斷IRQ*/VICIntSelect=0x00;/*所有中斷通道設(shè)置為IRQ中斷*/VICVectCntl0=0x20|0x04;/*設(shè)置定時器0中斷通道分配最高優(yōu)先級*/VICVectAddr0=(uint32)IRQ_Timer0;/*設(shè)置中斷服務(wù)程序地址*/VICIntEnable=1<<0x04;/*使能定時器0中斷*/while(1)if(IO0PIN&KEY1)=0)spped=10;T0MR0=Fpclk/spped;/

15、*0.5秒鐘定時*/T0TC=0;/*定時器設(shè)置為0*/elseif(IO0PIN&KEY2)=0)spped=20;T0MR0=Fpclk/spped;/*0.5秒鐘定時*/T0TC=0;/*定時器設(shè)置為0*/elseif(IO0PIN&KEY3)=0)spped=30;T0MR0=Fpclk/spped;/*0.5秒鐘定時*/T0TC=0;/*定時器設(shè)置為0*/elseif(IO0PIN&KEY4)=0)spped=40;T0MR0=Fpclk/spped;/*0.5秒鐘定時*/T0TC=0;/*定時器設(shè)置為0*/;return0;汽車車速:intmain(void

16、)intVx;PINSEL0=(PINSEL0&(3<<20)|(2<20);PINSEL0=PINSEL0&(0<<24);T0CTCR&=0xf0;T0TC=0;T0PR=99;T0MCR=0x03;T0MR0=Fpclk/300;T1CTCR=(T1CTCR&(0x0f)|0xf1);T1TC=0;T1MCR=0x00;T1CCR&=0x07T0TCR=0x01;T1TCR=0x01;while(1)(if(T0IR&0X01)=1)(T0IR=0x01;Vx=T1TC;T1TC=0;VtotalLen+=Vx

17、;VthisLen+=Vx;Vspeed=(Vx*L*3.6)/HrN;if(IO0PIN&KClr)=0)VthisLen=0;return0;1、編寫一程序,用查詢的方式,對S3c2410的A/D轉(zhuǎn)換器的第3通道連續(xù)進(jìn)行100次A/D轉(zhuǎn)換,然后將其結(jié)果求平均值。設(shè)預(yù)分頻為49。注意:A/D轉(zhuǎn)換器有獨立的模擬信號輸入引腳AIN0-AIN9。ADCCON式如下:1514136543210ECFLGPRSCENPRSCVLSEL_MUXSTDBMREAD_STAFEINABLE_STARTADCDAT0式如下:15141312111090UPDOWNAUTO_PSTXY_PST保留(0)

18、轉(zhuǎn)換結(jié)果ADCCONADCDAT0地址宏定義為:#definerADCCON#definerADCDAT0#definepref#definech(*(volatileunsigned*)0x58000000)(*(volatileunsigned*)0x5800000c)493intadc(void)rADCCON=(1<<14)|(pref<<6)|(ch<<3)|1;允許預(yù)分頻,啟動轉(zhuǎn)換/查詢是否已經(jīng)啟動轉(zhuǎn)換/查詢轉(zhuǎn)換是否結(jié)束/讀取轉(zhuǎn)換結(jié)果adc_data);while(rADCCON&0x01=1);while(rADCCON&0x8

19、000=0);returnrADCDAT0&0x3ff;voidmain()intadc_data=0,i;for(i=0;i<100;i+)adc_data+=adc();adc_data=adc_data/100;printf("adcaverageis:%dn"1、編寫程序,將存儲器從0x400000開始的200個字?jǐn)?shù)據(jù),傳送到0x400600開始的區(qū)域。解:MOVR0,#0x400000LDRR1,=0x400600MOVR7,#200LP:LDRR2,R0,#4STRR2,R1,#4SUBSR7,R7,#1BNELPHEREBHERE2、編寫一程序,

20、查找存儲器從0x500000開始的200個字中為5的數(shù)目,將其結(jié)果存到0x600000中。解:MO取0,#0x500000MOVR1,#0MO決7,#200LPLDRR2,R0,#4CMRR2,#5BNENEXTADDR1,R1,#1NEXTSUBSR7,R7,#1BNE_PMOVR0,#0x600000STRR1,R0B$3、實現(xiàn)1+2+N0NEQU5;常量的定義AREAExample,CODE,READONLY;定義段名屬性等ENTRY;程序入口CODE32;ARM代碼START;行標(biāo)定義LDRR0,=N;R0賦值MOVR2,R0;R2充當(dāng)計數(shù)器MOVR0,#0;R00MOVR1,#0;R

21、10LOOP;行標(biāo)CMPR1,R2;比較R1R2BHIADD_END;如果R1>R2跳轉(zhuǎn)至UADD_END;分支的實現(xiàn)ADDR0,R0,R1;R0R0+R1ADDR1,R1,#1;R1R1+1BLOOP;無條件跳轉(zhuǎn)至LOOP;循環(huán)的實現(xiàn)ADD_END;行標(biāo)定義BADD_END;無條件跳轉(zhuǎn)ADD_ENDEND;代碼結(jié)束以實驗平臺PXA270為設(shè)計環(huán)境,試寫出一段代碼,能控制八段數(shù)碼管以遞減方式點亮顯示(15分)#include<stdio.h>#include"register_variant.h"#defineLED_CS2C(volatileunsignedshortint*)(0x1

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論