S3C2440-裸机篇-04 | ARM-THUMB子程序调用规则ATPCS

发布者:SerendipitySoul最新更新时间:2021-07-14 来源: eefocus关键字:S3C2440  ARM-THUMB  ATPCS 手机看文章 扫描二维码
随时随地手机看文章

在GPIO的实验中,我们首先编写汇编程序操作寄存器点亮LED,奈何汇编语言可读性和可移植性太差,所以编写启动代码,设置栈顶指针SP,然后调用C语言中的main函数,转入C语言的世界,由C语言访问控制寄存器,点亮LED,程序的可读性和可移植性大大提高,那么,我们可曾想过,在汇编语言中是如何来调用C语言入口函数main呢?


其实,对于ARM处理器,在ARM指令集汇编程序和THUMB指令集汇编程序中制定了子程序调用的规则 —— ATPCS规则,这个规则包括:

  • 寄存器使用规则

  • 数据栈使用规则

  • 参数传递规则

1.寄存器使用规则

ARM处理器中有R0-R15这16个寄存器,每个寄存器都由ATPCS规则规定了用途,并根据其用途规定了别名,如下表所示:

寄存器别名用途
R15pc程序计数器
R14lr链接寄存器(用于保存子程序返回地址)
R13sp数据栈指针(指向栈顶)
R12ip子程序内部调用的scratch寄存器
R11v8ARM状态局部变量寄存器8
R10v7ARM状态局部变量寄存器7
R9v6ARM状态局部变量寄存器6
R8v5ARM状态局部变量寄存器5
R7v4ARM状态局部变量寄存器4
R6v3ARM状态局部变量寄存器3
R5v2ARM状态局部变量寄存器2
R4v1ARM状态局部变量寄存器1
R3a4参数/结果/scratch寄存器4
R2a3参数/结果/scratch寄存器3
R1a2参数/结果/scratch寄存器2
R0a1参数/结果/scratch寄存器1

总结如下:

  • 子程序间通过寄存器R0-R3传递参数和返回结果;

  • 子程序中通过寄存器R4-R11保存局部变量;

  • 寄存器R12用作子程序间scratch寄存器;

  • 寄存器R13用作数据栈指针,指向栈顶;

  • 寄存器R14用作链接寄存器,保存子程序的返回地址;

  • 寄存器R15用作程序计数器;


2. 数据栈使用规则

ATPCS规定数据栈为FD类型(Full Descending,满递减),即栈指针指向栈顶元素,并且向内存地址减小的方向增长,操作的时候对数据栈的操作是8字节对齐的,使用stmdb/ldmia批量内存访问指令来操作FD数据栈。


FD类型的数据栈具体是这样操作的:

  • 保存内容时先递减SP指针,再保存数据;

  • 恢复数据时先获得数据,再递增SP指针;

3.参数传递规则

  • 函数调用传递参数时,如果不超过4个,使用R0-R3依次传递,如果超过4个,剩余的参数通过数据栈传递;

  • 函数返回传递结果时,使用R0-R3依次传递;

实验 —— 汇编调用函数时传递参数实验

1. 实验目的

在汇编语言中调用函数并且传递参数。


2. 实验内容

main函数定义参数,如果传入参数是1,点亮第一个LED,如果传入参数是2,点亮第二个LED。


3. 实验代码

3.1.启动代码

@ brief: S3C2440启动文件

@ author: mculover666


.text

.global _start


_start:

@ 关闭看门狗

LDR R0,=0x53000000

MOV R1,#0

STR R1,[R0]


@ 设置栈顶指针SP(从Nand启动)

LDR SP,=4096


@ 传递参数1调用led_on,点亮第一个LED

LDR R0,=1

BL led_on


@ 传递参数100000,调用delay,延时

LDR R0,=100000

BL delay


@ 传递参数2调用led_on,点亮第二个LED

LDR R0,=2

BL led_on


@ 程序暂停

halt:

B halt


3.2.C代码

void delay(volatile int xms)

{

while(xms--);

}


int led_on(int led)

{


if(led == 1)

{

/* 设置GPFCON寄存器,配置GPF4引脚为输出模式 */

*(unsigned int *)0x56000050 &= ~(3<<(2*4));

*(unsigned int *)0x56000050 |= 1<<(2*4);


/* 设置GPFDAT寄存器,GPF4输出低电平,点亮LED */

*(unsigned int *)0x56000054 &= ~(1<<4);

}

else if(led == 2)

{

/* 设置GPFCON寄存器,配置GPF4引脚为输出模式 */

*(unsigned int *)0x56000050 &= ~(3<<(2*5));

*(unsigned int *)0x56000050 |= 1<<(2*5);


/* 设置GPFDAT寄存器,GPF4输出低电平,点亮LED */

*(unsigned int *)0x56000054 &= ~(1<<5);

}


return 0;

}


3.3.编译

TARGET = led_blink


CFLAGS = -Wall #输出所有warning


$(TARGET).bin:$(TARGET).elf

arm-linux-objcopy -O binary -S $(TARGET).elf $(TARGET).bin


#注意:启动文件必须第一个链接

$(TARGET).elf:start.o $(TARGET).o

arm-linux-ld -Ttext 0 start.o $(TARGET).o -o $(TARGET).elf


$(TARGET).o:$(TARGET).c

arm-linux-gcc -c $(TARGET).c $(CFLAGS) -o $(TARGET).o

start.o:start.s

arm-linux-gcc -c start.s $(CFLAGS) -o start.o


clean:

rm -rf *.o *.elf *.bin


download_to_nand:

#下载到nand flash

oflash 0 1 0 0 0 $(TARGET).bin


4.下载运行

程序开始运行,第一个LED点亮:

延时1s左右,第二个LED也被点亮:

5.实验总结

通过本实验掌握了ATPCS规则在实际开发中的使用,在调用main函数时使用R0寄存器传递参数,总结如下:

  • ARM处理器中子程序调用规则由ATPCS制定,包括寄存器使用规则,数据栈使用规则,参数传递规则;

  • R0-R3可以传递参数/结果,R4-R11可以保存局部变量,R13是数据栈指针SP,R14保存子程序返回地址;

  • ATPCS中数据栈是FD类型,即满递减类型;

  • ATPCS中参数传递使用R0-R3依次传递,如果大于4个参数,剩余的使用数据栈传递。


关键字:S3C2440  ARM-THUMB  ATPCS 引用地址:S3C2440-裸机篇-04 | ARM-THUMB子程序调用规则ATPCS

上一篇:S3C2440-裸机篇-03 | GPIO的使用(点亮LED、按键检测)
下一篇:S3C2440-裸机篇-05 | S3C2440时钟体系详解(FCLK、PCLK、HCLK)

推荐阅读最新更新时间:2024-11-13 11:42

S3C2440时钟体系结构与编程
如果cpu是计算机的大脑,电流是计算机的血液,那么时钟则是计算机的心脏,时钟频率决定了处理器运算的快慢,它的每一次“跳动”都驱动着处理器不停的执行命令。不同的是,人的各个部位心率是一样的,但计算机却有多个频率,而且每个部位可能有不同的频率,比如“大脑”有一个频率,“手“有一个频率,“脚”使用的是另外一个频率,这样就产生了两个问题:怎么产生这些不同的频率?处理器怎么与自己不同频率的外设实现交互? 怎么产生这些不同的频率? 为了获取稳定的时钟,我们一般使用外部晶振来提供,晶振是由石英和震荡电路组成的,石英能够提供稳定的频率。一般一个计算机系统最少需要一个晶振,有些特殊的外设也会有自己特有的晶振,比如网卡,显卡等,但是对于大多数连接
[单片机]
<font color='red'>S3C2440</font>时钟体系结构与编程
S3C2440结构和启动流程
S3C2440结构如下图: 启动过程:大多数ARM芯片从0地址启动 1、NOR启动,NOR Flash基地址为0,片内RAM地址为0x40000000. CPU读出NOR上第一个指令(前4字节),执行。 CPU读出NOR上其它指令,执行。 2、NAND启动,片内4kRAM基地址为0,NOR Flash不可访问。 2440硬件把NAND前4k内容复制到片内RAM, 然后CPU从0地址取出第一条指令执行。
[单片机]
<font color='red'>S3C2440</font>结构和启动流程
[ARM裸机程序][8]ARM处理器启动流程(S3C2440)
ARM处理器启动流程 S3C2440支持启动方式: 1. NorFlash启动 2. NandFlash启动 当处理器上电时,会自动从0地址处取第一条指令开始运行。左边为当选择NorFlash启动时地址的布局,右边为当选择NandFlash启动时地址的布局。 NandFlash不像NorFlash一样参与统一编址,CPU不能直接访问其内容。NandFlash启动模式时,0地址处为Boot SRAM片内RAM大小4KB,Boot SRAM也称stepping stone。CPU上电后第一条指令从stepping stone获取,CPU会提前把NandFlash最前端的4KB内容复制到stepping stone(硬件自动完成)。
[单片机]
[ARM裸机程序][8]ARM处理器启动流程(<font color='red'>S3C2440</font>)
基于S3C2440与EP2S15芯片实现靶场破片测速系统的设计
0 引言 破片速度是战斗部爆炸效能评估的一个重要参数。传统的靶场破片测速系统多使用多路数据采集卡设置好的参数现场采集标靶的试验波形,试验完成后再交由计算机进行后期处理和解读以获取破片速度等参数。但随着军事科技的日新月异,靶场破片测速系统需要根据实际情况现场设置的参数越来越多,参数设置的灵活性越来越强,对系统工作的实时性要求越来越高;另一方面,战斗部爆炸试验在野外进行,条件恶劣,大型设备携带不便,并为靶场破片测速系统设计提供了一个新的思路。 1 系统硬件设计 系统使用ARM+FPGA的设计方式:ARM处理器选用Samsung公司推出的基于ARM920T内核的S3C2440。S3C2440主频高达400 MHz,完全能够胜任系统工
[单片机]
基于<font color='red'>S3C2440</font>与EP2S15芯片实现靶场破片测速系统的设计
基于S3C2440和加速度传感器的自由摆平板控制系统的设计
本设计的重点在于通过加速度传感器MMA7455采集各关节处角度信息,并根据得到的角度值及任务要求控制步进电机的运转,完成自由摆臂末端平板姿态的调整,完成预定任务。通过MMA7455加速度传感器得到的是三轴加速度信息,而在实际控制过程中所需要的是角度信息,所以要用到三角函数完成加速度值到角度值的转换,其次实践证明MMA7455加速度传感器稳定性较差,需要通过滑动平均滤波算法对得到的三轴加速度值进行滤波处理,以达到精确控制的目的。而对于步进电机的精确控制则需要PID控制算法以去除控制过程中的抖动,达到自控系统“稳、准、快”的设计要求。综上所述,本系统中存在大量的数据运算及控制算法并且对实时性要求较高,因此选用主频高达400 MHz的S
[单片机]
基于<font color='red'>S3C2440</font>和加速度传感器的自由摆平板控制系统的设计
基于openwrt和s3c2440的无线ap实现
无线AP(Access Point)是一个无线网络的接入点,具备无线到有线( wireless-to-wired)的桥接功能,我们这里的无线AP是纯接入设备,没有路由功能(由于开发板网卡数限制,所以没有实现)。 下面就来讲一下具体的实现方法: 硬件准备:mini2440开发板一块,usb无线网卡DWL-122一块,硬件连接图如下: 在2440的网口用网线连上有线路由器的局域网口,使路由器为mini2440分配一个ip地址。 接下来就是openwrt的编译,我是在ubuntu10.04下编译的,一定要用用户权限!!, 编译步骤如下: 对ubuntu进行更新: $sudo apt-get -y update 安装subvers
[单片机]
ARM9 S3C2440—ADC和触摸屏控制详解
S3C2440芯片内部共有8路A/D转换通道,AIN0-AIN7,转换器只有一个,转换精度为10位,最大转换率为2.5MHz A/D 转换器时钟下的500 KSPS。A/D 转换器支持片上采样-保持功能和掉电模式的操作。在常见的设计中,一般AIN4,AIN5,AIN6,AIN7被用作四线电阻触摸屏的YM、YP、XM、XP通道,剩余的AIN0~AIN3被引出,其中AI0外接一个可调电阻。 ADC的配置流程如下: 1、ADCDLY(P446) rADCDLY=50000; //Normal conversion mode delay about
[单片机]
s3c2440硬件篇之九:LCD
背景知识 1. LCD工作的硬件需求: 要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。在通常情况下,生产厂商把LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多的MCU内部都集成了LCD控制器,如S3C2410/2440等。通过LCD控制器就可以产生LCD驱动器所需要的控制信号来控制STN/TFT屏了。 2. S3C2440内部LCD控制器结构图: 我们根据数据手册来描述一下这个集成在S3C2440内部的LCD控制器: a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器组成; b:R
[单片机]
<font color='red'>s3c2440</font>硬件篇之九:LCD
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved