启动文件
@******************************************************************************
@ File:crt0.S
@ 功能:通过它转入C程序
@******************************************************************************
.text
.global _start
_start:
ldr r0, =0x53000000 @ WATCHDOG寄存器地址
mov r1, #0x0
str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启
ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
@ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
bl main @ 调用C程序中的main函数 并且保存返回地址到LR(链接寄存器)中
halt_loop:
b halt_loop
分析:
启动文件,主要完成: 1.关闭看门狗、设置堆栈、调用main函数(设置返回地址)、死循环
#关闭看门狗
ldr r0, =0x53000000 #看门狗 通过手册查找到 watchdog寄存器地址
mov r1, #0x0 #关闭看门狗
#设置堆栈指向4K的地方
ldr sp, =1024*4
#调用main函数
bl main
#死循环
halt_loop:
b halt_loop
----------------------------------------------------------------------
//led_on_c.c
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
int main()
{
GPFCON = 0x00000100; // 设置GPF4为输出口, 位[9:8]=0b01
GPFDAT = 0x00000000; // GPF4输出0,LED1点亮
return 0;
}
C文件 不做分析
----------------------------------------------------------------------
Makefile文件
led_on_c.bin : crt0.S led_on_c.c
arm-linux-gcc -g -c -o crt0.o crt0.S #编译 .S文件
arm-linux-gcc -g -c -o led_on_c.o led_on_c.c #编译.c 文件
arm-linux-ld -Ttext 0x00000000 -g crt0.o led_on_c.o -o led_on_c_elf #链接生成可执行文件 elf,定位代码段入口地址为 0x00000000
arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin #elf文件转换成bin文件,方便烧写到开发板
arm-linux-objdump -D -m arm led_on_c_elf > led_on_c.dis #通过elf文件 生成 反汇编代码
clean:
rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o