历史上的今天
返回首页

历史上的今天

今天是:2025年04月04日(星期五)

2020年04月04日 | ARM体系结构与编程-5

2020-04-04 来源:eefocus

GET通常用于包含定义常量的源文件。 例如:GET 2440addr.inc

用AREA定义一个段,ENTRY用于指定程序的入口点,END用于告诉汇编器源文件已经结束。 


例如:

AREA init, CODE, READONLY

ENTRY

......

END

EQU用于定义常量,提醒:在每条ARM指令前必须有空格,但是用EQU定义常量时,必须顶格写,否则编译器报错。


LTORG用于声明一个文字池,所谓文字池就是一个数据缓存区。


ALIGN伪操作通过调整地址指针,使得当前地址满足一定的对齐方式。在ARM代码中要求地址标号是字对齐的。


MACRO和MEND伪操作用于宏定义。语法如下:

MACRO

{$label} MacroName {$parameter1} {$parameter2} ...

;这里添加自己的代码

MEND

其中:$label代表一个标号,在宏展开时,替换成相应的值。MacroName用于指定宏名称。$parameter代表要传递的参数。{}中的项表示是可选的。

例如:

MACRO

$label HANDLER $HandleAddr

$label

sub sp, sp, #4

stmfd sp!, {r0}

ldr r0, =$HandleAddr

ldr r0, [r0]

str r0, [sp, #4]

ldmfd sp!, {r0, pc}

MEND

在程序中可以通过如下方式调用该宏:HandlerIRQ  HANDLER  HandleIRQ

宏展开结果如下:

HandlerIRQ

sub sp, sp, #4

stmfd sp!, {r0}

ldr r0, =HandleIRQ

ldr r0, [r0]

str r0, [sp, #4]

ldmfd sp!, {r0, pc}


MAP用于定义内存表的首地址,其中MAP可以用^表示。FIELD用于定义一个内存表中的数据域,其中FIELD可以用#表示。使用方法如下所示:

_ISR_STARTADDRESS EQU0X33FFFF00

MAP   _ISR_STARTADDRESS

HandleReset  FIELD 4 ;HandleReset的地址范围为0X33FFFF00~0X33FFFF03

HandleUndef FIELD4 ;HandleUndef的地址范围为0X33FFFF04~0X33FFFF07

HandleSWI FIELD4 ;HandleSWI的地址范围为0X33FFFF08~0X33FFFF0B

HandlePabrt FIELD4 ;HandlePabrt的地址范围为0X33FFFF0C~0X33FFFF0F

HandleDabrt FIELD4 ;HandleDabrt的地址范围为0X33FFFF10~0X33FFFF13

以上定义内存表的方式等价于如下方式:

_ISR_STARTADDRESS EQU 0X33FFFF00

^ _ISR_STARTADDRESS

HandleReset #4 ;HandleReset的地址范围为0X33FFFF00~0X33FFFF03

HandleUndef #4 ;HandleUndef的地址范围为0X33FFFF04~0X33FFFF07

HandleSWI #4 ;HandleSWI的地址范围为0X33FFFF08~0X33FFFF0B

HandlePabrt #4 ;HandlePabrt的地址范围为0X33FFFF0C~0X33FFFF0F

HandleDabrt #4 ;HandleDabrt的地址范围为0X33FFFF10~0X33FFFF13

建立好上述内存表之后,可以从C源文件中通过如下方式访问:

#define pISR_SWI (*(unsigned int*)(_ISR_STARTADDRESS+0x8))


ARM伪指令:中等范围的地址读取指令ADRL、大范围的地址读取指令LDR 例如:

ADRL R1, var1 ;表示把var1的地址读取到R1中去。

var1 DCD 5

LDR R1, =var1 ;表示把var1的地址读取到R1中去。

var1 DCD 5


DCD用于分配一块连续的内存单元,并用expr初始化:{label} DCD expr{,expr}...  label代表所分配的内存单元的地址。


SPACE用于分配一块内存单元,并将其初始化为0:{label} SPACE expr label代表内存块的起始地址,expr表示所要分配的内存字节数目

例如: zero SPACE 12    即分配12个字节长度的连续内存单元


ARM汇编程序的结构:

ARM源程序有以下几种类型:

*.s:汇编语言源文件

*.inc:被汇编源文件包含的文件

*.c:C语言源文件

*.h:头文件

编写汇编语言源文件的格式规范:

所有标号必须在一行的顶格书写

所有的指令均不能顶格书写,指令前应该有空格或Tab缩进

注释内容由";"开始到此行结束

指令、寄存器可以全部为大写或者小写字母,但不能大小写字母混用

定义变量、常量时,其标志符必须在一行的顶格书写



常用汇编语言程序子模块实例:

<1>关闭看门狗定时器

WTCON EQU 0X53000000

LDR R0, =WTCON

MOV R1, #0

STR R1, [R0]

<2>内存数据复制:假设R1指向源数据块的起始地址,R2指向源数据块的结束地址,R3指向目的数据块的起始地址。


loop

LDR R0, [R1], #4

STR R0,[R3]. #4

CMP R1,R2

BCC loop

<3>批量加载与存储:初始化SDRAM,SMRDATA是在内存中定义的一个数据表,占据13个字(52字节)的空间;BWSCON是2440处理器的存储控制器寄存器的起始地址。


ADRL R0, SAMRDATA

LDMIA R0, {R1-R13}

LDR R0, = BWSCON

STMIA R0, {R1-R13}

<4>堆栈操作:堆栈初始化

FIQMODE EQU 0X11

IRQMODE EQU 0X12

SVCMODE EQU 0X13

MODEMASK EQU 0X1F

NOINT EQU 0XC0

_STACK_BASE_ADDRESS EQU 0X33FF8000


FIQStack EQU (_STACK_BASE_ADDRESS-0X0) ;0X33FF8000~

IRQStack EQU (_STACK_BASE_ADDRESS-0X1000) ;0X33FF7000~

SVCStack EQU (_STACK_BASE_ADDRESS-0X2800) ;0X33FF5800~


InitStacks

MRS R0, CPSR

BIC R0, R0, #MODEMASK

ORR R1, R0, #IRQMODE | NOINT

MSR CPSR_CXSF, R1;IRQMode

LDR SP, =IRQStack;IRQStack=0x33FF7000


ORR R1, R0, #FIQMODE | NOINT

MSR CPSR_C, R1;FIQMode

LDR SP, =FIQStack;FIQStack=0x33FF8000


BIC R0, R0, #MODEMASK | NOINT

ORR R1, R0, #SVCMODE

MSR CPSR_CXSF, R1;SVCMode

LDR SP, =SVCStack;SVCStack=0x33FF5800

MOV PC, LR

<5>实现查表功能:

MOV R9, #4

LDR R8, =DATATABLE

LDR R8, [R8,R9,LSL,#2]

DATATABLE DCD 0X10, 0X20, 0X30, 0X40, 0X50

 DCD 0X60, 0X70, 0X80, 0X90, 0XA0


/**************************************************************/

在基于ARM处理器的裸机程序开发中,启动代码主要用于为运行用户程序准备基本的运行环境。它主要实现以下功能:

<1>建立异常中断向量表

<2>初始化各种模式下的堆栈

<3>初始化硬件:包括

关闭看门狗

屏蔽所有中断

初始化时钟

初始化存储系统:NandFlash、NorFlash、SDRAM等

<4>初始化应用程序执行环境:代码的搬移和未初始化数据段ZI的清零。一个ARM映像文件主要由RO、RW、ZI段构成。

<5>跳转到主程序(用户程序)执行。

推荐阅读

史海拾趣

FERYSTER公司的发展小趣事

在快速发展的过程中,FERYSTER公司非常注重企业文化的塑造。公司倡导“创新、协作、责任、卓越”的价值观,鼓励员工勇于创新、敢于担当。同时,公司还注重员工的成长和发展,为员工提供各种培训和学习机会。这些措施使得FERYSTER公司成为了一个充满活力、积极向上的团队,为公司的发展提供了源源不断的动力。

Crane Co.公司的发展小趣事

随着Crane Co.在电子行业的不断发展和壮大,公司开始积极参与国际展览和会议。在某次重要的国际展览上,Crane Co.展示了其全系列的流体处理产品,包括创新的阀门和泵类产品。这些产品凭借其卓越的性能和先进的技术,吸引了众多参展商和客户的关注。通过这次展览,Crane Co.进一步巩固了其在电子行业的地位,并为未来的市场拓展奠定了坚实基础。

通过以上五个故事,我们可以看到Crane Co.在电子行业发展的历程中,始终保持着对技术创新和产品质量的不懈追求。正是这些努力,使得Crane Co.能够在激烈的市场竞争中脱颖而出,成为行业内的佼佼者。

光磊(GL)公司的发展小趣事

随着Crane Co.在电子行业的不断发展和壮大,公司开始积极参与国际展览和会议。在某次重要的国际展览上,Crane Co.展示了其全系列的流体处理产品,包括创新的阀门和泵类产品。这些产品凭借其卓越的性能和先进的技术,吸引了众多参展商和客户的关注。通过这次展览,Crane Co.进一步巩固了其在电子行业的地位,并为未来的市场拓展奠定了坚实基础。

通过以上五个故事,我们可以看到Crane Co.在电子行业发展的历程中,始终保持着对技术创新和产品质量的不懈追求。正是这些努力,使得Crane Co.能够在激烈的市场竞争中脱颖而出,成为行业内的佼佼者。

Fairchild公司的发展小趣事

1965年,Fairchild公司的创始人之一戈登·摩尔提出了著名的“摩尔定律”。该定律预测了集成电路上晶体管数量的增长速度,即每两年翻一番。这一预测在之后的几十年里得到了惊人的验证,并成为了电子行业的重要指导原则。摩尔定律的提出不仅推动了半导体技术的快速发展,也促进了计算机和其他电子设备的不断升级换代。

Altus Technology Inc公司的发展小趣事

Altus深知人才是企业发展的根本。因此,公司一直注重人才培养和引进工作。通过建立完善的培训体系和激励机制,Altus吸引了大量优秀人才加入公司,并为他们提供了广阔的发展空间和职业晋升机会。这些人才在公司的各个岗位上发挥着重要作用,推动了公司的技术创新和市场拓展。同时,Altus还注重员工的福利待遇和文化建设,营造了积极向上、团结和谐的工作氛围。

鑫雁公司的发展小趣事

聚洵半导体始终坚持以市场为导向、以创新为驱动的发展理念。公司不断加大新产品研发投入,致力于在低功耗运放、高速运放、仪表放大器等领域取得更多技术突破。同时,聚洵还积极关注行业动态和市场趋势,针对医疗电子、工业控制、汽车电子等新兴领域推出了一系列创新产品。展望未来,聚洵将继续保持专注和创新精神,致力于成为国内领先的信号链模拟芯片设计公司之一,为电子行业的发展贡献更多力量。

问答坊 | AI 解惑

彩色液晶屏的驱动(NXP2138,带照片)

前日偶发一帖,关于点阵液晶的驱动  https://bbs.eeworld.com.cn/thread-59177-1-1.html    响应不大。 今天再发一原创帖,关于液晶的驱动,不用过将先上图,看个效果,关于硬件你们看了程序就知道了连接方法和屏的控制器,源 ...…

查看全部问答>

本人欲兼职电子产品PCBA设计加工,有兴趣的请联系,谢谢!

本人系某世界500强外资企业(>40000人)电子工程师(R&D EE),三年硬件研发工作经验; 担任过许多知名企业如SONY,LG,DELL,LaCie,Seagate的电子硬件设计,并已经量产; 有正规的产品研发流程,严格的质量管控经验; 欢迎联系考察合作, 219er@16 ...…

查看全部问答>

8086模拟器

大家好啊,8086模拟器…

查看全部问答>

verilog pli相关,请帮忙,谢~~!

开发环境如下: os:xp sp2 modlesim: modlesim se 6.3f 我写了一个misctf的函数,声明:int clkReactive (int data, int reason), s_tfcell veriusertfs[] = {    {usertask, 0, clkInit, 0, clkGen, clkReactive, \"$clkGen\"}, ...…

查看全部问答>

问一个验证性问题,知道的就可以马上拿分

三星2440A,的ARM9芯片,里面有GSTATUS2和GSTATUS4等寄存器。说明里是说GSTATUS4只会在电源复位的时候才会丢失数据。否者一直保存数据。 下面就是我主要要问的问题了: 使用2440内部看门狗复位,会不会导致GSTATUS4的数据丢失呢? 请验证过的朋 ...…

查看全部问答>

DIY湿度计活动进展报告!(拿到湿度计的朋友,看过来!)

  2010.8.5   板子发送及焊接调试阶段 ,调试问题详见2楼C8051版原理图及PCB: https://bbs.eeworld.com.cn/thread-154053-1-1.htmlC8051版器件清单:C8051F湿度计元器件说明:https://bbs.eeworld.com.cn/thread-154061-1-1.htmlC ...…

查看全部问答>

我的STM32,2.8“TFT显示

                                  …

查看全部问答>

怎么写我要求的程序呢?

#include #define                UCHAR        unsigned        char #define                UINT    & ...…

查看全部问答>

对c2000的开发板很感兴趣啊,发点我最近用过的ti芯片的心得吧

公司的很多原型机都用的ti的芯片,挑容易介绍的说一说。dcdc芯片tps54327.非常好用的dcdc芯片,输入电压很宽,好象是4.5~16v,输出电流可达3A,纹波很小,在输入电源比较稳的情况下,纹波小于40mv。设计很简单,在ti的手册里有相应的评估板,布线 ...…

查看全部问答>

有VGA USB 电源的PCB板怎样画

大家好 我是是新手,今天师傅说让我画一个一边是USB VGA 两针电源的电源板,也没有其他元器件,应该怎么画啊,而且VGA的封装是怎样的啊 ,问师傅不肯多说,只能来请教大家了 谢谢了…

查看全部问答>