嵌入式系统-编程题汇编_第1页
嵌入式系统-编程题汇编_第2页
嵌入式系统-编程题汇编_第3页
嵌入式系统-编程题汇编_第4页
嵌入式系统-编程题汇编_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统编程题汇编(带答案).一。从一数到十COUNT EQU0x30003100;定义变量COUNT的基地址 AREAExample1,CODE,READONLY;声明代码段Example1为只读 ENTRY;标识程序入口 CODE32;声明32位ARM指令START LDRR1,=COUNT;将0X30003100赋给R1 MOVR0,#0;执行R0=0 STRR0,[R1];存储R0寄存器的数据到R1指向的存储单元LOOP LDRR1,=COUNT;将0X30003100赋给R1 LDRR0,[R1];将R1中的数值作为地址,取出此地址中的数据保存到R0中 ADDR0,R0,#1;执行R0=R0+1 CMPR0,#10;将R0与10进行比较 MOVHSR0,#0;若R0大于等于10,则R0=0 STRR0,[R1];存储R0寄存器的数据到R1指向的地址单元 BLOOP;跳转到LOOP END;汇编文件结束二,9的8次幂XEQU9;初始化X为9nEQU8;初始化N为8 AREA Example3,CODE,READONLY;生明代码段Example3为只读 ENTRY;标识程序入口路 CODE32;声明32位ARM指令START LDR S P,=0x30003F00;把0x30003F00赋给SP(R13) LDRR0,=X;把9赋给R0 LDRR1,=n;把8赋给R1 BLPOW;跳转到POW,并把下一条指令地址存入到R14中HALT BHALT;等待跳转POW STMFDSP!,{R1-R12,LR};将R1-R12入栈,满递减堆栈 MOVSR2,R1;将R1赋给R2,并影响标志位 MOVEQR0,#1;若Z=1,则R0=1 BEQPOW_END;若Z=1,跳转到POW_END MOVR1,R0;将R0中值赋给R1 SUBR2,R2,#1;将R2-1的只赋给R2POW_L1 BLDO_MUL;跳转到DO-MUL,并把下一条指令地址存入R14中 SUBSR2,R2,#1;将R2-1的值赋给R2,并影响标志位 BNEPOW_L1;若Z=0,跳转到POW_L1POW_ENDLDMFDSP!,{R1-R12,PC};数据出栈,存入到R1-R12,PC中DO_MULMULR0,R1,R0;把R1*R0的值赋给R0 MOVPC,LR;LR中的值赋给PC END;汇编结束三:从一一直加到一百程序清单(一)C语言实验参考程序#defineuint8unsignedchar;定义一个无符号字符常量uint8#defineuint32unsignedint;定义一个无符号整形常量unint32#defineN100;定义一个常量N=100(宏定义,100用N代替)uint32sum;;定义sum为无符号整型常量(声明一个unsignedint型的变量sum)voidMain(void);主函数{uint32i;;定义无符号整型常量i(声明一个unsignedint型的变量i)sum=0;;sum初始值为0for(i=0;i<=N;i++);i在N内自增加1(i从0开始,i<=N时循环成立){sum+=i;};把sum+i赋给sumwhile(1);;为真循环}程序清单(二)简单的启动代码IMPORT|Image$$RO$$Limit|;R0输出段存储区域界限IMPORT|Image$$RW$$Base|;RW输出段运行时起始地址IMPORT|Image$$ZI$$Base|;ZI输出段运行时起始地址IMPORT|Image$$ZI$$Limit|;ZI输出段存储区域界限IMPORTMain;主函数 T0CTCR=0x00; T0TC=0; T0PR=99; T0MCR=0x02<<3; T0MR1=Fpclk/100; T0EMR|=0xc2; T0TCR=0x01; While(1); }17、 使用学过的知识设计设计一个汽车用“车速表”,写出你的设计方案并编程实现。提示:可用霍尔元件将车轮的转动转换为脉冲。车轮每转动一圈会产生一个方波脉冲。 答:转动脉冲:void__irqIRQ_Timer0(void){if((IO0SET&BEEP)==0)IO0SET=BEEP;/*关闭BEEP*/elseIO0CLR=BEEP;T0IR=0x01;/*清除中断标志*/VICVectAddr=0x00;/*通知VIC中断处理结束*/}intmain(void){intspped=1;PINSEL1=0x00000000;/*设置管脚连接GPIO*/IO0DIR=BEEP;/*设置BEEP控制口输出*/IRQEnable();/*IRQ中断使能*//*定时器0初始化*/T0TC=0;/*定时器设置为0*/T0PR=0;/*时钟不分频*/T0MCR=0x03;/*设置T0MR0匹配后复位T0TC,并产生中断标志*/T0MR0=Fpclk/spped;/*0.5秒钟定时*/T0TCR=0x01;/*启动定时器*//*设置定时器0中断IRQ*/VICIntSelect=0x00;/*所有中断通道设置为IRQ中断*/VICVectCntl0=0x20|0x04;/*设置定时器0中断通道分配最高优先级*/VICVectAddr0=(uint32)IRQ_Timer0;/*设置中断服务程序地址*/VICIntEnable=1<<0x04;/*使能定时器0中断*/while(1){if((IO0PIN&KEY1)==0){spped=10;T0MR0=Fpclk/spped;/*0.5秒钟定时*/T0TC=0;/*定时器设置为0*/}elseif((IO0PIN&KEY2)==0){spped=20;T0MR0=Fpclk/spped;/*0.5秒钟定时*/T0TC=0;/*定时器设置为0*/}elseif((IO0PIN&KEY3)==0){spped=30;T0MR0=Fpclk/spped;/*0.5秒钟定时*/T0TC=0;/*定时器设置为0*/}elseif((IO0PIN&KEY4)==0){spped=40;T0MR0=Fpclk/spped;/*0.5秒钟定时*/T0TC=0;/*定时器设置为0*/}};return0;}汽车车速:intmain(void){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&=~0x07;T0TCR=0x01;T1TCR=0x01;while(1){if((T0IR&0x01)==1){T0IR=0x01;Vx=T1TC;T1TC=0;VtotalLen+=Vx;VthisLen+=Vx;Vspeed=(Vx*L*3.6)/HrN;}if((IO0PIN&KClr)==0)VthisLen=0;}return0;}1、编写一程序,用查询的方式,对S3C2410的A/D转换器的第3通道连续进行100次A/D转换,然后将其结果求平均值。设预分频为49。注意:A/D转换器有独立的模拟信号输入引脚AIN0AIN9。ADCCON格式如下:15 14 13……6 5 4 3 2 1 0ECFLG PRSCEN PRSCVL SEL_MUX STDBM READ_START ENABLE_STARTADCDAT0格式如下:15 14 13 12 11 10 9……0UPDOWN AUTO_PST XY_PST 保留(0) 转换结果ADCCON、ADCDAT0的地址宏定义为:#define rADCCON (*(volatileunsigned*)0x58000000)#define rADCDAT0 (*(volatileunsigned*)0x5800000c)#definepref 49 #definech 3 intadc(void){ rADCCON=(1<<14)|(pref<<6)|(ch<<3)|1; //允许预分频,启动转换 while(rADCCON&0x01==1); //查询是否已经启动转换 while(rADCCON&0x8000==0); //查询转换是否结束 return rADCDAT0&0x3ff; //读取转换结果 }voidmain(){ intadc_data=0,i; for(i=0;i<100;i++) adc_data+=adc(); adc_data=adc_data/100; printf("adcaverageis:%d\n",adc_data);}1、编写程序,将存储器从0x400000开始的200个字数据,传送到0x400600开始的区域。解: MOV R0,#0x400000 LDR R1,=0x400600 MOV R7,#200LP: LDR R2,[R0],#4 STR R2,[R1],#4 SUBS R7,R7,#1 BNE LPHERE:B HERE2、编写一程序,查找存储器从0x500000开始的200个字中为5的数目,将其结果存到0x600000中。 解: MOV R0,#0x500000 MOV R1,#0 MOV R7,#200LP LDR R2,[R0],#4 CMP R2,#5 BNE NEXT ADD R1,R1,#1NEXT SUBS R7,R7,#1 BNE LP MOVR0,#0x600000 STRR1,[R0] B$3、实现1+2+……+N。 NEQU5; ;常量的定义 AREAExample,CODE,READONLY ;定义段名属性等 ENTRY ;程序入口 CODE32 ;ARM代码 START ;行标定义 LDRR0,=N ;R0赋值 MOVR2,R0 ;R2充当计数器 MOVR0,#0 ;R0←0 MOVR1,#0 ;R1←0 LOOP ;行标 CMPR1,R2 ;比较R1R2 BHIADD_END ;如果R1>R2跳转到ADD_END ;分支的实现 ADDR0,R0,R1 ;R0←R0+R1 ADDR1,R1,#1 ;R1←R1+1 BLOOP ;无条件跳转至LOOP ;循环的实现 ADD_END ;行标定义 BADD_END ;无条件跳转ADD_END END ;代码结束以实验平台PXA270为设计环境,试写出一段代码,能控制八段数码管以递减方式点亮显示(15分)#include<stdio.h>#include"register_variant.h"#defineLED_CS2 (*((volatileunsignedshortint*)(0x10300000))) //LED1andLED2#defineLED_CS3 (*((volatileunsignedshortint*)(0x10400000))) //LED3andLED4voidDelay(unsignedintx){ unsignedinti,j,k; for(i=0;i<=x;i++) for(j=0;j<0xff;j++) for(k=0;k<0xff;k++);}voiddummyOs(void){ LED_CS2=0x2479;//12 LED_CS3=0x1930;//34 while(1)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论