前提:1、开发板已经有了uboot程序,我用的网上的uboot1.1.6
2、采用DNW方式下载程序到开发板里面
PS:我用的开发板是TQ2440
程序部分源码:
启动代码----crt0.S
@******************************************************************************
@ File:crt0.S
@ 功能:通过它转入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语言主函数----main.c
/********************************************************8
* @file main.c
* @autho wesley.gao
* @date 2012.11.20
* @version V1.0.0
* @brief 主程序入口
*********************************************************/
/*@brief headfile include*/
//#include"S3C24xx.h"
/*@brief define*/
#define GPBCON (*(volatile unsigned long *) 0x56000010)
#define GPBDAT (*(volatile unsigned long *) 0x56000014)
#define GPBUP (*(volatile unsigned long *) 0x56000018)
/*@func area*/
int main(void)
{
//GPBCON &= (0xfffc03ff); //17 16 15 14 13 12 11 10 = 00
GPBCON &= (~(unsigned long)(0xff << (5*2)));
GPBCON |= (unsigned long)(0x55 << (5*2));
//GPBCON |= (0x00001400); //pb5 PB6 PB7 PB8 set output
GPBDAT |= (0x00000060); //LED1/2 OFF LED 3/4 ON
return 0;
}
大致工作流程为先运行启动代码,然后跳转到main。C中运行,下面是Makefile文件重点
led_on_c.bin : crt0.S main.c 1
arm-linux-gcc -g -c -o crt0.o crt0.S 2
arm-linux-gcc -g -c -o led_on_c.o main.c 3
arm-linux-ld -Ttext 0x30000000 -g crt0.o led_on_c.o -o led_on_c_elf 4
arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin 5
arm-linux-objdump -D -m arm led_on_c_elf > led_on_c.dis 6
clean: 7
rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o 8
我们的目标是生成led_on_c.bin文件,它依赖于crt0.S main.c两个文件
一个可执行文件生成过程包括:预处理编译汇编链接
2—利用gcc命令生成crt0.o文件
由于可执行bin文件生成需要二进制_elf文件,它需要将所有的.o文件链接而成所以,2 3语句是生成各个文件相关的.o文件 4是利用.o输出_elf文件 arm-linux-ld指令为链接所有的.o文件, -Ttext 0x30000000为程序启动时地址为0x30000000?这里参考韦东山教程,但是实际发现用uboot下载无论是到SDRAM还是下载到nandflash 这条语句的地址不起作用?
好了完成上面的步骤我们得到了led_on_c.bin文件,现在通过uboot使用DNW下载到SDRAM或者使用‘a’命令下载到NAND FLASH都可以看到LED3/4亮了 LED1/2灭了唯一的区别是如果下载到SDRAM中掉电擦除而下载到NAND FLASH中掉电数据保存。