mini2440的开发板有两种启动方式,一是从Nor Flash启动,一是从Nand Flash启动。
开始学习写关于LED 按键查询 蜂鸣器的汇编程序时,老师叫我们用Nor Flash启动,并选择[d] Download&Run。到后来学习按键中断时,老师说先从Nor Flash启动,并选择[a] Abosolute User Application,捎写完程序后,在关机,从Nand Flash启动,程序便可以运行了。
那么,这到底有什么不同呢?从Nor Flash启动捎写程序并运行程序和从Nand Flash运行程序有什么不同呢? 为什么按键中断程序就一定要从Nand Flash运行程序呢?....太多的疑问,只有搞懂了硬件之间的关系,才能深刻的理解。
先说从不同的启动模式,地址的映射关系吧:
从Nor Flash启动时,与nGCS0相连的外部存储器Nor Flash就被映射到nGCS0片选的空间。开机界面程序bios存放在Nor Flash中,开机后,系统将Nor Flash中的bios拷贝到内存(0x3000 0000到0x3400 0000)的从0x33DE 8000开始及以上的空间,并先运行bios程序。
(1)现在选择[d],系统将.bin的可执行文件下载到内存的从0x3000 0000开始及以上的空间,但是不能超出0x33DE 8000,并在内存中运行该程序。因为是直接将程序下载到内存,所以再次开机启动时,程序就没有了。
(2)现在选择[a],系统将.bin的可执行文件下载到nand Flash中,nand Flash中原有的东西就被覆盖了。但是,下次开机启动时,程序还再。
下面说说为什么中断程序要捎到Nand Flash中,再从Nand Flash中启动?
从Nand Flash启动时,内部的4K Bytes BootSram被映射到nGCS0片选的空间。系统启动后,Nand Flash中的东西也是拷贝到内存0x3000 0000处运行的,但是系统会认为是在0x000 0000,这是由硬件完成的。
中断程序的开始,有以下程序段:
AREA KEY_INTERRUPT,CODE,READONLY
CODE32
ENTRY ;INIT THE EXCEPTION VECTORS
B MAIN ;ADDRESS 0X0000_0000
NOP ; 0X0000_0004
NOP ; 0X0000_0008
NOP ; 0X0000_000C
NOP ; 0X0000_0010
NOP ; 0X0000_0014
B IRQ_KEY ; 0X0000_0018 ->address for irq exception vector addresses(you can find it in the exception vectors)
NOP
这里对地址有严格的要求,它需要B MAIN这条指令一定在地址0x0000 0000处,而从Nand Flash启动时,系统就是将从0x0000 0000处的地址映射到Nand Flash中的。也就是ENTRY后面的第一条指令的地址就认为是绝对地址0x0000 0000的。
为了检测如果从Nor Flash中启动是否也可以运行,我和同学编写了另一个小程序:
AREA KEY_INTERRUPT,CODE,READONLY
CODE32
ENTRY ;INIT THE EXCEPTION VECTORS
MOV PC,#0X00000000
; B 0x00000000 ;ADDRESS 0X0000_0000 用B是编译不了的,用LDR也是编译不了的
NOP ; 0X0000_0004
NOP ; 0X0000_0008
NOP ; 0X0000_000C
NOP ; 0X0000_0010
NOP ; 0X0000_0014
NOP ; 0X0000_0018 ->address for irq exception vector addresses(you can find it in the exception vectors)
NOP
END
运行结果:
将这个程序以第一种方式捎写入内存(即从Nor启动,选择[d]),运行结果是在超级终端上出现bios界面。也就是说 这种方式下,ENTRY后面的第一条指令的地址不是绝对地址0x0000 0000,绝对地址0x0000 0000是映射到内存0x3000 0000到0x3400 0000的某个空间。具体的说,就是
从0x33DE 8000开始存储的开机界面bios。这才符合运行结果。
将这个程序以第二种方式捎写入内存(即从Nor启动,选择[a],再关机,从Nand flash启动) 运行的现象是,选择[a],并用串口捎写了程序后,出现bios界面;再关机,从Nand Flash启动,观察运行结果,什么也没有。也就是说 这种方式下,ENTRY后面的第一条指令的地址就是绝对地址0x0000 0000,而第一条指令 MOV PC,0x0000 0000,则一直就在运行这条指令,死循环,什么现象都没有。
捎写完的结果是:
再关机,从Nand Flash启动,没有任何现象。
这时,有人可能会问这不出现了bios吗?注意它不是在运行时出现的,而是捎写完程序出现的。况且捎写到Nand Flash中的程序已经把开机bios程序覆盖了,这里还处于Nor Flash启动方式,出现的bios界面是与这个选择[a]的处理程序有关的,不信的话,可以随便捎写一个LED灯的程序进去,超级终端上还是出现bios界面的。这不是运行结果,运行结果是看关机后,再从Nand Flash启动后,运行的现象。
[
本帖最后由 Hellovictoria 于 2011-9-28 16:01 编辑 ]