2012年(10)
分类: 嵌入式
2012-05-28 09:47:08
分别用汇编和C写了两个点灯程序用来在程序起始阶段判断程序运行状态,影响代表点灯时可能会将寄存器其它位修改,造成不可预知的错误。这里写出两种版本的程序是为了相互比较。
我自己用过的,所以保证能用。
反汇编命令:/home/opt/FriendlyARM/toolsch
ain/4.4.3/bin/arm-linux-objdump -DT u-boot > temp.txt
汇编无影响
loop:
ldr r0,=0x56000050//GPFCON地址为0x56000050
mov r1,#0xffff00ff
ldr r2,[r0]
and r2,r2,r1//将GPFCON的8-15位清零,并保持其它位不变
mov r1,#0x00005500
orr r2,r2,r1
str r2,[r0]//GPFCON写入0x00005500,即GFP4-7设置为输出功能
ldr r0,=0x56000054//GPFDAT地址为0x56000054
mov r1,#0x000000d0//将5灯置亮
ldr r2,[r0]
orr r2,r2,r1
str r2,[r0]
b loop
汇编影响
loop1:
ldr r0,=0x56000050
mov r1,#0x00005500
str r1,[r0]
ldr r0,=0x56000054
mov r1,#0x000000e0
str r1,[r0]
b loop1
C语言影响
#define GPFCON (*(volatile unsigned long *)0x56000050) //GPFCON地址为0x56000050
#define GPFDAT (*(volatile unsigned long *)0x56000054) //GPFDAT地址为0x56000054
GPFCON=0x00005500; //GPFCON写入0x00005500,即GFP4-7设置为输出功能
while(1)
{
GPFDAT=0x000000e0; //GPFDAT写入0x000000e0,即GPFDAT[7:4]=1110,LED4点亮
}
C语言不影响
#define GPFCON (*(volatile unsigned long *)0x56000050) //GPFCON地址为0x56000050
#define GPFDAT (*(volatile unsigned long *)0x56000054) //GPFDAT地址为0x56000054
GPFCON&=0xffff00ff;
GPFCON|=0x00005500; //GPFCON写入0x00005500,即GFP4-7设置为输出功能
while(1)
{
GPFDAT|=0x000000e0; //GPFDAT写入0x000000e0,即GPFDAT[7:4]=1110,LED4点亮
}