×
单片机 > 单片机程序设计 > 详情

S3C2440 -- 启动文件和Makefile文件分析

发布时间:2020-05-16 发布时间:
|

Nand Flash 或者 Nor Flash启动
S3C2440有4KB SRAM,Nand Flash启动的话,硬件自动将Nand Flash的前4KB 拷贝到SRAM中,然后CPU由地址0开始执行。Nor Flash启动的话,可以像内存一样读,所以CPU如果从Nor Flash启动的话,CPU仍将从0地址启动,但是此时0地址指向Nor Flash地址;Nor Flash具有的特征:可以像内存一样读数据,但是不能像内存一样写数据,必须先擦除之后才能写数据到Nor Flash。

GCC编译流程:预编译,编译,汇编,连接

编译:.c -> .s; 汇编:.s -> .o ;连接:多个.o问价合并一个可执行文件

Makefile文件内容:

led_on.bin : led_on.S

arm-linux-gcc -g -c -o led_on.o led_on.S//-g 加入调试信息-c编译不连接
arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf//-Ttext 代码段开始位置 连接生成文件 led_on_elf
arm-linux-objcopy -O binary -S led_on_elf led_on.bin//生成二进制文件
clean:
rm -f   led_on.bin led_on_elf *.o

@******************************************************************************
@ File:led_on.S
@ 功能:LED点灯程序,点亮LED1
@******************************************************************************       
            
.text
.global _start
_start:     
            LDR     R0,=0x56000050       @ R0设为GPFCON寄存器。此寄存器
                                        @ 用于选择端口B各引脚的功能:
                                        @ 是输出、是输入、还是其他
            MOV     R1,#0x00000100        
            STR     R1,[R0]             @ 设置GPF4为输出口, 位[8:7]=0b01
            LDR     R0,=0x56000054       @ R0设为GPBDAT寄存器。此寄存器
                                        @ 用于读/写端口B各引脚的数据
            MOV     R1,#0x00000000        @ 此值改为0x00000010,
                                        @ 可让LED1熄灭
            STR     R1,[R0]             @ GPF4输出0,LED1点亮
MAIN_LOOP:
            B       MAIN_LOOP

启动文件包括软件初始化进而硬件初始化

硬件初始化:1. 关闭开门狗 2.初始化时钟, 3. 初始化SDRAM

软件初始化:1. 设置返回地址, 2. 调用main函数, 3. 清理工作(sp ->SRAM(不需要初始化可以直接使用)或者SDRAM(需添加初始化程序))

@******************************************************************************
@ 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函数
halt_loop:
b halt_loop@程序死循环与此

此程序位基础的点亮LED程序并在SRAM中运行,所以硬件启动项中没有设置时钟和SDRAM。

#define GPFCON      (*(volatile unsigned long *)0x56000050)
#define GPFDAT      (*(volatile unsigned long *)0x56000054)
int main()
{
    GPFCON = 0x00000100;    // 设置GPF4为输出口, 位[8:7]=0b01
    GPFDAT = 0x00000000;    // GPF4输出0,LED1点亮
    return 0;
}

启动文件对应的C语言文件相对比较简单,设置引脚控制寄存器和数据寄存器,点亮LED。

CFLAGS := -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestanding

leds.bin : crt0.S  leds.c

arm-linux-gcc $(CFLAGS) -c -o crt0.o crt0.S

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

arm-linux-ld -Ttext 0x0000000 crt0.o leds.o -o leds_elf

# arm-linux-ld -Tleds.lds  crt0.o leds.o -o leds_elf

arm-linux-objcopy -O binary -S leds_elf leds.bin

arm-linux-objdump -D -m arm  leds_elf > leds.dis

clean:

rm -f   leds.dis leds.bin leds_elf *.o

arm-linux-objdump -D -m arm leds_elf > leds.dis //对连接文件按照段,机型为ARM进行反汇编



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式