本文共 2184 字,大约阅读时间需要 7 分钟。
TQ2440开发板,采用的CPU是三星S3C2440,核心板附加了2MB运行ROM和64MB运行RAM,并且搭配了64MB的Nand Flash。而S3C2440直接支持从NandFlash启动,其原理就是加电后,CPU内使用硬件逻辑把NandFlash开头的4KB数据复制到片内称之为stepping stone的特殊内存中。这个特殊的stepping内存只有在设置为Nandflash启动时才可见,且只有4KB大小,内存地址范围为0x00000000-0x00000FFF。
就是这小小的4KB的stepping stone给了我们创造最简单独立程序的机会,只要我们保证最终生成的程序小于4KB,就可以完美地运行在这个stepping stone里面。而且基本不需要初始化任何硬件,CPU的硬件逻辑已经可以执行程序。尽管此时的CPU主频很低、SDRAM尚未可用、堆栈尚未初始化,然而这些都不影响我们的程序运行。
为了感受到程序的运行,我们实现的功能是点亮开发板上的第一个LED灯。
项目很简单,由三个文件组成:
.├── Makefile├── start.lds└── start.s
start.s
.equ WTCON, 0x53000000.equ INTMSK, 0x4a000008.equ GPBCON, 0x56000010.equ GPBDAT, 0x56000014.equ GPBUP, 0x56000018.text/* interrupt vector */ResetEntry: b ResetHandler b ResetHandler b ResetHandler b ResetHandler b ResetHandler b ResetHandler b ResetHandler b ResetHandler/* The first instruction to run */ResetHandler: /* disable watch dog */ ldr r0, =WTCON ldr r1, =0x0 str r1, [r0] /* disable all interrupts */ ldr r0, =INTMSK ldr r1, =0xffffffff str r1, [r0] /* turn on LED1 */ ldr r0, =GPBCON ldr r1, [r0] bic r1, r1, #0xC00 orr r1, r1, #0x400 str r1, [r0] ldr r0, =GPBUP ldr r1, [r0] bic r1, r1, #0x10 str r1, [r0]Led: ldr r0, =GPBDAT ldr r1, [r0] bic r1, r1, #0x10 str r1, [r0] b Led.end
start.lds
ENTRY(ResetEntry)SECTIONS { . = 0x00000000; .text : { *(.text) } .data : { *(.data) } .bss : { *(.bss) }}
Makefile
AS = arm-linux-gnueabihf-asLD = arm-linux-gnueabihf-ldOBJCPY = arm-linux-gnueabihf-objcopyall: start.bin cp $< /var/lib/tftpboot/start.bin: start $(OBJCPY) -O binary $< $@start: start.o $(LD) --script start.lds -o $@ $^start.o: start.s $(AS) -o $@ $^.PHONY: cleanclean: rm *.o start.bin start
首先要把start.bin写入NandFlash的起始位置,然后从NandFlash启动就可以了。写入NandFlash的功能由Norflash里自带的U-boot就可以很方便的完成。
此时可以看到底板上的LED1已经被点亮。
源码及其简单
开头的8条跳转指令是CPU的中断向量表(注意:ARM的中断向量与X86的中断向量概念不完全一致,X86中断向量里存放的是跳转的目的地址,而ARM中断向量里存放的是跳转指令)
首先关闭看门狗,关闭中断。因为目前中断处理并没有完整实现,所以要把所有中断关闭。
之后就是点亮LED1的代码了
转载地址:http://rnzpi.baihongyu.com/