博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MDK linker和debug的设置以及在RAM中调试
阅读量:4308 次
发布时间:2019-06-06

本文共 4521 字,大约阅读时间需要 15 分钟。

有误或者表述不清楚请指出,谢谢 

硬件:TQ2440开发板、jlink  V8 固件

软件:J-LINK  ARM 4.08i、MDK4.20

 

先解释下MDK中三种linker之间的区别

设置集中在option linker选项卡

1.采用Target对话框中的ram和rom地址。采用此方式,需在linker选项卡中的Use Memort Layout from

Target Diaglog选项选中,并且在Target中设置好ram、rom地址。MDK会根据Target对话框中设定的ram

和rom地址自动生成一个分散加载文件。最后链接器会根据此文件中的信息对目标文件进行连接,生成axf文件。

如下图:

至于rom和ram是片内还是片外,容量多大就需要根据芯片和开发板来决定了。

 

2.直接通过linker选项卡中的R/O Base和R/W Base来设定链接信息。链接器最后可根据此处指定的地址信息进

行连接,连接的文件应该是顺序存放了,最多RO和RW分开。此时需要注意的是应将 Use Memort Layout from

Target Diaglog前的勾去掉,且保证Scatter File中未包含分散加载文件。并且要在Misc control中设定镜像的入口点,如:

--first 2440init.o(Init)

 

2440init.o对应的是启动代码汇编源文件2440init.s,Init是对应的是段名在异常向量表之前。此处需要根据具体文件修改。

3.最后一种为直接采用分散加载文件。

在设置linker的时候可以注意下linker control string的信息,看看linker的输入信息是否符合自己的要求。

此处应该是只要选择使用scatter file文件,那么其他链接方式的设置自动失效。

可以从linker control string的信息看出来。

 

对应TQ2440开发板的设置

由于TQ2440开发板采用的是片外的ram和片外的flash,所以我这里直接采用前面说到的第二种方法。

就是通过手动设置ro的地址,其中0x30000000就是片外ram的地址。rw未指定,则说明rw数据顺序

存存放到ro段之后。

 

MDK Jlink 外部RAM调试设置

设置集中在option 的debug选项卡下

1.先将黑点调到右边,然后在右边的下拉框中选中J-LINK/J-TRACE,然后点击Setting,找到Info中的JLink,点击查看Jlink和MDK能否连接起来,在点击下面的Target查看仿真器能否找到cpu。

load Application at startup貌似去掉和不去掉的效果是一样的,猜测这个选项和前面Target中的rom地址有关,因为rom地址的后面有startup这个选项。我这里未采用Target方式链接,所以将此勾去掉了。

2.然后是ram调试是最重要的init文件。这个文件的作用是在加载axf调试文件前先将ram初始化完毕,需要完成设置总线时钟,设置bank控制寄存器等(sdram直接挂在bank6上)。本来想偷懒,直接将MDK安装文件夹下Clabsys公司的2440开发板的Ext_RAM.ini拷贝出来,结果调试的时候出现了莫名其妙的错误,猜测是初始化的问题。打开看了下,发现能看懂,MDK自带的文件只初始化了bank6。于是动手将TQ2440的init_sdram改造了下,做了个新的Ext_RAM.ini,可以顺利调试。需要注意的是,Init文件需要根据工程做一定修改,具体是在LOAD命令处。附init文件:

 

 

[cpp]
  1. FUNC void SetupForStart (void) { 
  2.  
  3. // <o> Program Entry Point  
  4.   PC = 0x30000000; 
  5.  
  6.  
  7. FUNC void Init (void) { 
  8.     _WDWORD(0x53000000, 0x00000000); 
  9.     _WDWORD(0x4A000008, 0xFFFFFFFF); 
  10.     _WDWORD(0x4A00001C, 0x000007FF); 
  11.     _WDWORD(0x53000000, 0x00000000); 
  12.     _WDWORD(0x56000050, 0x000055AA); 
  13.     _WDWORD(0x4C000014, 0x00000007); 
  14.     _WDWORD(0x4C000000, 0x00FFFFFF); 
  15.     _WDWORD(0x4C000004, 0x00061012); 
  16.     _WDWORD(0x4C000008, 0x00040042); 
  17.     _WDWORD(0x48000000, 0x22111120); 
  18.     _WDWORD(0x48000004, 0x00002F50); 
  19.     _WDWORD(0x48000008, 0x00000700); 
  20.     _WDWORD(0x4800000C, 0x00000700); 
  21.     _WDWORD(0x48000010, 0x00000700); 
  22.     _WDWORD(0x48000014, 0x00000700); 
  23.     _WDWORD(0x48000018, 0x0007FFFC); 
  24.     _WDWORD(0x4800001C, 0x00018005); 
  25.     _WDWORD(0x48000020, 0x00018005); 
  26.     _WDWORD(0x48000024, 0x008E0459); 
  27.     _WDWORD(0x48000028, 0x00000032); 
  28.     _WDWORD(0x4800002C, 0x00000030); 
  29.     _WDWORD(0x48000030, 0x00000030); 
  30.  
  31.  
  32. // Reset chip with watchdog, because nRST line is routed on hardware in a way   
  33. // that it can not be pulled low with ULINK  
  34.  
  35. _WDWORD(0x40000000, 0xEAFFFFFE);        // Load RAM addr 0 with branch to itself  
  36. CPSR = 0x000000D3;                      // Disable interrupts  
  37. PC   = 0x40000000;                      // Position PC to start of RAM  
  38. _WDWORD(0x53000000, 0x00000021);        // Enable Watchdog  
  39. g, 0                                    // Wait for Watchdog to reset chip  
  40.  
  41. Init();                                 // Initialize memory  
  42. LOAD ..\output\codec.axf INCREMENTAL    // 此处需修改axf文件的路径各工程设置可能不一样需要在此处修改!  
  43. SetupForStart();                        // Setup for Running  
  44. stop, pc                                // 想要直接到main可设置为  g, main 
FUNC void SetupForStart (void) {// 
Program Entry Point PC = 0x30000000;}FUNC void Init (void) { _WDWORD(0x53000000, 0x00000000); _WDWORD(0x4A000008, 0xFFFFFFFF); _WDWORD(0x4A00001C, 0x000007FF); _WDWORD(0x53000000, 0x00000000); _WDWORD(0x56000050, 0x000055AA); _WDWORD(0x4C000014, 0x00000007); _WDWORD(0x4C000000, 0x00FFFFFF); _WDWORD(0x4C000004, 0x00061012); _WDWORD(0x4C000008, 0x00040042); _WDWORD(0x48000000, 0x22111120); _WDWORD(0x48000004, 0x00002F50); _WDWORD(0x48000008, 0x00000700); _WDWORD(0x4800000C, 0x00000700); _WDWORD(0x48000010, 0x00000700); _WDWORD(0x48000014, 0x00000700); _WDWORD(0x48000018, 0x0007FFFC); _WDWORD(0x4800001C, 0x00018005); _WDWORD(0x48000020, 0x00018005); _WDWORD(0x48000024, 0x008E0459); _WDWORD(0x48000028, 0x00000032); _WDWORD(0x4800002C, 0x00000030); _WDWORD(0x48000030, 0x00000030);}// 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 itselfCPSR = 0x000000D3; // Disable interruptsPC = 0x40000000; // Position PC to start of RAM_WDWORD(0x53000000, 0x00000021); // Enable Watchdogg, 0 // Wait for Watchdog to reset chipInit(); // Initialize memoryLOAD ..\output\codec.axf INCREMENTAL // 此处需修改axf文件的路径各工程设置可能不一样需要在此处修改!SetupForStart(); // Setup for Runningstop, pc // 想要直接到main可设置为 g, main

具体设置如图:

转载:

转载于:https://www.cnblogs.com/Hdd-Yi/archive/2013/04/19/3030386.html

你可能感兴趣的文章
HashMap的实现
查看>>
互斥锁 synchronized分析
查看>>
java等待-通知机制 synchronized和waity()的使用实践
查看>>
win10 Docke安装mysql8.0
查看>>
docker 启动已经停止的容器
查看>>
order by 排序原理及性能优化
查看>>
Lock重入锁
查看>>
docker安装 rabbitMq
查看>>
git 常用命令 入门
查看>>
关闭selinx nginx无法使用代理
查看>>
shell 脚本部署项目
查看>>
spring cloud zuul网关上传大文件
查看>>
springboot+mybatis日志显示SQL
查看>>
工作流中文乱码问题解决
查看>>
maven打包本地依赖包
查看>>
spring boot jpa 实现拦截器
查看>>
jenkins + maven+ gitlab 自动化部署
查看>>
Pull Request流程
查看>>
Lambda 表达式
查看>>
函数式数据处理(一)--流
查看>>