- 调用没有参数的函数
- 调用有参数的函数
- 总结
本文所用硬件平台为S3C2440开发板。通过一个点亮数码管的程序说明ARM汇编调用C函数的方法。
根据C语言中函数参数的个数,可以将汇编调用C函数分为两种情况,调用没有参数的函数和调用有参数的函数。
调用没有参数的函数
这种方式是最简单的调用,只需关闭看门狗,设置堆栈即可实现这种调用。
该例子程序包括汇编代码start.s,C语言代码led.c,相关寄存器定义在s3c2440.h中。改程序通过start.s调用led.c中main函数,实现led灯的闪烁。
led.c内容如下:
#include "s3c2440.h"
#define DELAYTIME 100000
void Delay(unsignedlong delaytime);
int main(void)
{
GPIOFCON->PORT4 = OUTPUTCFG;
GPIOFDATA->PORT4 = RESETBIT;
while(1)
{
Delay(DELAYTIME);
GPIOFDATA->PORT4 = SETBIT;
Delay(DELAYTIME);
GPIOFDATA->PORT4 = RESETBIT;
}
return;
}
void Delay(unsignedlong delaytime)
{
while(delaytime--);
}
main函数实现LED灯的闪烁,该函数并没有参数。start.s直接通过bl指令调用main函数。
start.s内容如下:
.text
.global_start
_start:
ldr r0,=0x56000010 @关看门狗
mov r1,#0x0
str r1,[r0]
ldr sp,= 1024*4 @设置堆栈
bl main @调用c语言main函数
main_loop:
b main_loop @一直循环
首先需要定义入口_start;接着要关看门狗,否则会cpu会不断重启;由于调用了函数,所以必须要设置堆栈SP;然后直接调用C语言中的main函数。
main函数主要是实现led灯的不断闪烁,程序比较简单。Led.c包含了一个名为s3c2440.h的头文件,该文件主要定义了用到的寄存器。
S3c2440.h内容如下所示:
#ifndef __S3C2440_H__
#define __S3C2440_H__
#define SETBIT (0x01)
#define RESETBIT (0x00)
#define INPUTCFG (0x00)
#define OUTPUTCFG (0x01)
#define EINTCFG (0x10)
//为实现位操作,故采用结构体位域数据结构。
typedef volatile