主题 : 关于调试裸机中断程序的一点见解 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 6629
精华: 2
发帖: 22
金钱: 230 两
威望: 78 点
贡献值: 2 点
综合积分: 84 分
注册时间: 2009-06-09
最后登录: 2011-08-15
楼主  发表于: 2010-03-14 11:16

 关于调试裸机中断程序的一点见解

管理提醒: 本帖被 kasim 执行加亮操作(2010-04-11)
说说我对裸机中断程序调试的一些见解。说的不对的地方请拍砖。

最近调试触摸屏裸机程序,下到SDRAM中就是进不了中断,在ADS下调试,触摸屏一发出中断就提示Dummy error......
后来想了一下,其实在ADS中调试中断这个方法论都是错误的,利用supervivi的download&run功能调试也是错误的。
因为两种情况下内部SRAM的地址0处都不存在你要调试的程序的中断向量表,不能正确将中断引导到你编写的中断服务程序中来。


解决办法:

1.直接烧写到nand第0块(如果代码大于4K,启动代码中必须要有拷贝到SDRAM功能)
2.改写自己的程序,在初始化中断之前将中断向量表拷贝到内部SRAM。这个方法貌似有点难度,小弟不才,没敢尝试。
3.利用MMU的重定向功能。这就是网上有人说要包含MMU.C然后主程序里面调用init_mmu的原因了。


armboy@qq.com
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2010-03-14 20:10
分析的不错,谢谢分享。
关于“.改写自己的程序,在初始化中断之前将中断向量表拷贝到内部SRAM。这个方法貌似有点难度,小弟不才,没敢尝试。”
U-Boot中已经有实现:
(来自http://repo.or.cz/w/u-boot-openmoko/mini2440.git/blob_plain/cf4bff27967b07a7abd859889a1a4010a46d802e:/cpu/arm920t/start.S)
复制代码
  1. #if defined(CONFIG_USE_IRQ) && (defined(CONFIG_S3C2410) || \
  2.     defined(CONFIG_S3C2440) || defined(CONFIG_S3C2442))
  3.     /* In the case of the S3C2410, if we've somehow magically (JTAG, ...)
  4.        ended up in RAM, then that ram is mapped to 0x30000000 and not 0.
  5.        So we need to copy the interrupt vectors, etc.  */
  6.     mov    r0, #0
  7.     ldr    r1, _TEXT_BASE
  8.     mov    r2, #0x40
  9. irqvec_cpy_next:
  10.     ldr    r3, [r1], #4
  11.     str    r3, [r0], #4
  12.     subs    r2, r2, #4
  13.     bne    irqvec_cpy_next
  14. #endif /* CONFIG_USE_IRQ */
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."