经常在论坛里面,看到一些人说“程序跑飞了!”。以前我真不太理解这个词语,刚才看了个帖子,觉得有点收获,就写下来,希望对各位同仁有所帮助, 所谓“程序跑飞了”,就是程序找不到正确的地址去寻找应该执行的指令,这通常是在中断跳转,MMU设置相关。下面这个帖子就是这个原因。
http://topic.csdn.net/u/20090517/14/4664821b-b0b5-4142-bbf7-5a38e630e18a.html?seed=1566368328
引用 13 楼 xajhuang 的回复:
这个肯定不是,ARM中断产生后,会自动跳转到对应的中断地址,比如复位时跳到0,ISR 跳到 ISR 异常入口,当中断产生时,代码不是直接跳到中断程序中,而是进行了一次类似复位的操作,然后根据对应的中断异常再执行处理。
所以一般仿真器是不会自动找到中断程序的,一般的做法是在启动代码初始化完成,并且使能中断前,用MMU把你代码的ResetHandle地址映射到0地址,这样仿真器就能找到中断函数入口而不会跑飞。
还有一种可能就…
xajhuang 牛人说的很对!!!一般调试器不支持中断跳转的,可以通过MMU处理后支持调试器。
引用 18 楼 CBEMA 的回复:
搞定了,呵呵。每次弄明白了以后,都觉得自己很弱。
的确是mmu的问题。我把程序应映射到0x30000000的位置执行的话,必须在mmu中做一些处理,使得程序在取指的时候,能到0x30000000的位置开始。实际上,我以前改来改去程序经常跳到0x8或是0x4的位置,我就应该意识到内存映射出了问题。
现在我把程序放在0x0的位置开始跑,就ok了。这里不用启动mmu管理。
不过对于mmu的了解还是太少了,还得练啊,学武无止境哦,学学周伯通!做个武痴又如何?