1.分散加载文件(链接脚本文件)的格式
问题描述: 在链接的时候,要在不同的地址处添加链接文件,暨分散加载文件,这个分散加载文件有什么样的格式呢? |
问题解答: 程序正确编译生成目标文件以后, 就会链接成可执行的文件, 这个过程中要用到分散加载文件, 它决定可执行的代码在存储器中存放的位置, 这在复杂的程序(例如VIVI对Linux内核的引导)中是很重要的. 下面是一个简单的分散加载文件的例子:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
;Run in Flash
LR_ROM1 0x00000000 { ; load region
ER_ROM1 0x00000000 0x0200000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_RAM1 0x30000000 0x4000000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM1 0x40000000 0x00001000 {
.ANY (+RW +ZI)
}
}
在上面的例程中, 代码从地址0x00000000处开始存放,并且将RESET程序段放在最开始处, 而可读写的数据从地址0x30000000处开始存放. 分散加载文件的段的名字(例如LR_ROM1, ER_ROM1等)可以是任意的名字.
|
2.如何用JLINK在内部RAM中仿真(S3C2410)
这个问题实际没多大意义,但是没解决````
仿真器是J-LINK,
目的是想在内部RAM中仿真代码;之前一直以为是MDK的问题,一直到碰到以下问题.
最近在仿真一个代码(在外部RAM)的时候,突然仿真不了了,之前一直是正常的.想到了对nandfalsh烧过SDRAM的测试代码(写入数据,读出来比较).
然后下载程序之后单步几步之后看了反汇编,发现机器代码都是错的,都是一些SDRAM测试程序中写入SDRAM的数据.
这个好解决,直接把falsh擦了就是了.
但是我要在内部RAM中仿真程序没想到怎么解决.
1.仿真器复位CPU(复位之后CPU复制nandfalsh中的代码到内部RAM---运行)
2.仿真器下载代码
3.仿真器复位CPU(复位之后CPU又复制nandfalsh中的数据到内部RAM,,,,这就导致下载的程序被修改了)
4.仿真不正常!!
PS,一个很怪异的问题,同样的代码,在ADS中是可以的(在ADS中下载的代码不会被修改),而在MDK中用J-TRACE方式可以,用J-LINK RDI方式就不行.
3.函数外部数组无法被正确初始化
在函数外部定义一个数组:
unsigned int array[10]={,,,,,,,指定初始化值};
调试运行(硬件仿真),发现数组并没有按照指定的初始化值初始化,
若像以下这样定义:
const unsigned int array[10]={,,,,,,,指定初始化值};
则可以被正确地初始化.
但是我若要定义一个变量的话,那就没办法用这种办法了.
unsigned int val=0x123;
定义为
const unsigned int val=0x123;显然是不可能的.
这在以前用其他编译器没有碰到过的(在ADS里也都是可以被正确初始化的),是编程方式不对吗?还是按照第一种方法指定初始值是不规范的?
4.如何生成bin文件
在RV MDK 中,下可生成*.hex 的可执行文件,但是如何生成*.bin 可执行文件?答案是可以使用RVCT 的fromelf.exe 工具进行转换。也就是说首先将源文件编译链接成*.axf 的文件,然后使用fromelf.exe 工具将*.axf 格式的文件转换成*.bin格式的文件。
构选Run User Programs After Build/Rebuild 并输入:
C:\Keil\ARM\BIN31\fromelf.exe --bin -o <route>name.bin <route>name.axf
编译工程即可生成name.bin文件。
5.Realview MDK中的调试脚本
<KRealview MDK中调试脚本的详细解析 Eembest 徐良平>
和其他集成开发环境一样,Realview MDK中也使用了调试脚本。调试脚本除了可以初始化软硬件的调试环境以外,还可以初始化Flash的烧写环境,甚至可以提供信号函数模拟片上外围设备。所以在使用Realview MDK调试和烧写的过程中,到处都有调试脚本的身影。下面将分三个方面详细地研究调试脚本的编写和使用。在介绍调试脚本之前,先必须了解Realview MDK预定义的一些常用命令和函数的用法。
1. 常用预定义命令的说明及注意事项:
下表是一些常用的预定义命令和函数的语法格式及说明。
预定义的命令语法 描述
MAP 开始地址, 结束地址 在内存中映射一段存储区域。
Go 开始地址,结束地址 程序从开始地址运行,到结束地址停止。
DIR VTREG 显示所有的CUP引脚寄存器。
预定义的函数 描述
void rwatch (ulong address) 信号函数被延时,直到函数参数地址被读取。
void wwatch (ulong address) 信号函数被延时,直到函数参数地址被写入。
void swatch (float seconds) 信号函数延时参数指定的时间,单位为S。
void twatch (ulong states) 信号函数延时参数指定的CUP周期。
uchar _RBYTE (address) 在参数指定的地址处读取1个字节的数据。
ulong _RWORD (address) 在参数指定的地址处读取1个整型的数据。
ulong _RDWORD (address) 在参数指定的地址处读取1个长整型的数据。
uchar _WBYTE (address, uchar val) 向参数指定的地址处写入1个字节的数据。
void _WWORD (address, uint val) 向参数指定的地址处写入1个整型的数据。
void _WDWORD (address, ulong val) 向参数指定的地址处写入1个长整型的数据。
2. 调试脚本在硬件仿真中的应用
Realview MDK编译链接好的程序在硬件上运行之前,要求硬件具有合适的环境(例如,时钟的配置、存储控制的配置等),一般这些工作是由启动代码完成的。在Realview MDK中,通过调试脚本使用MDK预先定义好的寄存器读写命名设置硬件环境。这一工作在硬件调试之前是必须进行的。下面是一个初始化硬件环境的调试脚本函数:
FUNC void Setup (void)
{
_WWORD(0xfffffd44 ,0x00008000); // 配置看门狗模式寄存器;
_WWORD(0xfffffd60 ,0x00320100); // 配置电压效验模式寄存器;
_WWORD(0xfffffc20 ,0x00000601); // 配置主晶振寄存器;
_WWORD(0xfffffc2c ,0x00191C05); // 配置锁相环寄存器;
_WWORD(0xfffffc30 ,0x00000007); // 配置主时钟寄存器;
_WWORD(0xfffffd08 ,0xa5000001); // 配置复位控制模式寄存器;
pc = 0x200000; // 设置PC的值。
}
3. 调试脚本在软件仿真调试中的应用
使用Realview MDK软件模拟器调试程序时,除了像硬件调试那样配置相关的寄存器以外,有时还必须使用信号函数模拟外设信号的输入/输出,甚至完全模拟一个外围设备。下面的程序将模拟一个外围设备向ADC接口输入方波信号:
signal void ADC4_Square (void)
{
float volts; // 峰值的电压;
float frequency; // 输出的始终频率,单位HZ;
float offset; // 偏移电压;
float duration; // 持续的时间,单位S;
volts = 1.6;
offset = 0.5;
frequency = 2400;
duration = 1000;
while (duration > 0.0)
{
AD4 = volts + offset;
swatch (0.5 / frequency);
AD4 = offset;
swatch (0.5 / frequency);
duration -= 1.0 / frequency;
}
}
4. 调试脚本在Flash下载中的应用:
使用Realview MDK进行Flash下载时,目标板的硬件环境也需要配置,其配置方法和硬件调试的情况是一样的,在此不再赘述。
6.如何在MDK中使用J-LINK
目标硬件的初始化文件,一定要的,否则下载可能会不正常.
若发现下载速度比较慢,可以适当调节JTAG速度,前提是要稳定.
最后要注意这个分散加载文件,这个是能调试程序的前提.