天嵌 ARM开发社区

 找回密码
 注册
查看: 2926|回复: 1

keil4 mdk + jlink +TQ2440调试内存分析

[复制链接]
扫帚菜~~ 发表于 2013-3-29 23:05:56 | 显示全部楼层 |阅读模式
本帖最后由 扫帚菜~~ 于 2013-3-29 23:11 编辑

使用keil4 mdk + j-link调试TQ2440
大家先看一下这个个链接:
http://www.armbbs.net/forum.php?mod=viewthread&tid=15587
以下的内容完全是依我自己的知识,再加上试验测的的结果推理出来的,没有参考任何别的资料,所以,肯定会有不对的地方,望批评指正。
其中target配置如下图:
在此只解释这三个地址设置。
    ROM1 0x30000000 size 0x800000 (off chip):片外程序存储器起始地址:0x30000000大小为0x800000。都知道TQ2440内存的起始地址为0x30000000。所以通过设置这个地址可以推测j-link是把程序直接下载到了内存的起始地址处。名为ROM其实是内存一部分。
    RAM1 0x30800000 size 0x800000(off chip)此句设置的是片外运行内存的地址。由它的起始地址来看,它是紧在的ROM1的后面。但这里设置的ROM1大小为0x800000,这时如果实际程序大于0x800000,会有什么问题大家可以试一下(可以把0x800000改为0x10这时随便写个程序就有点可能大于这样个数)编译器可能会报错,也可能会运行出错,我还有没试,只是个猜想。
    IRAM1 0x40000000 size 0x1000 (on chip)这是片内内存地址,由于j-link是直接把程序下载到片外内存中,所以这里可以不做设置(我做的试验中,这里不设置也可以得到正确的结果)。
   打开EXT_RAM.ini文件


此文件的标题写的很明白:
/* Ext_RAM.INI: External RAM (SDRAM) Initialization File */
这是外部RAM(SDRAM)的初始化文件,我认为它只在调试的时候可以用到,这只是我认为,如果我认为错了,请您指出。



此文件中的一下函数:
FUNC void SetupForStart (void)
{// <o> Program Entry Point
  PC = 0x30000000;
}
    此函数把程序指针PC设为0x30000000,此地址处存放了将要运行的程序,也是刚才所说的jlink下载到内存当中的程序。此文档的最后一句调用了这函数,说明在此文件运行完之后PC的值为0x30000000
   Void Init() 函数是初始化内存控制器,在此不过多说明,好吧,是因为我也不太了解。
   然后看下面的几行:

   
这几句汇编的用法及作用同行们自己去查手册。
Image$$ER_ROM1$$RO$$Limit == 这些东西是编译器自动生成的。大家只要知道它的意思就行了(看英文单词也能猜出它们的意思,况且还有注释,虽然是英文的)。
它的意思是BaseOfRom代表了 Image$$ER_ROM1$$RO$$Base
看Image$$ER_ROM1$$RO$$Base后的注释:Base of  Rom Code 程序代码的开始处。
TopOfRom 代表了 Image$$ER_ROM1$$RO$$Limit 。看注释:End of ROM code (=start of ROM data):程序代码的结束处(ROM data 的开始处)ROM data是什么?在此我理解是程序运行所用到的数据。注意了,注意了,注意了。这个注释还告诉我们一个东西,ROM data这个是东西紧跟在程序代码之后的,虽然它是data 但它并没有在target配置里的RAM区。
这样的话,看上面给的链接里的那个问题:在那里DATA1的值是0x40000000
原因是我配置了片内RAM,之后的试验没有配置内部RAM,它就会用外部的RAM,根据第一图target的配置情况可以知道,如果没配置内部RAM的情况下调试的话,DATA1的的值就应该0x30800000。也就是所谓的bbs区的开始。什么是bbs区?  百度一下你就知道。GC来了,ROM的起始地址是0x30000000,大小是0x800000。而前文也说liao:rom data 是紧接在程序代码之后的。所以说,ROM data 的首地址是在0x30800000之前的。而DATA1指向了0x30800000所以,才会出再以DATA1做指针取数不正确的现像。
要想在0x30800000处取到正确的数据就要写一个程序,负责把数据搬运到0x30800000处,程序如下
  
        ldr        r0, TopOfROM   ;把TopOfROm (data)的地址加载到r0 中
InitRam        
        ldr        r2, BaseOfBSS   ;bbs的地址0x30800000
        ldr        r3, BaseOfZero   ;也是一个东西的地址;我也不明白这个东西是什么了        
0
        cmp         r2, r3        ;比较r2,r3的值
        ldrcc  r1, [r0], #4     ;小于则把r0 所指向址址的数据加载到r1 中,c语言表示r1 = *r0; 同 时r0增加4
        strcc         r1, [r2], #4   ;r把r1里的数据放入r2所指向的地址中:*r2 = r1 同时r2 增加4
        bcc        %B0               ;小于则转到0处行。

        mov        r0,        #0
        ldr        r3,        EndOfBSS
1        
        cmp        r2,        r3
        strcc        r0, [r2], #4
        bcc        %B1

这样,程序就把代码后的数据搬运到了RAM开始处。 程序也就可以正常调试了。
这只是在用jlink调试的情况下的内存分析,可能并不适用于其它情况。请兄弟姐妹们自行参考。
再次说明:以上的内容完全是依我自己的知识,再加上试验测的的结果推理出来的,没有参考任何别的资料,所以,肯定会有不对的地方,望批评指正。



本帖子中包含更多资源

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

×
 楼主| 扫帚菜~~ 发表于 2013-3-30 11:06:58 | 显示全部楼层
本帖最后由 扫帚菜~~ 于 2013-3-30 11:07 编辑

这样设置也可以,刚发现。唉

本帖子中包含更多资源

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

×
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-10-29 13:12 , Processed in 2.058443 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表