程序在RAM中調(diào)試的運(yùn)行方式&程序固化后運(yùn)行方式
程序開(kāi)始運(yùn)行后需要將RW 和ZI段搬移到RAM中去,程序下載進(jìn)Flash中以后,上電后是怎樣將RW ZI斷搬移到RAM中去的?注意IAR和ADS在進(jìn)行完.s文件的初始化以后都不是直接跳轉(zhuǎn)到main函數(shù)去執(zhí)行,IAR是跳轉(zhuǎn)到?main中而ADS是跳轉(zhuǎn)到__main函數(shù)中,在這些函數(shù)中根據(jù)icf文件的配置,將RW和ZI段搬移到icf文件規(guī)定的RAM區(qū)域中。如果程序的運(yùn)行時(shí)域是在片外RAM中,那程序是在什么時(shí)候?qū)ζ釸AM控制器進(jìn)行初始化呢?因?yàn)?s文件的開(kāi)始部分是CODE RO的,不需要RAM空間,所以可以在.s文件中對(duì)片外RAM進(jìn)行配置。還有一個(gè)問(wèn)題,這個(gè)問(wèn)題是在硬件設(shè)計(jì)時(shí)必須注意的,如果需要程序固化在外部Flash中,必須注意外接的Flash必須是片子上電后默認(rèn)片外總線就支持的片子。
本文引用地址:http://www.104case.com/article/201611/321235.htm程序在RAM中調(diào)試的運(yùn)行方式
為了調(diào)試的方便,程序有時(shí)候是不需要下載進(jìn)flash進(jìn)行調(diào)試,而是直接在RAM中運(yùn)行,將icf文件中的ROM 和RAM地址都設(shè)成硬件RAM的地址,將Flashloader的使能關(guān)掉,那么程序就運(yùn)行在RAM中了。但是問(wèn)題又產(chǎn)生了,因?yàn)橛袝r(shí)我們想在外部RAM中調(diào)試代碼,所以片外RAM控制器需要在代碼下載進(jìn)RAM之前進(jìn)行初始化,怎么能夠?qū)崿F(xiàn)呢?IAR是通過(guò).mac文件實(shí)現(xiàn)的。在程序下載之前先執(zhí)行了。mac文件中的程序,下面是一個(gè)例子
execUserFlashInit()
{
}
該例子是lpc初始化外部RAM的例子。配置好了外部RAM就可以在里面跑代碼了。
程序的IAR下載
1.
這是最簡(jiǎn)單也是最常用的方式,一般的ARM芯片都會(huì)帶有片內(nèi)Flash,IAR會(huì)通過(guò)Flashloader將二進(jìn)制的可執(zhí)行文件下載到Flash中。下載的方式如下:如果要將程序B下載到片子里,IAR先將一個(gè)程序A(IAR事先編好的程序)下載到片內(nèi)的RAM中,然后利用這個(gè)程序A通過(guò)JTAG和Flashloader交互完成程序B的下載。
2.
IAR下載進(jìn)RAM中的程序A必須支持片外的Flash,他能夠完成片外Flash的擦除。往往這個(gè)程序需要自己寫。像HJTAG的下載機(jī)制也是這樣,HJTAG中列舉了很多HJTAG支持的芯片,所謂支持就是HJTAG很有這些芯片的A程序。在HJTAG中必須要指定程序A將要下載到的RAM的地址,而且這個(gè)地址的RAM必須是可用的,比如如果用的片外SDRAM的話就必須初始化SDRAM控制器。這在HJTAG的Init Script中完成、在IAR的mac文件中完成。
3.
由于這兩種方式不需要Flashloader的參與,這時(shí)程序的加載時(shí)域和運(yùn)行時(shí)域是相同的,程序運(yùn)行后不涉及程序的搬移,所以只要給IAR指定運(yùn)行時(shí)域的RAM地址就行了,如果是內(nèi)部RAM,那非常省事,直接在icf文件中將地址都設(shè)置成內(nèi)部RAM就行,如果是外部RAM那么在mac文件中初始化外部SDRAM控制器或者其他的RAM,然后IAR就可以完成將程序放在已經(jīng)初始化好的外部RAM里,并運(yùn)行。
評(píng)論