程序固化后运行方式:
程序开始运行后需要将RW 和ZI段搬移到RAM中去,程序下载进Flash中以后,上电后是怎样将RW ZI断搬移到RAM中去的?注意IAR和ADS在进行完.s文件的初始化以后都不是直接跳转到main函数去执行,IAR是跳转到?main中而ADS是跳转到__main函数中,在这些函数中根据icf文件的配置,将RW和ZI段搬移到icf文件规定的RAM区域中。如果程序的运行时域是在片外RAM中,那程序是在什么时候对片外RAM控制器进行初始化呢?因为.s文件的开始部分是CODE RO的,不需要RAM空间,所以可以在.s文件中对片外RAM进行配置。还有一个问题,这个问题是在硬件设计时必须注意的,如果需要程序固化在外部Flash中,必须注意外接的Flash必须是片子上电后默认片外总线就支持的片子。
程序在RAM中调试的运行方式
为了调试的方便,程序有时候是不需要下载进flash进行调试,而是直接在RAM中运行,将icf文件中的ROM 和RAM地址都设成硬件RAM的地址,将Flashloader的使能关掉,那么程序就运行在RAM中了。但是问题又产生了,因为有时我们想在外部RAM中调试代码,所以片外RAM控制器需要在代码下载进RAM之前进行初始化,怎么能够实现呢?IAR是通过.mac文件实现的。在程序下载之前先执行了。mac文件中的程序,下面是一个例子
execUserFlashInit()
{
__writeMemory32(0x1000ffef, 0xffe00000 , "Memory");
__writeMemory32(0x0f000114, 0xE002C014, "Memory");
}
该例子是lpc初始化外部RAM的例子。配置好了外部RAM就可以在里面跑代码了。
程序的IAR下载
1.文件在片内Flash中下载运行
这是最简单也是最常用的方式,一般的ARM芯片都会带有片内Flash,IAR会通过Flashloader将二进制的可执行文件下载到Flash中。下载的方式如下:如果要将程序B下载到片子里,IAR先将一个程序A(IAR事先编好的程序)下载到片内的RAM中,然后利用这个程序A通过JTAG和Flashloader交互完成程序B的下载。
2.文件在片外Flash中下载
IAR下载进RAM中的程序A必须支持片外的Flash,他能够完成片外Flash的擦除。往往这个程序需要自己写。像HJTAG的下载机制也是这样,HJTAG中列举了很多HJTAG支持的芯片,所谓支持就是HJTAG很有这些芯片的A程序。在HJTAG中必须要指定程序A将要下载到的RAM的地址,而且这个地址的RAM必须是可用的,比如如果用的片外SDRAM的话就必须初始化SDRAM控制器。这在HJTAG的Init Script中完成、在IAR的mac文件中完成。
3.文件在片内RAM中下载、文件在片外RAM中下载
由于这两种方式不需要Flashloader的参与,这时程序的加载时域和运行时域是相同的,程序运行后不涉及程序的搬移,所以只要给IAR指定运行时域的RAM地址就行了,如果是内部RAM,那非常省事,直接在icf文件中将地址都设置成内部RAM就行,如果是外部RAM那么在mac文件中初始化外部SDRAM控制器或者其他的RAM,然后IAR就可以完成将程序放在已经初始化好的外部RAM里,并运行。