NXP

ADS中调试中断函数时进不了中断服务函数的解决办法

2019-07-12 12:08发布

最近在ADS中调试ARM裸机中断,遇到了一个很大的问题-无法进入中断服务程序。 在调试触摸屏裸机程序过程中遇到了很奇怪的问题: 我用JLINK在线调试时,当选择开关打到nandflash时可以成功跳到中断服务程序, 但是当选择开关打到norflash时,再下到SDRAM中就是进不了中断,在ADS下调试触摸屏中断实验时,一按触摸屏发出中断就提示Dummy error......
经过参考后发现因为内部SRAM的地址0x0处都不存在你要调试的程序的中断向量表,不能正确将中断引导到你编写的中断服务程序中来。
我们知道,一般使用JLINK调试程序时是在SDRAM(0x30000000)中的,可是如果程序中包含有中断又该怎么办呢??因为中断程序向量表是存放在0x0开始的8*4个字节中的,而我们调试时程序试运行在SDRAM中的,很明显此事中断向量表不能正常加载,你能看到中断寄存器发生中断请求,但是看不到产生的现象,此时不要误认为你的JLINK有问题,事实上正版的JLINK也是如此,同样看不到现象,因为原因不在JLINK,而在中断向量表没能正确加载,下面简单说说这个问题的解决办法
中断向量表地址在0x00000000,程序放到ram时,必须要把向量表放在0x0处。在不开启mmu是那就得把程序下到norflash,如果开启mmu则须把入口地址映射到0x0
综上所述,解决方法如下:
1.直接烧写到norflash(如果代码大于4K,启动代码中必须要有拷贝到SDRAM功能)。 2.改写自己的程序,在初始化中断之前将中断向量表拷贝到内部SRAM。这个方法貌似有点难度,汇编要比较牛才行。 3.利用MMU的重定向功能。这就是网上有人说要添加MMU.C和MMU.H.然后主程序里面调用init_mmu()。 由于烧写到nandflash比较方便,个人比较倾向于第三种解决方案。
直接将程序下载到flash运行的情况: 1.在不开启mmu时那就只有把程序下到norflash才可以可以运行,因为程序可以在Boot Internal SRAM (4kb)或者是Norflash0x0地址开始运行。 2.而当程序下载到nandflash时,它是只读的,程序将被加载到SDRAM的0x30000000开始执行,这时则要开启mmu把sdram的地址0x30000000入口地址映射到0x0, 否则将找不到中断服务入口地址。