嵌入式系统编程题汇编.docx

上传人:b****6 文档编号:4014458 上传时间:2022-11-27 格式:DOCX 页数:20 大小:60.63KB
下载 相关 举报
嵌入式系统编程题汇编.docx_第1页
第1页 / 共20页
嵌入式系统编程题汇编.docx_第2页
第2页 / 共20页
嵌入式系统编程题汇编.docx_第3页
第3页 / 共20页
嵌入式系统编程题汇编.docx_第4页
第4页 / 共20页
嵌入式系统编程题汇编.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

嵌入式系统编程题汇编.docx

《嵌入式系统编程题汇编.docx》由会员分享,可在线阅读,更多相关《嵌入式系统编程题汇编.docx(20页珍藏版)》请在冰豆网上搜索。

嵌入式系统编程题汇编.docx

嵌入式系统编程题汇编

 

嵌入式系统编程题汇编(带答案)

 

.一。

从一数到十

 

COUNTEQU0x30003100;定义变量COUNT的基地址

AREAExample1,CODE,READONLY;声明代码段Example1为只读

ENTRY;标识程序入口

CODE32;声明32位ARM指令

STARTLDRR1,=COUNT;将0X30003100赋给R1

MOVR0,#0;执行R0=0

STRR0,[R1];存储R0寄存器的数据到R1指向的存

储单元

LOOPLDRR1,=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为9

nEQU8;初始化N为8

AREAExample3,CODE,READONLY;生明代码段Example3为只读

ENTRY;标识程序入口路

CODE32;声明32位ARM指令

STARTLDRSP,=0x30003F00;把0x30003F00赋给SP

(R13)

LDRR0,=X;把9赋给R0

LDRR1,=n;把8赋给R1

BLPOW;跳转到POW,并把下一条指令地址存入到

R14中

 

1

 

HALTBHALT;等待跳转

POWSTMFDSP!

{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的只赋给R2

POW_L1BLDO_MUL;跳转到DO-MUL,并把下一条指令地址存入

R14中

SUBSR2,R2,#1;将R2-1的值赋给R2,并影响标志

BNEPOW_L1;若Z=0,跳转到POW_L1

POW_ENDLDMFDSP!

{R1-R12,PC};数据出栈,存入到R1-R12,PC中

DO_MULMULR0,R1,R0;把R1*R0的值赋给R0

MOVPC,LR;LR中的值赋给PC

END;汇编结束

三:

从一一直加到一百

 

程序清单

(一)

C语言实验参考程序

#define

uint8

unsignedchar

;定义一个无符号字符常量

uint8

#define

uint32

unsignedint

;定义一个无符号整形常量

unint32

#define

N

100

;定义一个常量N=100(宏定义,100用N代替)

uint32

sum;

;定义sum为无符号整型常量(声明一个

unsignedint型的变量sum)

voidMain(void)

;主函数

{uint32

i;

;定义无符号整型常量i(声明一个unsignedint型的变量i)

sum=0;

;sum初始值为0

for(i=0;i<=N;i++

;i在N内自增加1(i从0开始,i<=N时循环成立)

{sum+=i;}

;把sum+i赋给sum

while

(1);

;为真循环

}

 

程序清单

(二)简单的启动代码

 

IMPORT

|Image$$RO$$Limit|

;R0输出段存储区域界限

IMPORT

|Image$$RW$$Base|

;RW输出段运行时起始地址

IMPORT

|Image$$ZI$$Base|

;ZI输出段运行时起始地址

IMPORT

|Image$$ZI$$Limit|

;ZI输出段存储区域界限

IMPORT

Main

;主函数

2

 

AREA

Start,CODE,READONLY

;声明代码段start,为只读

ENTRY

;程序入口

CODE32

;声明32位ARM指令

Reset

LDR

SP,=0x40003f00

;将0x40003f00赋给SP

LDR

R0,=|Image$$RO$$Limit|;将R0输出段存储区域界限赋给R0

LDR

R1,=|Image$$RW$$Base|;将RW输出段运行时起始地址赋给

R1

LDR

R3,=|Image$$ZI$$Base|;将ZI输出段运行时起始地址赋给

R3

CMP

R0,R1

;比较R0和R1,相等Z=1,反之Z=0

BEQ

LOOP1

;若Z=1,则跳到LOOP1

LOOP0

CMP

R1,R3

;比较R1和R3,若R1

LDRCC

R2,[R0],#4

;若C=0,读取R0地址单元内容并且存入

R2,且

R0=R0+4

STRCC

R2,[R1],#4

;若C=0,读取R2中的数据存入R1,且

R1=R1+4

BCC

LOOP0

;若C=0,跳转到LOOP0

LOOP1

LDR

R1,=|Image$$ZI$$Limit|;将ZI输出段存储区域赋给R1

MOV

R2,#0

;把0赋给R2

LOOP2

CMP

R3,R1

;比较R1和R3,若R1

STRCC

R2,[R3],#4

;若C=0,将R2中数据保存到内存单元

R3中,且

R3=R3+4

BCC

LOOP2

;若C=0,跳转到LOOP2

B

Main

;跳转到主程序

END

;汇编结束

 

实验四

 

程序清单

(一)C语言调用汇编的参考程序

 

#defineuint8unsignedchar;定义一个无符号字符常量uint8

#defineuint32unsignedint;定义一个无符号整型常量.uint32

externuint32Add(uint32x,uint32y);//声明子程序Add为一个无符号整型常量,它

为2个无符号整型常量x,y的和

uint32sum;;定义sum为无符号整型常量

voidMain(void);无返回主程序

{sum=Add(555,168);;sum等于555+168

while

(1);;为真循环

}

 

3

 

程序清单

(二)汇编加法函数程序

 

EXPORTAdd;声明子程序Add方便调用

AREAStart,CODE,READONLY;声明代码段start,为只读

ENTRY;程序入口

CODE32;声明32位ARM指令

AddADDR0,R0,R1;将R0+R1值赋给R0

MOVPC,LR;将LR值赋给PC

END;汇编结束

 

14、设计编程:

LPC2131的P0.7引脚连接了一个蜂鸣器,编程发出等周期的滴滴声。

答:

#define

VoidDelayNS(intm)

{inti;for(;m>0;m--)

for(i=0;i<50000;i++)

}

main()

{

4

 

PINSEL0=0x00000000;

IO0DIR=1<<7;

while

(1)

{

IO0SET=1<<7;

DelayNS(50);

IO0CLR=1<<7;

DelayNS(50);

}

}

15、设计编程:

LPC2131的P0[1:

0]两引脚分别连接了2个按键K1和K4;

P0[7:

6]两引脚分别连接了2个指示灯LED1和LED2;请编制驱动程序,使Kx按

键时,LEDx灯亮。

答:

#definek11<<0

#definek21<<1

 

#defineLED11<<7

#defineLED21<<8

 

main()

{

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芯片中定时器结构原理如下图,试设计一个周期为2秒的方波发生器。

(假设该系统的外围设备时钟频率Fpclk=10MHz)

答:

intmian{

PINSEL0=PINSEL0&(1(3<<10))|(2<<10);

5

 

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*/

else

IO0CLR=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;/*设置中断服务程序地址*/

6

 

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;

7

 

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转换器

有独立的模拟信号输入引脚

AIN0---AIN9。

ADCCON格式如下:

1514

13

⋯⋯6

543

2

10

ECFLG

PRSCENPRSCVLSEL_MUXSTDBMREAD_STARTENABLE_START

ADCDAT0格式如下:

1514

13

121110

9

⋯⋯

0

UPDOWNAUTO_PSTXY_PST保留(0)

转换结果

ADCCON、ADCDAT0的地址宏定义为:

#define

rADCCON

(*(volatileunsigned*)0x58000000)

#define

rADCDAT0

(*(volatileunsigned*)0x5800000c)

#define

pref

49

#define

ch

3

intadc(void)

{rADCCON=(1<<14)|(pref<<6)|(ch<<3)|1;//允许预分频,启动转换

 

while(rADCCON&0x01==1);//查询是否已经启动转换

while(rADCCON&0x8000==0);//查询转换是否结束

returnrADCDAT0&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);

8

 

}

 

1、编写程序,将存储器从0x400000开始的200个字数据,传送到0x400600

开始的区域。

解:

MOV

R0,#0x400000

LDR

R1,=0x400600

MOV

R7,#200

LP:

LDR

R2,[R0],#4

STR

R2,[R1],#4

SUBS

R7,R7,#1

BNE

LP

HERE:

B

HERE

2、编写一程序,查找存储器从0x500000开始的200个字中为5的数目,将其结果存到0x600000中。

解:

MOVR0,#0x500000

MOVR1,#0

MOVR7,#200

LPLDRR2,[R0],#4

CMPR2,#5

BNENEXT

ADDR1,R1,#1

NEXTSUBSR7,R7,#1

BNELP

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

;分支的实现

9

 

ADDR0,R0,R1;R0←R0+R1

ADDR1,R1,#1;R1←R1+1

BLOOP;无条件跳转至LOOP

;循环的实现

ADD_END;行标定义

BADD_END;无条件跳转ADD_ENDEND;代码结束

以实验平台PXA270为设计环境,试写出一段代码,能控制八段数码管以递减方

 

式点亮显示(15分)

 

#include

 

#include"register_variant.h"

 

#defineLED_CS2(*((volatileunsignedshortint*)(0x10300000)))//LED1

 

andLED2

 

#defineLED_CS3(*((volatileunsignedshortint*)(0x10400000)))//LED3

 

andLED4

 

voidDelay(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){

 

Delay(300);

 

LED_CS2=0x3024;//23

 

LED_CS3=0x1219;//45

 

Delay(300);

 

10

 

LED_CS2=0x1930;

//34

LED_CS3=0x0212;

//56

Delay(300);

LED_CS2=0x1219;

//45

LED_CS3=0x7802;

//67

Delay(300);

LED_CS2=0x0212;

//56

LED_CS3=0x0078;

//78

Delay(300);

LED_CS2=0x7802;

//67

LED_CS3=0x1000;

//89

Delay(300);

LED_CS2=0x0078;

//78

LED_CS3=0x8f10;

//90

Delay(300);

LED_CS2=0x1000;

//89

LED_CS3=0x8f8f;

//00

Delay(300);

LED_CS2=0x8f10;

//90

LED_CS3=0x8f8f;

//00

Delay(300);

LED_CS2=0x8f8f;

//00

LED_CS3=0x8f8f;

//00

Delay(300);

LED_CS2=0x2479;

//12

 

11

 

LED_CS3=0x1930;//34}}

 

12

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1