【转】Linux下ARM裸板程序编写

 有些学习过Bootloader和内核的朋友肯定会知道,在调用C语言函数之前肯定会有一段汇编代码在前面铺路,进行一些必要的初始化工作;而那些只学过单片机而没有学过ARM的朋友肯定会觉得很奇怪,在单片机中写C代码,前面完成可以不用任何汇编代码。这是为什么呢?

  这主要是因为我们的开发环境(这里主要是指编译环境)的不同,在开发单片机程序的时候,开发环境(如KEIL)会在编译C代码的时候,给我添加启动代码(startup-51)或者在编译时已经由编译器在后台为我们初始化好了。而在开发ARM程序时,ARM处 理器支持多种模式,多种功能,而在不同的领域不同的项目里面,我们可以有选择的、适当的选择这些功能,这时,编译器就不知道我们需要什么功能,需要什么模 式,编译器也就无法给我们提供默认的“初始化”代码,所以,编译器干脆就“不管”这些了,把这些工作交由我们开发者来处理。

 这里最简单的启动代码。

复制代码
@****************************************
@ File: startup.s
@ function: start up
@ author: pang123hui
@****************************************
.text
.global _start
_start:
LDR R0,=0x7E004000 @ WATCHDOG寄存器地址
MOV R1,#0x0
STR R1,[R0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启
LDR SP,=0x0c001000 @ 设置堆栈,注意:这时我们是将程序直接烧录到SDRAM中,所以堆栈要设置在SDRAM中
@ 如果将程序烧在NAND FLASH中,需将堆栈改为1024*4,因为NAND FLASH中的代码
@ 在复位后会移到内部RAM中,此RAM只有4K
BL main @ 调用C程序中的main函数
halt_loop:
B halt_loop
复制代码

这里要注意的一点是S3C6410中RAM的地址,见datasheet,如图。

最后是Makefile文件。

复制代码
CC=arm-linux-gcc
CFLAGS=-g -c -o
led_on.bin:startup.s main.c
$(CC) $(CFLAGS) startup.o startup.s
$(CC) $(CFLAGS) main.o main.c
arm-linux-ld -Ttext 0x0c000000 -g startup.o main.o -o 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
复制代码

  东西很简单没什么好说的,在此记录,以免忘记,如有疑问或发现本文有何错误,欢迎提出。

---------------------------------------------------------------------------------------------------------------------------------------

作者:庞辉

出处:http://www.cnblogs.com/pang123hui/

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名庞辉(包含链接).



每天不用多,进步一点点就够了
原文地址:https://www.cnblogs.com/tobeprogramer/p/3030388.html