手机开发实战185——Scatter file介绍6

来源:互联网 发布:网络视频服务器的作用 编辑:程序博客网 时间:2024/05/29 17:17

加载文件示例一:
        
起始地址      大小
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);
    }

0 0
原创粉丝点击