加载文件示例一:
起始地址 大小
ROM: 0x00000000 256K ;0x1fc 保留为加密字,程序在ROM中运行;
RAM 0x40000000 16K ;用于全局变量及任务堆栈;
SRAM 0x80000000 512K ;SRAM速度慢,主要用于存放大的数据表;
LOAD_ROM1 0x00000000 0x1f8 ; 指定该加载区域首地址、大小
{
EXEC_ROM1 +0 0x1f8 ; 没有前一加载区域,所以该执行区域首地址为加载去首地址
; 并指定该区域长度
{
Startup.o (vectors, +FIRST) ; 目标文件的“vectors”段放在该执行区域的第一段
irq.o (+RO) ; 目标文件的所有“RO”段放在该执行区域
}
}
LOAD_ROM2 0x00000200 ; 第二个加载区域
{
EXEC_ROM2 +0 0x3e600
{
* (+RO) ; 所有目标文件和库文件中的“RO”段存放在该区域
}
RAM1 0x40000000 0x4000
{
* (+RW, +ZI); 所有目标文件和库文件的“RW”和“ZI”段存放在该区域
}
SRAM2 0x80000000 0x80000
{
* (sram) ; 所有目标文件中的“sram”段存放在该区域
}
}
示例二:
“iap.o”定义在“Exec_RAM1”中运行,所以设置“PI”属性;
在调用“iap.c”中函数之前应该将其从“Load$Exec_IAP$Base”复制到指定的“Exec_RAM1”区域;
Load_region1 0x00000000 0x1fc
{
EXEC_ROM1 +0
{
Startup.o (vectors, +FIRST)
irq.o (+RO)
}
}
Load_region2 0x00000200 0x3e600
{
EXEC_ROM2 +0
{
* (+RO)
}
Exec_IAP +0 PI // 可能引起链接器未使用该属性警告,忽略
{
iap.o (+RO)
}
Exec_RAM1 0x40000000 0x4000
{
* (+RW, +ZI)
}
Exec_Sram 0x80000000 0x40000
{
* (SRAM)
}
}
移动“IAP.o”中的所有函数到“ImageExecIAPBase”加载区,调用其中的函数
extern unsigned char Load$Exec_IAP$Base;
extern unsigned char Image$Exec_IAP$Length;
#define ImageExecIAPBase (0x40000000+0x1000) // 加载区首址
void MoveIAPRO(void)
{
unsigned char * psrc, *pdst;
unsigned int count;
count = (unsigned int) &Image$Exec_IAP$Length;
psrc = (unsigned char *)&Load$Exec_IAP$Base;
pdst = (unsigned char *)ImageExecIAPBase;
while (count--) {
*pdst++ = *psrc++;
}
}
// 调用“IAP.O”中的某函数
{
void (* pfnIAPWrite)(unsigned long, int);
pfnIAPWrite = (void (*)(unsigned long, int))
(ImageExecIAPBase +
(unsigned int)IAPWrite - // 被调用函数名
(unsigned int)&Load$Exec_IAP$Base);
pfnIAPWrite((int)((CUPDATA *)CODESTARTADDR)->data,
((CUPDATA *)CODESTARTADDR)->length);
}