GE IS210DTAIH1A(IS200DTAIH1A)
IS210DTAIH1A(IS200DTAIH1A)
IS210DTAIH1A(IS200DTAIH1A)
NandFlash使用I/O口串行地存取数据,它不映射到存储空间中任何一个BANK区域上.对NandFlash的渎写操作通过串行数据总线进行传输。NandFlash以页(page)为单位进行读写,以块(block)为单位进行擦除,本文用到的NandFlash页(page)大小为(512+16)Byte,块(block)大小等于32个页的大小。每页的最后16Byte不用于存储程序数据,它主要用于存储ECC校验、标志位等信息。对NandFlash的操作主要是通过向NandF1ash控制器发送命令来进行的,对不同型号的NandFlash,其命令有所不同。由于NandFlash以块(block)为单位进行擦除,以页为单位进行写入,所以擦除与写入的速度都很快。
由于NandFlash不能芯片内执行,S3C2410必须提供一种机制支持从NandFlash启动。S3C2410提供了这样一种机制,当设置为Nandflash启动时,系统加电或复位后,使能NandFlash控制器的自动启动模式,NandFlash中的前4KB代码自动地被拷贝到位于CPU内部的称为Steppingstone的SRAM中,这是启动代码的第一次拷贝,这次拷贝由硬件自动完成.然后这块SRAM被映射到存储空间中的000000000处,CPU从这个地址处开始执行启动代码。
由于CPU内部的SRAM仅有4KB,不能保证整个VIVI都被从NandFlash中拷贝到CPU内部的SRAM中,所以这前4KB的代码要保证完成把整个VIVI从NandFlash拷贝到执行效率更高的RAM中运行以及程序的跳转任务,此时从NandFlash到SDARM的拷贝过程就是所谓的软件拷贝。
3程序拷贝过程分析
3.1VIVI的编译与链接
编泽器对程序的处理要经过预编译阶段、编译阶段、汇编阶段及链接阶段,每个目标文件都有一系列段(section),输入文件的段(section)称为输入段(inputsection).输出文件的段(section)则称为输出段(outputsection)。在VIVI的链接过程中,用到了一个链接脚本文件,它描述了各个输入文件的各个段(section)如何映射到输出文件的各个(section)中,并控制输出文件中secrion和符号的内存布局,此内存布局决定了VlVI的运行时域。在此阶段,链接器LD利用链接脚本把各种目标文件和库文件链接起来,并重定向它们的数据,完成符号解析,最后把所有的目标文件链接成为一个可执行的目标文件,即为可烧写到Flash中的VIVI映像。针对本系统开发板的VIVI链接脚本对原链脚本进行了改进,添加了第<6>行,下文的论述会用到此处的变量viviend。
<1>SECTIONS{
<2>.=033f00000;
<3>.text:{*(.text)}
<4>.dataALlGN(4):{*(.data)}
<5>.bssALIGN(4):{*(.bss)*(COMMON)}
<6>vivi_end=.:
<7>}
其中:SECTIONS表示段。第<2>行表示当前地址为033f00000,它是text段的起始地址,也是运行时域的起始地址。第<3>行用了通配符*表示所有字符,这里的意思就是说指定的每个目标文件的textsection的内容都放到同一个.text中。第<4>行表示指定的每个目标文件的datasection的内容都放到问一个.data中,而且要四字节对齐。每<5>行表示指定的每个目标文件的bsssection的内容都放到同一个.bss中,所有的普通符号都放到COMMON中,也要四字节对齐。第<6>行是把当前地址赋值给变量vivi_end,它也是运行时域的末地址。
3.2程序拷贝的改进
在嵌入式系统中,映像文件都是存储在Flash存储器等一些非易失性器件中的,而在运行时,映像文件中的RW段必须重新装载到可渎写的RAM中。这就涉及到映像文件的加载时域和运行时域:加载时域就是指映像文件烧入nash中的状态,也就是映像文件运行之前的地址;运行时域是指映像文件执行时的状态,针对本文提到的NandFlash启动方式可以这么理解加载时域与运行时域:加载时域的起始地址从(映射后的内部SRAM处)000000000开始,运行时域的地址从033f00000开始。由于加载时域与运行时域的地址不同,从加载时域到运行时域的转换要由系统引导程序完成,所以VIVI必须进行数据和代码的拷贝及程序跳转工作,以完成从加载时域到运行时域的转换。
VIVI的拷贝首先要确定拷贝的起始地址和目标地址,还要确定要拷贝多少代码。在此笔者对所搬运代码量进行了改进,下面是改进前的代码:
<l>ldrr0,=VIVI_RAM_base
<2>movrl,#Ox0
<3>movr2,#020000
<4>blnand_read_ll
其中:第<1>行:获取VIVI在RAM中的基地址VIVI_RAM_base,也是运行时域的首地址。第<2>行:获取VIVI映像在Flash中的起始地址OxO。第<3>行:获取拷贝的代码量020000。第<4>行:跳转到nand_read_ll函数,它是用C语言写的拷贝函数(略)。此时寄存器rO,rl,r2是传递给函数nand_read_ll的三个参数。
程序这样设计的缺点是不论VIVI映像有多大,它都会拷贝128KB的代码量,这样造成时间及空间的浪费或者拷贝不完整,为此笔者对上述代码进行改进:
[1]ldrr0,=VIVI_RAM_base
[2]ldrr2,=vivi_end
[3]subr2,r2,r0
[4]movr2,r2,lsr#9
[5]movr2,r2,lsr#9
[6]addr2,r2,#0200
[7]movr1,#OxO
[8]blnand_read_ll
代码中用到了外部变量vivi_end,它是在链接脚本文件中定义的,是VIVI映像运行时域的末地址,在此代码中使用前要用如下语句进行声明:
.externvivi_end
其中:第[l]、[7]、[8]行的解释分别与未改进前的第<l>、<2>、<4>行。第[2]行:获取VIVI映像运行时域的末地址。第[3]行:获取拷贝的真实代码量。第[4],[5],[6]行:上文论述到NandFlash是按页进行读写的,本文用到的NandFlash每页有(512+16)Byte,实际用于存储映像文件的是每页的前512Byte。所以需要对上述“真实代码量”进行调整,把它调整为整数页大小,它的大小必须是页对齐的。首先把它的低9位调整为0,即是把代码量不足512Byte的部分清零,然后再加1页(page)大小(Ox200)以保证VlVI数据的完整性,这就是第[4],[5],[6]行的作用。对此代码进行改进后,拷贝的代码量更接近实际的代码量,拷贝的冗余代码量不会达到1页(page)的大小。对于其它类型的NandFlash可以根据页的大小进行类似的改进。
P
GE SB365RGR
GE SL325RGR
SQUARE LEL36200LIG
GE SB365R
GE SL365R
GE SL325R
GE AC325R
Square MHL3660033DC1680
Square MHL361200
Schneider JLL36175
Cutler AN16SNOAB
MERLIN NSJ400H
GE AC315HJK4
SIemens VL1250
SQUARE PGA36100
Square MHL3670035DC1616
SIemens VL1250N
Square MJA36300
Cutler KD3400
GE SPE120
ABB S6NQ800TW
Siemens RV325G
Square S163A
GE SB465RGR
GE SL465R
GE SL425RG
GE AC465RGR
GE AC425R
Square MHL3610001212
Cutler ELHFD3050L
Square S144A
Square LC36450
INDRAMAT TCM1108W0
INDRAMAT NAM1.3-15
Siemens 6EC3 652-0A
Danfoss BS03-37V/D05LA4
AB 32-16
AB 17SLOT
AB 1762-L40BXB
Simatic 6ES7321-1BL00-0AA0
Telemecanique BMXDDI3202K
Murr 85068
Simatic 090-8ME11
Phoenix 2754338
SCHLEICHER MDE214-48
AB 100L-A20ND4
Siemens 6SE3190-0XX87-8BF0
Pilz PNOZXV2P
Siemens 3RT1055-6AP36
Siemens 3RK1105-1BE04-3CA0
Siemens 6SE3290-0XX87-8PB0
Simatic 470-7LA12
Festo DNC-32-500-PPV-A
Simatic 451-4UA13
AB 1756IB32
Siemens 6SE6420-2AB15-5AA1
Simatic 456-4UA12
GENO-Rohrtrenner RTB1DN25
Siemens 6FX1806-0BX02
Simatic 6ES5470-4UA12
MURR MDG3040024
Simatic 158-0AD00-0XA0
Siemens 6GK1502-2CA10
Schneider TSXDPZ10D2A
Festo 41525 18210
Siemens 6DS1326-8AA
Simatic 314-3UH12
Simatic 6ES7 331-7KF02-0AB0
Herberholz GTD-096/090-V17-G
Simatic 6ES5 254-4UB11
Messumformer 7MA2031-2CB00-0AA0
PMA 9404 407 72002-011
VWR 986962
PARKER OEM300
Supermicro AOC-2025SA
BROOKS MF50S
ADVANTECH SOM-5786
EMACS R3G-6650P
Samsung 264DC4-667 - 667-MHZ
MINICOM 0SU4107/AP
Telecommunications MC6000
PMK 323A-110
IBM 75F6750-10
BROOKS AM-3004-2
Lenze 00384003
Simatic 6ES5095-8MA03
Simatic 6ES5 451-8MA11
Telemecanique D65008BD
Simatic 6ES5465-4UA11
Lenze E82EV152K4B
ASM WS1.2-375-420A-L10
Simatic 321-1EL00-0AA0
AFC REV1A 8100-0462
Mc 480-E00531-100
EMS CIMR-XCBUA0P7
EXATRON 5000-397-B
EXATRON 6000-517-A
APPLIED 0020-20113
CORECO XR-M130-18300
Deublin 20403-340-302
FUJI EG102CUL
EXAIR 7901
POWERTEC 9J5-300-13
ELIWELL 280
APC AP7911
RENISHAW RGH22B50L00
CURTISS 5453J-S-1G-L
HP E3611A
Sun Microsystems ULTRA-320
ADVANTECH PCM-9690
FORE ASX-200bx
YASKAWA SGDH-01BE h
HP 04085-66562
Advantech IPC-100 - 1U
ADVANTECH PCA-6276.
NOVELLUS 60-139978-00
APPLIED 23PN0100
HEIDENHAIN 369428-06
ADVANTECH MIC-3301
EGS GLQ-05-200
ADVANTECH PPC-100 WEBOIT-1000
ADVANTECH PCM-9681
Advantech UNO-2105CB
ADVANTECH PCM-9361EG
ADVANTECH PCM-9362NC
IKO LRXSG30
BROOKS 5964C
Advantech PCI-6881
Interconnect 8225-6000
ADVANTECH 1906064203
SONY SDX-420C
ANORAD PC-SERV-3
APPLIED 0150-09351
LAM 853-026078-025
GE GL-4C35
PHOTOMETRICS 57-10
FUJITSU RM10S-SSM
KAPAREL PS4734-5
CPI YU-191A
SUN 540-5559-01
QUARTZ DSS-450
ACDS 98044
IPC C16BM-B1
IPC C16BM-B1
TELECT 005-0005-0002
National GPIB-SPRC-S.U.S
INFICON FL-9496
ADVANTECH 2718 16
AGILENT HFBR-762B
Applied 3540i
TRENTON BPG6600
HP 16320-66551
BROOKS 6256
MARVAC A-20
Coreco XR-M130-18306
Lightwave 3200
MOXA ED6008
NAVITAR 1-61448
CARD PAC-SDD-02A-V2.0 hold
Dell 1950
Dell 1950
Toshiba IK-M43
Toshiba IK-M43
GLENTEK SMC9915-1D-1
GLENTEK SMC9915-1D-1
Vivid CLV-401
SEIKOSHA VP-4500
SONY LIB-81
DELTA RPS-700-2
Roper 01-376-004
APPLIED 0150-12117
APPLIED 0150-09351
PACK AK-BX551C
ADVANTECH AIMB-270-A1
APPLIED HT34-486
PELCO ERD97P21-U
AML 149-0831-30
ADVANTECH POD-6706
APPLIED 3870-02579
DELTA 603672-109
ADVANTECH 2A-100 1U
Spellman PTV5P300X2094
BIRD DA-140/AD
MKS 290C-12272
ADVANTECH PPC-60S-RT 386
Hamamatsu R6095
Advantech UNO-2171-P12E
APC AP7998
IWAKI FA-2E-S
CISCO 73-3903-08
CISCO FE-511-K9
AGILENT HFBR-712BP
APPLIED 0240-75106
AXIS 8800-0033
NANOMETRICS 8200-0298
XP 4004-0006
TOKYO CT0EE-T00499-1
NEI 702-1002-OQ
HP HDMP-1032KF
XANTREX 300-2
HAMAMATSU F15014
KLA-TENCOR 0058069-000
Keyence MS2-H150
XYCARB 255860
APPLIED 0190-09900HOT
FESTO CRVZS-20
ACDS BRC22A
APPLIED 0190-15137
BALDOR NB0258A00
APPLIED 3870-01471
HP C7369-20821
ADTRAN 1202890E1
ADVANTECH MIC-2000/8
DELTA 603437-104
DANAHER 30209
DANAHER 30051
FISHER 506D
MPS SPSS811-1-LF
ADVANTECH ISP-103
AGILENT HFBR-772BE
APANTAC DA-HDTV-SDI
Advantech 6201
ANORAD 69080-LP
DALSA-CORECO XP-2631
KOLLMORGEN EM19-28030-BC3
CISCO DS-SFP-FC8G-LW 10-2459
Mellanox MHGA28-ITC
SCHAFFNER FN351H-64-33
ADVANTECH 5501E
SIEMENS A9B10040657
TOKYO 3D10-202405-13
ALLIED 12-PORT