×
嵌入式 > 嵌入式开发 > 详情

Linux下ARM裸板程序编写

发布时间:2020-08-17 发布时间:
|
有些学习过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,#0x0STR R1,[R0]                @ 写入0,禁止WATCHDOG,否则CPU会不断重启LDR SP,=0x0c001000        @ 设置堆栈,注意:这时我们是将程序直接烧录到SDRAM中,所以堆栈要设置在SDRAM中@ 如果将程序烧在NAND FLASH中,需将堆栈改为1024*4,因为NAND FLASH中的代码@ 在复位后会移到内部RAM中,此RAM只有4KBL    main                @ 调用C程序中的main函数halt_loop:B    halt_loop    

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

最后是Makefile文件。

CC=arm-linux-gccCFLAGS=-g -c -oled_on.bin:startup.s main.c$(CC) $(CFLAGS) startup.o startup.s$(CC) $(CFLAGS) main.o main.carm-linux-ld -Ttext 0x0c000000 -g startup.o main.o -o led_on_elfarm-linux-objcopy -O binary -S led_on_elf led_on.binclean:rm -f led_on.bin led_on_elf *.o



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

热门文章 更多
PIC 如何设置更省电