[ARM入门] MDK环境下jlink+sdram调试如何设置

[复制链接]
 楼主| 401968875 发表于 2014-5-13 21:07 | 显示全部楼层 |阅读模式
根据网上教程设置如下

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

我的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 调试多方便。。。

没用过阿
 楼主| 401968875 发表于 2014-5-14 10:53 | 显示全部楼层
顶啊,有没有指导一下啊
jplzl 发表于 2014-5-16 13:27 | 显示全部楼层
你说的在0x32000000下不能仿真是什么情况,应该是别的地方没有相应的改过来吧
下载之后能否看到PC停在起始处?
 楼主| 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的启动代码吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
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   

这段代码没看懂是做什么的,没必要吧
 楼主| 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,我就很郁闷了


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
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

粉丝
快速回复 在线客服 返回列表 返回顶部