以JLINK为例,我们知道,在使用JLINK过程中,如果除去IAR,AXD等开发工具的支持,单纯使用JLINK提供的JLINK ARM对MCU进行烧录,运行的话,首先需要在JLINK ARM内建一个工程,对工程进行设置,主要包括MCU型号,片内FLASH,片外FLASH等的型号等,其中对MCU的设置,主要指定MCU内片内SRAM的地址,是否含有片内flash等信息,flash芯片的相关信息主要指定所使用的flash NORFLASH芯片的读写规则,主要指位宽,扇区大小,芯片容量等信息。除此之外再JLINK ARM工程内主要包括的就是JLINK时钟频率等通用信息了。
在JLINK ARM工程内,应该说最重要的就是JLINK 进行仿真过程执行前进行的准备工作了,对该部分内容我的理解是,首先在进行JTAG口进行调试的过程,实际上也是一个使用JLINK对MCU硬件进行编程的过程,是JLINK通过MCU向MCU内相关的地址进行数据传输的过程,在该过程中MCU也是在正常运行的,也就是说如果在仿真时需要写入Nor flash 或者SDRAM,都是需要首先对相关的寄存器进行设置的,否则MCU并不能够访问与自身连接的SDRAM,Nor flash等设备。而这就需要JLINK在进行对MCU外围设备进行写入操作之前初始化相应的环境,也就是初始化MCU相应的寄存器,这样做的目的是将MCU带入一个确定的初始化状态,在该状态下,MCU能够正常访问自身的SDRAM,Norflash等外设。
为了达到这一状态,JLINK一般的执行过程就是首先重启MCU,为了防止JLINK在烧录MCU过程中受到其他中断等异常向量的干扰,需要执行关闭看门狗,关闭中断响应等操作,接着对MCU内与写入数据的外(SDRAM,Norflash等)相关的寄存器进行配置,使各个外设能够正常访问了,就可以通过JLINK向MCU相关外设写入编译后的程序了。
在进行烧录完毕后就可以重启MCU使MCU自动执行程序了,这个过程又涉及很多内容,如果当时烧录的是片内flash,或者为片外Norflash的话,MCU断电自动启动读取相应的程序,而如果直接写入的为SDRAM,SRAM的话,则只能进行线上调试,也就是只能工作AXD,GDB等调试工具通过JLINK进行调试,断电后内容自动消失。但是二者之间的区别就是使用SRAM,SDRAM进行数据写入速度快,调试速度也比较快,这样能够大大提高调试的速度,因此在开发过程中一般是使用SRAM,SDRAM对工程进行调试工作的,在产品中使用flash的方式。
再说一下使用JLINK在集成开发环境下的启动,使用过程,这里,我们一JLINK配合IAR为例来说明,在IAR下使用JLINK需要的配置项非常简单,就是一个.mac结尾的初始化文件,该文件与在JLINK ARM工程中的初始化的过程一样,同样是进行烧录环境的初始化。只是两者语句上略有差异,但所使用的寄存器,初始化值都是相同的。
最后总结一下仿真器执行过程,首先明确,仿真器并不是直接向MCU的相关管脚写入数据的,仿真器只是通过JTAG口向MCU发出相关的指令,通过MCU向MCU自身相关的 管脚输入出 数据。也就是说,JLINK烧录是不可能越过MCU的一环的,烧录首先需要使MCU正常工作,MCU能够正常访问外设(SDRAM,SRAM,Norflash)的话JINK才能执行相应的写入操作。其次,为了使MCU进入这个适宜烧录的确定状态所执行的那些诸如关闭看门狗寄存器,中断寄存器等的执行过程只是一个在烧录过程中所执行的,与烧录的程序无关,也就是编写的嵌入式程序首先依然要执行这个初始化的过程,JLINK所执行的烧录过程只是进行烧录,烧录完成后,会自动重启MCU,初始话所写入的寄存器也就无效了。
所以其实使用仿真器进行硬件仿真所调用的初始化寄存器与程序运行后的过程是无关的,不能将二者混淆。
以上,已经将我对仿真器的理解进行了说明,上述如有不妥,请各位看官不啬赐教,共同讨论。 |