主题 : 关于调试裸机中断程序的一点见解 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
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
发帖: 5407
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11054 分
注册时间: 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."
级别: 新手上路
UID: 5952
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
贡献值: 0 点
综合积分: 14 分
注册时间: 2009-05-14
最后登录: 2012-03-02
2楼  发表于: 2010-03-27 21:40
好好 好
谢谢
QT 的布局怎么搞?
级别: 侠客
UID: 5575
精华: 0
发帖: 81
金钱: 485 两
威望: 193 点
贡献值: 0 点
综合积分: 162 分
注册时间: 2009-04-29
最后登录: 2013-12-02
3楼  发表于: 2010-05-14 08:38
用MMU最简单了。映射一下就ok了。
具体代码请参考韦东山的MOS源代码。
SBC2410+8' LCD
mini2440+NEt 3.5'
级别: 新手上路
UID: 13065
精华: 0
发帖: 25
金钱: 125 两
威望: 25 点
贡献值: 0 点
综合积分: 50 分
注册时间: 2010-01-18
最后登录: 2017-04-17
4楼  发表于: 2010-10-08 11:41
对于我来说,还是很有难度的。需要些时间来慢慢的理一理才行。
dlq
级别: 新手上路
UID: 8640
精华: 0
发帖: 10
金钱: 50 两
威望: 10 点
贡献值: 0 点
综合积分: 20 分
注册时间: 2009-08-31
最后登录: 2015-10-28
5楼  发表于: 2010-12-13 17:24
怪不得今天调试了一天都不行,就是进不去中断,看了这篇帖子,在主程序中加入MMU_Init();把mmu.c拷贝到工程目录下,就OK了,谢谢。
级别: 新手上路
UID: 30099
精华: 0
发帖: 6
金钱: 30 两
威望: 6 点
贡献值: 0 点
综合积分: 12 分
注册时间: 2010-10-11
最后登录: 2011-01-04
6楼  发表于: 2010-12-21 23:30
顶顶顶
级别: 新手上路
UID: 45162
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
贡献值: 0 点
综合积分: 32 分
注册时间: 2011-05-02
最后登录: 2012-12-23
7楼  发表于: 2011-05-02 16:44
呵呵,已注册就看到这篇,学习了
级别: 侠客
UID: 39689
精华: 0
发帖: 70
金钱: 350 两
威望: 70 点
贡献值: 0 点
综合积分: 140 分
注册时间: 2011-03-11
最后登录: 2012-04-22
8楼  发表于: 2011-05-17 12:36

 回 1楼(kasim) 的帖子

版主,mmu.c这个函数哪里有,我用的mini6410的板子
级别: 新手上路
UID: 51966
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
贡献值: 0 点
综合积分: 24 分
注册时间: 2011-07-10
最后登录: 2011-10-31
9楼  发表于: 2011-07-25 16:16
楼主我想问一下,为什么我加了mmu的初始化函数,程序会死在这个函数里?用的是mdk环境