0 如何做到简单
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灯。
1 项目源码
项目很简单,由三个文件组成:
.
├── 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-as
LD = arm-linux-gnueabihf-ld
OBJCPY = arm-linux-gnueabihf-objcopy
all: 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: clean
clean:
rm *.o start.bin start
2 运行说明
首先要把start.bin写入NandFlash的起始位置,然后从NandFlash启动就可以了。写入NandFlash的功能由Norflash里自带的U-boot就可以很方便的完成。
- 先通过开关设置为从Norflash启动,进如u-boot
- 然后选择菜单n进入tftp模式
- 然后在选择菜单a通过tftp把我们的程序start.bin写入Nandflash
- 关机
- 通过开关选择从Nandflash启动
此时可以看到底板上的LED1已经被点亮。
3 源码说明
源码及其简单
开头的8条跳转指令是CPU的中断向量表(注意:ARM的中断向量与X86的中断向量概念不完全一致,X86中断向量里存放的是跳转的目的地址,而ARM中断向量里存放的是跳转指令)
首先关闭看门狗,关闭中断。因为目前中断处理并没有完整实现,所以要把所有中断关闭。
之后就是点亮LED1的代码了