1、开发C语言程序的时候,一般都是使用main函数作为入口,而main函数仅仅只是一个函数而已,那么他一定需要被别人来调用,同时将返回值返回给调用者。那么在我们在开发的时候LED点亮的时候,没有人来调用我们的函数,所以我么需要自己来做这些工作。
2、硬件方面的初始化:关闭看门狗
3、软件方面的初始化:设置栈 :把栈指针sp指向某块内存
4、硬件和软件的初始化被称之为启动文件,而该启动文件是一个汇编代码
启动文件crt0.S
.text
.global _start
_start:
LDR r0,=0x53000000 @WATCHDOG寄存器的地址
MOV r1,#0x00000000 @r1是这为0
STR r1,[r0] @写入0,禁止WATCHDOG,否则CPU会不断重启
LDR sp,=1024*4 @设置堆栈,注意:不能大于4k,因为现在可用的内存只有4k
@片内存SRAM,4k
@Nand Flash中的代码在复位后,会被移到内部的ram中,此ram只有4k
bl main @调用c程序中的main函数 ,bl指令会跳转到main函数,并把返回值放在lr里面
halt_loop:
b halt_loop
ledon_c.c文件
#define GPBCON *((volatile unsigned long *)0x56000010)
#define GPBDAT *((volatile unsigned long *)0x56000014)
//volatile是让编译器不要做优化
int main()
{
GPBCON = 0x00000400;//设置GPB5为输出口
GPBDAT = 0x00000000;
return 0;
}
Makefile
CFLAGS := -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestanding
ledon.bin:crt0.S ledon_c.c
arm-linux-gcc -g -c crt0.S -o crt0.o
arm-linux-gcc -g -c ledon_c.c -o ledon_c.o
arm-linux-ld -Ttext 0x00000000 crt0.o ledon_c.o -o ledon_elf
arm-linux-objcopy -O binary -S ledon_elf ledon.bin
arm-linux-objdump -D -m arm ledon_elf > ledon.dis
clean:
rm -rf *.bin *elf *.o *.dis