打印
[ARM入门]

MDK环境下jlink+sdram调试如何设置

[复制链接]
2118|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
根据网上教程设置如下

此时是可以仿真的,但是换了下面的设置后就不可以了

我的ARM9开发板上的sdram是64M的,其实地址是0x30000000,我就有点奇怪了,64M的sdram为什么设置的时候只能在0x32000000范围内?

相关帖子

沙发
401968875|  楼主 | 2014-5-14 08:40 | 只看该作者
另外我还试了一下另一种设置
      start       size            start        size
rom1  0x32000000 0x1000000  ram1  0x33000000   0x10000000
这种设置也是可以仿真的

使用特权

评论回复
板凳
jinxin16897123| | 2014-5-14 09:23 | 只看该作者
IAR 调试多方便。。。

使用特权

评论回复
地板
401968875|  楼主 | 2014-5-14 10:25 | 只看该作者
jinxin16897123 发表于 2014-5-14 09:23
IAR 调试多方便。。。

没用过阿

使用特权

评论回复
5
401968875|  楼主 | 2014-5-14 10:53 | 只看该作者
顶啊,有没有指导一下啊

使用特权

评论回复
6
jplzl| | 2014-5-16 13:27 | 只看该作者
你说的在0x32000000下不能仿真是什么情况,应该是别的地方没有相应的改过来吧
下载之后能否看到PC停在起始处?

使用特权

评论回复
7
401968875|  楼主 | 2014-5-16 21:10 | 只看该作者
jplzl 发表于 2014-5-16 13:27
你说的在0x32000000下不能仿真是什么情况,应该是别的地方没有相应的改过来吧
下载之后能否看到PC停在起始 ...


这是按照第二种设置时的情况,0x30000000处的代码根本不对,下面是离散文件
LR_ROM1 0x30000000 0x01000000  {    ; load region size_region
  ER_ROM1 0x30000000 0x01000000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_RAM1 0x32000000 0x01000000  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM1 0x40000000 0x00010000  {
   .ANY (+RW +ZI)
  }
}                    

下面是debug是的脚本文件
FUNC void SetupForStart (void) {

// <o> Program Entry Point
  PC = 0x30000000;
}


FUNC void Init (void) {

  _WDWORD(0x4A000008, 0xFFFFFFFF);      // Disable All Interrupts

  _WDWORD(0x53000000, 0x00000000);      // Disable Watchdog Timer
  
                                        // Clock Setup
                                        // FCLK = 300 MHz, HCLK = 100 MHz, PCLK = 50 MHz
  _WDWORD(0x4C000000, 0x0FFF0FFF);      // LOCKTIME
  _WDWORD(0x4C000014, 0x0000000F);      // CLKDIVN
  _WDWORD(0x4C000004, 0x00043011);      // MPLLCON
  _WDWORD(0x4C000008, 0x00038021);      // UPLLCON
  _WDWORD(0x4C00000C, 0x001FFFF0);      // CLKCON

                                        // Memory Controller Setup for SDRAM
  _WDWORD(0x48000000, 0x22000000);      // BWSCON
  _WDWORD(0x4800001C, 0x00018005);      // BANKCON6
  _WDWORD(0x48000020, 0x00018005);      // BANKCON7
  _WDWORD(0x48000024, 0x008404F3);      // REFRESH
  _WDWORD(0x48000028, 0x00000032);      // BANKSIZE
  _WDWORD(0x4800002C, 0x00000020);      // MRSRB6
  _WDWORD(0x48000030, 0x00000020);      // MRSRB7

  _WDWORD(0x56000000, 0x000003FF);      // GPACON: Enable Address lines for SDRAM
}


// Reset chip with watchdog, because nRST line is routed on hardware in a way
// that it can not be pulled low with ULINK

_WDWORD(0x40000000, 0xEAFFFFFE);        // Load RAM addr 0 with branch to itself
CPSR = 0x000000D3;                      // Disable interrupts
PC   = 0x40000000;                      // Position PC to start of RAM
_WDWORD(0x53000000, 0x00000021);        // Enable Watchdog
g, 0                                    // Wait for Watchdog to reset chip

Init();                                 // Initialize memory
LOAD 2440.axf INCREMENTAL         // Download program
SetupForStart();                        // Setup for Running
g, main                // Goto Main

对了,MDK可以调试2440的启动代码吗?

使用特权

评论回复
8
jplzl| | 2014-5-17 12:26 | 只看该作者
本帖最后由 jplzl 于 2014-5-17 12:28 编辑
401968875 发表于 2014-5-16 21:10
这是按照第二种设置时的情况,0x30000000处的代码根本不对,下面是离散文件
LR_ROM1 0x30000000 0x0100 ...

可以啊,支持2440的
不要直接进main,去掉g main这句试试,看是不是启动代码有问题

_WDWORD(0x40000000, 0xEAFFFFFE);        // Load RAM addr 0 with branch to itself
CPSR = 0x000000D3;                      // Disable interrupts
PC   = 0x40000000;                      // Position PC to start of RAM
_WDWORD(0x53000000, 0x00000021);        // Enable Watchdog
g, 0   

这段代码没看懂是做什么的,没必要吧

使用特权

评论回复
9
401968875|  楼主 | 2014-5-17 22:48 | 只看该作者
jplzl 发表于 2014-5-17 12:26
可以啊,支持2440的
不要直接进main,去掉g main这句试试,看是不是启动代码有问题

应该不是启动代码的问题, 启动代码中            
LDR     R0, =__main
BX      R0
之后,进入_main,在_main中我进行单步调试,_main作用如下:
1. 将非零(只读和读写)运行区域从其载入地址复制到运行地址。
2. 清零ZI 区域。
3. 跳转到__rt_entry。
我发现问题出现在第二步中,如下图,开始在0x32000000区域清零(R1所指向的区域),
     
清零完成后,如下图(R1指向了0x32000260),


按理说是清的0x32000000的区域,可是我再看反汇编,却发现清的是0x30000000的区域,如下图

所以导致代码被清掉了,仿真出错了,现在问题是明明清的是0x32000000,实际却变成了0x30000000,我就很郁闷了


使用特权

评论回复
10
jplzl| | 2014-5-18 11:38 | 只看该作者
本帖最后由 jplzl 于 2014-5-18 11:45 编辑
401968875 发表于 2014-5-17 22:48
应该不是启动代码的问题, 启动代码中            
LDR     R0, =__main
BX      R0

所以啊,肯定还是哪里设置错了
也有可能是堆栈指针设置错了吧,如果汇编代码能正确运行的话,应该不是那个链接设置和INI初始化的问题了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

12

帖子

1

粉丝