s3c2440使用JLINK调试中断程序

           我们知道,一般使用JLINK调试程序时是在SDRAM(0x30000000)中的,可是如果程序中包含有中断又该怎么办呢??因为中断程序向量表是存放在0x0开始的8*4个字节中的,而我们调试时程序试运行在SDRAM中的,很明显此事中断向量表不能正常加载,你能看到中断寄存器发生中断请求,但是看不到产生的现象,此时不要误认为你的JLINK有问题,事实上正版的JLINK也是如此,同样看不到现象,因为原因不在JLINK,而在中断向量表没能正确加载,下面简单说说这个问题的解决办法。

        为了实现在SDRAM调试时中断向量表的正确加载,我们需要使用MMU,关于MMU的具体原理,说实在的,我也不是很懂,只知道它能实现内存映射,将0x3000000地址映射到0x0地址处,这样程序在执行过程中,就能正常的找到中断向量表,实现中断程序的加载;不过光实现了 MMU进行了内存映射,还是不能看到中断过程一步步地执行的,这是因为硬件发生中断后,程序立即进行相应,相应完毕后继续进入等待中断状态,等待下一次中的来临,因此我们需要使用断点,添加断点以便看到单步执行的结果。

说聊这么多,是不还是不知道怎么搞,呵呵,下面上几张图片吧。

环境:mini2440+JLINK v8+keil MDK

①向主函数添加MMU_Init函数,实现内存的映射

s3c2440使用JLINK调试中断程序_第1张图片

②设置工程,懒得说了,看我的配置图片吧


s3c2440使用JLINK调试中断程序_第2张图片

s3c2440使用JLINK调试中断程序_第3张图片

s3c2440使用JLINK调试中断程序_第4张图片

③设置断点(一定要在中断服务函数里设置断点,否则仍然无法看到单步结果),如下

s3c2440使用JLINK调试中断程序_第5张图片

④正式开始调试,

s3c2440使用JLINK调试中断程序_第6张图片

s3c2440使用JLINK调试中断程序_第7张图片


最后来个简单小结吧:

个人不大推荐使用MMU,一来使用MMU进行内存映射的原理我不怎么懂,二来也没有多大必要,如果你要使用MMU进行内存映射实现所有程序在nor flash运行,那还不如不用MMU直接下载到nand flash运行,更直观易懂,而且nand flash掉电后程序是不丢失的,而使用MMU映射在nor flash运行,是掉电易失的,因为其不是真正的下载到了nor flash,而是将SDRAM映射到nor flash的0地址而已,本质还是在SDRAM,所以断点就没有了。不过有一种情况是没有办法的,那就是调试中断的时候,因为中断向量表并不在SDRAM中,而是在0x0地址处

你可能感兴趣的:(s3c2440使用JLINK调试中断程序)