
381-643196-5、381-643196-5
APPLIED381-643196-5在嵌入式系统中,映像文件都是存储在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可以根据页的大小进行类似的改进。3.3程序的跳转针对本文所论及的系统,当系统加电或复位后,首先NandFlash中的前4KB由硬件拷贝到位于040000000处的大小为4KB的内部SRAM中,然后此SRAM被映射到BankO处(Ox00000000)。PC从000000000处取指令执行。当遇到B或BL等跳转指令时,它会跳到当前地址加上一个偏移量的位置,它们属于相对跳转,它们的跳转范围是±32MB,这使得B或BL指令不依赖于代码的存储位置,此时这些地址为加载时域的地址。在嵌入式系统中,还有一种实现长跳转的方式,就是使用ldr指令,它町以实现程序的绝对跳转,跳转范围为4G空间。VIVI中实现程序跳转的代码为:@jumptorain<l>ldrr1.=on_the_ram<2>addpc,r1,#O<3>1:blb@infiniteloop<4>on_the_ram:上文提到了加载时域与运行时域的概念,此时第<1>行获取的on_the_ram的地址就是运行时域的地址,此地址由上述链接脚本文件决定,第<2>行跳转到SDRAM中的on_the_ram处。为了进一步深入说明程序的跳转,可以利用VIVI的反汇编文件来查看上述代码的反汇编情况。现分别给出此段代码下载时域和运行时域的存储布局。下载时域此段代码在内部SRAM中的存储布局为:<1>000000dc:e59f1278ldrrl,[pc,#278];035c<2>000000eO:e281f000addpc,rl,#0<3>000000e4:eafffffebOxe4<4>000000e8<on_the_ram>:...<5>00000358:000055aaandeqr5,rO,r10,lsr#ll<6>0000035c:33f000e8mvnccsrO.#240运行时域此段代码被拷贝到SDRAM中的存储布局:[1]33fOOOdc:e59f1278ldrr1,[pc,#278][2]133f000eO:e281f000addpc,rl,#0[3]133mooe4:eaffffffebOxe4[4]33fOOOe8<on_the_ram>:...[5]33f00358:000055aaandeqr5,rO,r10,lsr#11[6]33f0035c:33fOOOe8mvnccsrO,#240系统加电或复位从基地址000000000运行到上述代码的第<1>行时,r1获得地址00000035c处的值,从第<6>行知道此地址处的值为33f000e8,运行到第<2>行处,进行跳转,由于此时程序映像已经拷贝到SDRAM中,程序就跳到了运行时域此段代码的第[4]行处断续执行下面的程序,从而实现了程序从SRAM到SDRAM的跳转。4结语BootLoader的设计是嵌入式系统中的重要环节,它为系统的正常启动完成了一系列的初始化工作,设计一个简单高效功能强大的BootLoader是嵌入式系统设计中一项重要工作。本文的创新点:<l>深入研究和分析了VIVI如何实现自己拷贝以及拷贝后如何实现程序的跳转,并给出了原理性和实验性的说明;<2>对程序进行了改进,主要体现在拷贝的代码量上及VIVI的链接脚本上,使程序设计更合理。ABBPM645AABB200-APB12ABB200-IT8ABBCI810AABBCI810V2ABBDFM02ABBRAIO-01ABBTU830ABBDSDO131ABBDSDO115ABBDSAX452ABBCI627200-BPN492897301200-C1485G492897601200-CICN492897801200-CIE492897701200-PSMG4928988013BSC950019R1TK520V0303BSC950055R1TK576V0503BSC950056R1TK576V1153BSC950073R273BSC950098R13BSE016239R1PM510V083BSE016240R1PM510V16AI6203BHT300005R1AI6253BHT300036R1AX6703BSE000566R1CI520V13BSE012869R1CI5223BSE012790R1CI522A3BSE018283R1CI5263BSE006085R1CI532V023BSE003827R1CI532V043BSE003829R1CI5403BSE001077R1CI5603BUC98002R0001CI5703BSE001440R1CI6103BHT300003R1CI615K013BSE000756R1CI6303BSE011000R1CI630K023BSE011002R1CI6703BHT300017R1CI810B3BSE020520R1CI820-23BSE013202A1CS5123BUR980009R1CS5133BSE000435R1CS513K023BSE004773R1CS513K043BSE055760R1DI6213BHT300012R1DO6103BHT00006R1DO6303BHT300007R1DSAI13357120001-PSDSAI11057120001-DPDSAI13057120001-PDSAI1455712001-HADSAI1463BSE007949R1DSAI15557120001-HZDSAI155A3BSE014162R1DSAO11057120001-ATDSAO13057120001-FGDSAO12057120001-EYDSAO120A3BSE018293R1DSBC17257310001-KD/5DSBC17357310001-KHDSBC173A3BSE005883R1DSCS14057520001-EVDSDI110A57160001-AAADSDO12057160001-AKDSDO11057160001-KDSDP15057160001-GFDSDX1803BSE003859R1DSDX180A3BSE018297R1DSDX4525716075-PDSPC45257310303-ADSPU1313BSE000355R1DSRF1993BSE019299R1DSRF1853BSE004382R1DSRF1863BSE004383R1DSRF1873BSE004985R1DSRF187A3BSE014452R1DSSR17048990001-PCDSSS1713BSE005003R1DSTA00157120001-PXDSTA001B3BSE018316R1DSTA002B3BSE018317R1DSTA13157120001-CVDSTAN0133BNP000177R1DSTA002P3BSE018331R1DSTC40657520001-DX/1DSTC4525751017-A/2DSTD10857160001-ABDDSTD1903BSE004723R1DSTD1973BSE004726R1DSTX1803BUR980025R1GJR5250000R035307KR91BGJR5251000R030307KP90GJR5251063P1GJR5251400R320207DC91GJR5251500R110107MK92GJR5252100R010107KT94CI8603BSE032444R1CI860K01AI8353BSE008520R1AI835A1SBP260052R1001ICMK14N11SNA645524R2300OBROC200-IA8S200-IA8200-IE8490176097S200-IE8200-TB3T490176065200C-IB10xOB6P492960133200C-IB16492933501200C-IE8492933801200C-OB16P4929337013BDH000032R1FI830F3BSC950192R1TK850V007GJR5252300R010107AC91GJR5252400R010107DI92GJR5252800R010007KT95GJR5252800R020007KT95GJR5253000R016007KT97CGJR5253000R020007KT97GJR5253000R026207KT97BGJR5253000R026807KT97BGJR5253000R027507KT97BGJR5253000R027807KT97BGJR5253100R016007KT98E2IH530EN3BSE001248R1IH532EN3BSE018795R1IH540DE3BSE003210R1IH540EN3BSE001252R1IH5703BSE001253R1IH5803BSC640001R1ISAP212000R0001TU516TU516APM150V083BSE003641R1PM253V01492943601PM5103BSE000270R1PM510V083BSE008373R1PM510V163BSE008358R1PM511V083BSE011180R1PM511V163BSE011181R1PM6323BSE005831R13BSE022255R13BSE022256R13BSE022257R13BSE049768R1AI210492953101AI8013BSE020512R1AI8103BSE008516R1AI8203BSE008544R1AI8303BSE008518R1AI830A3BSE040662R1AI8453BSE023675R1AI8903BSC690071R1AI8953BSC690087R1AM811F3BDH000050R1AO8013BSE020514R1AO8103BSE008522R1AO810V23BSE038415R1AO8203BSE008546R1AO8453BSE023676R1AO845A3BSE045584R1AO8903BSC690072R1AO8953BSC690087R1CI8013BSE022366R1CI810V13BSE008584R1CI8203BSE013200R1CI820-13BSE013201A1CI820V13BSE025255R1CI8303BSE013252R1CI8403BSE022457R1CI840A3BSE041882R1CI8543BSE025347R1CI854A3BSE030221R1CI854AK013BSE030220R1DI210492953401DI8013BSE020508R1)