s3c2440的LED点灯裸机C程序
2013-12-09 10:37
302 查看
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 是打开警告开关
一个程序一般会经过(针对一个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 是打开警告开关
相关文章推荐
- s3c2440的LED点灯裸机汇编程序
- ARM入门实践(一)----Mini6410上最简单的LED点灯裸机程序
- mini2440裸机程序--完善点亮LED(c…
- 一灯大师之点亮OK6410开发板上4个LED裸机程序---嵌入式回归第十篇
- s3c2440的MMU裸机程序
- 4412裸机程序按键控制led灯
- ARM裸机程序开发之led流水灯程序
- u-boot-2014.10移植第5天----LED、button和beep裸机程序
- mini2440(6) 我的第一个ARM汇编程序---LED灯裸机硬件控制程序(2)
- tiny6410的led裸机程序源代码
- 使用J-Link v8和u-boot烧写裸机程序到s3c2440的nand flash(这里假设nor flash已经烧进了u-boot)
- mini2440 LED灯裸机硬件控制程序
- 4412裸机程序之点亮LED
- 基于Cortex-A8裸机,点亮LED灯程序分析
- STM32F407的简单LED点灯程序不能实现的原因及解决方法
- 中断控制LED裸机程序
- S3C2440 RTC 裸机程序
- 4412裸机程序之按键控制LED
- s3c2440的中断裸机程序
- OK6410裸机程序(一)——GPIO(LED)