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

上传人:b****2 文档编号:17111183 上传时间:2023-07-22 格式:DOCX 页数:19 大小:37.15KB
下载 相关 举报
嵌入式系统编程题汇编.docx_第1页
第1页 / 共19页
嵌入式系统编程题汇编.docx_第2页
第2页 / 共19页
嵌入式系统编程题汇编.docx_第3页
第3页 / 共19页
嵌入式系统编程题汇编.docx_第4页
第4页 / 共19页
嵌入式系统编程题汇编.docx_第5页
第5页 / 共19页
嵌入式系统编程题汇编.docx_第6页
第6页 / 共19页
嵌入式系统编程题汇编.docx_第7页
第7页 / 共19页
嵌入式系统编程题汇编.docx_第8页
第8页 / 共19页
嵌入式系统编程题汇编.docx_第9页
第9页 / 共19页
嵌入式系统编程题汇编.docx_第10页
第10页 / 共19页
嵌入式系统编程题汇编.docx_第11页
第11页 / 共19页
嵌入式系统编程题汇编.docx_第12页
第12页 / 共19页
嵌入式系统编程题汇编.docx_第13页
第13页 / 共19页
嵌入式系统编程题汇编.docx_第14页
第14页 / 共19页
嵌入式系统编程题汇编.docx_第15页
第15页 / 共19页
嵌入式系统编程题汇编.docx_第16页
第16页 / 共19页
嵌入式系统编程题汇编.docx_第17页
第17页 / 共19页
嵌入式系统编程题汇编.docx_第18页
第18页 / 共19页
嵌入式系统编程题汇编.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

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

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

嵌入式系统编程题汇编

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

从一数到十

COUNT

EQU0x30003100

;定义变量C0UNT的基地址

AREAExample1,C0DE,READ0NLY;声明代码段Examplel为只读

ENTRY

;标识程序入口

C0DE32

;声明32位ARM指令

START

LDRR1,=C0UNT

;将0X30003100赋给R1

M0VR0,#0

;执行R0=0

STRR0,[R1]

;存储R0寄存器的数据到

R1指向的存

储单元

LOOP

LDRR1,=C0UNT

;将0X30003100赋给R1

LDRR0,[R1]

;将R1中的数值作为地址,取出此地址中的数据保存

到R0中

ADDR0,R0,#1

;执行R0=R0+1

CMPR0,#10

;将RO与10进行比较

M0VHSR0,#0

;若R0大于等于10,则

R0=0

STRR0,[R1]

;存储R0寄存器的数据到

R1指向的地

址单元

BL00P

;跳转到L00P

END

;汇编文件结束

;初始化X为9

;初始化N为8

,9的8次幂

XEQU9

nEQU8

AREAExample3,CODE,READONLY;生明代码段Example3为只读ENTRY;标识程序入口路

CODE32;声明32位ARM指令

START

(R13)

LDRSP,=0x30003F00

;把0x30003F00赋给SP

 

;把9赋给R0

;把8赋给R1

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

LDRR0,=X

LDRR1,=n

BLPOW

R14中

HALT

B

HALT

POW

STMFD

SP!

{R1-R12,LR}

MOVSR2,R1MOVEQR0,#1BEQPOW_ENDMOVR1,R0

SUBR2,R2,#1POW_L1BLDO_MULR14中

SUBSR2,R2,#1位

;等待跳转

;将R1-R12入栈,满递减堆栈

將R1赋给R2,并影响标志位

若Z=1,则R0=1

;若Z=1,跳转到POW_END

;将R0中值赋给R1

;将R2-1的只赋给R2

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

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

BNE

POW_ENDLDMFD

DO_MULMUL

MOV

POW_L1

SP!

{R1-R12,PC}R0,R1,R0

PC,LR

END

从一一直加到一百

;若Z=0,跳转到POW_L1

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

;把R1*R0的值赋给R0

;LR中的值赋给PC

;汇编结束

#define

#define

#define

uint32

程序清单

(一)C语言实验参考程序

uint8

uint32

sum;

unsignedchar

unsignedint

100

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

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

voidMain(void)

{uint32i;

sum=0;

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

{sum+=i;}

while

(1);

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

;主函数

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

;sum初始值为0

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

;把sum+i赋给sum

;为真循环

IMPORT

|Image$$RO$$Limit|

IMPORT

|Image$$RW$$Base|

IMPORT

|Image$$ZI$$Base|

IMPORT

|Image$$ZI$$Limit|

IMPORT

Main

程序清单

(二)简单的启动代码

;R0输出段存储区域界限;RW输出段运行时起始地址;ZI输出段运行时起始地址;ZI输出段存储区域界限;主函数

 

AREA

ENTRY

CODE32

Start,CODE,READONLY

;声明代码段start,为只读

;程序入口

;声明32位ARM指令

Reset

LDR

SP,=0x40003f00

;将0x40003f00赋给SP

LDR

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

LDR

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

LDR

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

CMP

RO,R1

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

BEQ

LOOP1

;若Z=1,则跳到LOOP1

LOOP0

CMP

R1,R3

;比较R1和R3,若R1

LDRCCR2,[R0],#4

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

R0=R0+4

STRCCR2,[R1],#4

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

R1=R1+4

BCC

LOOPO

;若C=0,跳转到LOOP0

LOOP1

LDR

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

MOV

R2,#O

;把0赋给R2

LOOP2

CMP

R3,R1

;比较R1和R3,若R1

STRCCR2,[R3],#4

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

R3=R3+4

BCC

LOOP2

;若C=0,跳转到LOOP2

B

Main

;跳转到主程序

END

;汇编结束

#define

uint8

unsignedchar

#define

uint32

unsignedint

extern

uint32

Add(uint32x,uint32y)

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

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

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

实验四

程序清单(一

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

程序清单

(二)汇编加法函数程序

EXPORT

Add

;声明子程序Add方便调用

AREA

Start,CODE,READONLY

;声明代码段start,为只读

ENTRY

;程序入口

CODE32

;声明32位ARM指令

AddADD

R0,R0,R1

;将R0+R1值赋给R0

MOV

PC,LR

;将LR值赋给PC

END

;汇编结束

 

指令条件码列表

条件码助记符

标志

含义

Z=l

柑等

NE

z=o

不相爭

CS/HS

C=1

无符号毅大于成等于

CC/LO

c=c

无符号甦小于

MI

N=1

负数

PL

E

正数或零

VS

V=1

溢出

VC

v=o

没有溢出

HI

C=l*z=o

无符号数大于

LS

C=0rZ=1

无符号甦小于或等于

GE

带符号数大于或等于

LT

K!

=V

带符号数小于

GT

Z=0ts=v

带符号独大于

LE

带符号数小于或等于

AL

任何

无条件执行(指令默认条件)

14、设计编程:

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

答:

#define

VoidDelayNS(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、设计编程:

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

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

IOODIR=BEEP;/*设置BEEP空制口输出*/

IRQEnable();/*IRQ中断使能*/

/*定时器O初始化*/

TOTC=O;/*定时器设置为O*/

TOPR=O;/*时钟不分频*/

TOMCR=0x03;/*设置T0MR匹配后复位TOTC,并产生中断标志*/

TOMRO=Fpclk/spped;/*O.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转换器有独立的模拟信号输入引脚AIN0---AIN9。

ADCCO格式如下:

151413……6543210

ECFLGPRSCENPRSCVLSEL_MUXSTDBMREAD_STARETNABLE_START

ADCDAT格式如下:

1514131211109……0

UPDOW!

AUTO_PSTXY_PST保留(0)转换结果

ADCCONADCDAT的地址宏定义为:

#definerADCCON

#definerADCDAT0

#definepref

#definech

(*(volatileunsigned*)0x58000000)

(*(volatileunsigned*)0x5800000c)

49

3

intadc(void)

//允许预分频,启动转换

//查询是否已经启动转换

//查询转换是否结束

//读取转换结果

,adc_data);

{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"

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

解:

MOVR0,#0x400000

LDRR1,=0x400600

MOVR7,#200

LP:

LDRR2,[R0],#4

STRR2,[R1],#4

SUBSR7,R7,#1

BNELP

HEREBHERE

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

解:

MOVR0,#0x500000

M0VR1,#0

MOVR7,#200

LPLDRR2,[R0],#4

CMRR2,#5

BNENEXT

ADDR1,R1,#1

NEXTSUBSR7,R7,#1

BNE_P

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;R0J0

MOVR1,#0;R1J0

LOOP;行标

CMPR1,R2;比较R1R2

BHIADD_END;女口果R1>R2跳转至到ADD_END

;分支的实现

ADDR0,R0,R1;ROJR0+R1

ADDR1,R1,#1;R1JR1+1

BLOOP;无条件跳转至LOOP

;循环的实现

ADD_END;行标定义

BADD_END;无条件跳转ADD_END

END;代码结束

以实验平台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);

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

LED_CS3=

0x1930;

//34}}

12/12

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

当前位置:首页 > 表格模板 > 调查报告

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2