专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

memcpy((unsigned char *)0x0,(unsigned char *)0x30000000,0x1000);

作者:佚名   来源:本站原创   点击数:  更新时间:2014年08月16日   【字体:

前些时候一直不明白"memcpy((unsigned char *)0x0,(unsigned char *)0x30000000,0x1000);"的用途,今天算是了解了,就是将异常向量表放到0地址处、发生异常的时候CPU总是跳转到这里取指执行。

 

如果这里没有异常向量表、异常就得不到处理、而且CPU还无法从这个区域返回到跳转之前的地方。

先贴图

图中左边是反汇编代码、可以看到机器码。

而且由于映像文件的入口地址Image entry point设为0x30000000、也就是使用调试器调试,

所以图中的代码是从0x30000000开始存放(标号'ResetEntry'在0x30000000地址处)。

注意每条语句的机器码(方括号'[XXX]'里面的数据)。

右边是打开的用来下载.bin文件、里面就是机器码。

它和反汇编里面的机器码一样、注意是little endian模式。

运行 memcpy((unsigned char *)0x0,(unsigned char *)0x30000000,0x1000);语句之前、0地址处的值都是FF。

运行完毕之后、0地址处的值如下图


这条语句是从0x30000000处开始、复制4K代码到0地址处。

上图中从0地址开始的代码和.bin文件里面的代码一样、而且只是前4K一样。

就我的板子TX-2440来说 :

如果是Norflash启动、那么0地址在Norflash,就是复制到Norflash。

如果是Nandflash启动、那么0地址在BootRAM,就是复制到BootRAM。

语句这样做的目的是将异常向量表复制到0地址处、因为发生异常的时候、CPU自动跳转到0地址处读取指令。

要是0地址处没有这个异常向量表、那么就无法处理异常,中断就无法执行,含有中断的程序就会出错,

CPU无法返回到跳转之前的地方。 

没有这条复制语句、那么0x0~0x30000000之间的内存里绝大多数是FF、少数是00 :

 

关闭窗口

相关文章