s3c2440的LED点灯裸机C程序

1.gcc编译的时候-g选项表示添加一些调试信息。
一个程序一般会经过(针对一个linux程序)
(1)预处理
(2)编译:.c文件处理为.s文件
(3)汇编:.s文件处理为.o文件
(4)链接:把多个.o文件合并为一个可执行文件
2.nor flash不能像内存一样写数据,必须先擦除再写。
3.main函数被谁调用?main函数的返回值给谁了?
答:普通应用程序,main函数会被启动文件或者库文件调用。自己编写裸机函数,那么就需要自己完成main函数的调用工作。
启动文件需要完成的软件初始化工作包括:
(1)设置栈以及硬件初始化
(2)设置main函数的返回地址
(3)调用main函数
(4)完成一些清理工作
注:如果使用的RAM是2440的片内SRAM,那么设置栈的工作已经不需要做了,但是如果使用片外的SDRAM,那么设置栈的工作必须要有。
硬件相关的初始化的工作包括:
(1)关闭看门狗
(2)初始化时钟
(3)初始化SDRAM
4.c程序的启动文件
.text
.global _start
_start:
            ldr     r0, =0x56000010     @ 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
C程序文件:
#define GPBCON      (*(volatile unsigned long *)0x56000010)
#define GPBDAT      (*(volatile unsigned long *)0x56000014)

int main()
{
    GPBCON = 0x00000400;    // 设置GPB5为输出口, 位[11:10]=0b01
    GPBDAT = 0x00000000;    // GPB5输出0,LED1点亮

    return 0;
}
对应的makefile文件:
led_on_c.bin : crt0.S  led_on_c.c
 arm-linux-gcc -g -c -o crt0.o crt0.S
 arm-linux-gcc -g -c -o led_on_c.o led_on_c.c
 arm-linux-ld -Ttext 0x0000000 -g  crt0.o led_on_c.o -o led_on_c_elf
 arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin
 arm-linux-objdump -D -m arm  led_on_c_elf > led_on_c.dis
clean:
 rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o
5.在下面的makefile文件中
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
其中:
-Wall 是打开警告开关

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值