TQ2440开发板学习纪实(1)---最简单的独立运行汇编程序

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的代码了

猜你喜欢

转载自blog.csdn.net/smstong/article/details/53064779