微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > arm汇编编程(示例)

arm汇编编程(示例)

时间:11-09 来源:互联网 点击:

1;实现两数相加

ADDR0,R0,R2

ADDR0,R0,R3

MOVPC,LR;子程序返回,R0内为返回的结果

END

//C代码

externintfunc1(inta,intb,intc,intd);

intmain(intargc,charargv){

inta=1,b=2,c=3,d=4;

intz=func1(a,b,c,d);

printf("%d",z);

return0;

}

4.在C语言中调用汇编全局变量

汇编中用DCD为全局变量分配空间并赋值,并定义一个标号代表该存储位置。

在汇编中用EXPORT导出标号(这个标号就是全局变量),在C程序中用extern扩展声明名该变量

//汇编代码

EXPORTfunc1

EXPORTtmp

AREAExample,CODE,READONLY;声明代码段Example

tmp;全局变量名

DCD0x0005;全局变量创建内存空间及赋初值

func1;子函数名

ADDR0,R0,R1;实现两数相加

ADDR0,R0,R2

ADDR0,R0,R3

MOVPC,LR;子程序返回,R0内为返回的结果

END

//C代码

externintfunc1(inta,intb,intc,intd);

externinttmp;

intmain(intargc,charargv){

inta=1,b=2,c=3,d=4;

intz=func1(a,b,c,tmp);

printf("%d",z);

return0;

}

5.在C语言中内嵌汇编

有些操作C语言程序无法实现,如改变CPSP寄存器值,初始化堆栈指针寄存器SP等,这些只能由汇编来完成。

但出于编程简洁等一些因素,有时需要在C源代码中实现上述操作,此时就需要在C中嵌入少量汇编代码。

内嵌的汇编不能直接引用C的变量定义,必须通过ATPCS进行,语法格式如下:

__asm{

//内嵌汇编

}

例:在C语言中嵌入汇编

intf(){//C函数

__asm{//内嵌汇编,禁用中断例子

MRSR0,CPSR

ORRR0,R0,#0x80

MSRCPSR_c,R0

}

}

intmain(intargc,charargv){

inta;

intz=f(a);

printf("%d",z);

return0;

}

出地完整性考虑,内嵌汇编相对于一般汇编的不同特点如下:

1)操作数可以是寄存器、常量或C表达式。可以是char、short、或int类型,而且是无符号数进行操作

2)常量前的#号可以省略

3)只有指令B可以使用C程序中的标号,指令BL不可以使用

4)不支持汇编语言中用于内存分配的伪操作

5)内嵌汇编不支持通过“.”指示符或PC获取当前指令地址

6)不支持LDRRn,=expression伪指令,而使用MOVRn,expression指令向寄存器赋值

7)不支持标号表达式

8)不支持ADR和ADRL伪指令

9)不支持BX和BLX指令

10)不可以向PC赋值

11)使用0x前缀替代&表示十六进制数

12)不使用寄存寻址变量

13)ldm和stm指令的寄存器列表只允许物理寄存器

14)必须小心使用物理寄存器,如R0-R3,LR和PC

//------------------------------------------

(三)、裸机硬件的控制方法

1.裸板开发环境搭建

1)J-Link

(1)安装Setup_JLinkARM_V408i.exe

(2)连接开发板

1打开桌面快捷J-FlashARMV4.08i

2连接好开发板开发板->jlink->pc(usb)

3将开发板置为NorFlash启动

4打开菜单file->openproject->选择TQ2440.jflash

5填加配置选项

将Flash.csv到安装目录的\ETC\JFlash内

打开菜单options->projectsettings

在弹出对话框内选flash后,点击按钮selectflashdevice

在弹出对话框内选择EN29LV160AB

6.连接开发板

重启开发板,然后点击菜单target->connect查看联接信息

(3)烧写方法

将j-link连接好后,在菜单file->open内选择要烧写的程序。

如:烧写u-boot.bin,

然后在烧写地址对话框内输入烧写地址,u-boot的地址设为0

再点击菜单target->program进行烧写

(4)调试方法

连接JLINK和开发板。

打开程序J-LINKARMV4.08i->J-linkGDBServer

设置信息JTAGspeed为500KH

所有选项勾选

设置AXD调试环境options->configuretarget填加JlinkARM目录下的JLinkRDI.dll

然后在AXD内选则JLinkRDI.dll选项,同时点击右侧configure按钮

在弹出对话框内General标签:JTAGspeed设为4000Khz

flash标签:去掉Enableflashprogramming选项

Breakpoints:去掉Usesoftwarebreakpoints选项

CPU标签:勾选Allowinstructionsetsimulation

Littleendian

Resetstrategy内选

Hardware,haltafterreset(normal)和1000ms

在AXD内,通过File->LoadImage载入要调试的axf文件

(四)、软件控制硬件的编程原理

每一种硬件,在其控制器芯片上都有物理寄存器(不是CPU寄存器,是硬件上的寄存器)

这些寄存器分为三类:命令寄存器、状态寄存器、数据寄存器

程序控制硬件的方法是,通过汇编str指令向命令寄存器写入指令即可完成对硬件的配置操作或执行物理操作。

通过汇编ldr指令从数据寄存器中获取数据,或从状态寄存器获取状态。

程序控制硬件,其实质就是对硬件的寄存器进行读写操作。

程序中需要解决的问题:

1)硬件寄存器的内存地址是多少?

2)向哪一个寄存器写入什么值?

如想解决上述两个问题,需要熟练查看硬件的手册,阅读硬件连线原理图。

数电的基本知识:

1).电路符号

2).基本原理

以LED灯为例讲解如何使用硬件手册,和原理图

在开发

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top