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

本文介绍了手机开发中的Scatter文件,详细解析了加载文件的两种示例,涉及ROM、RAM、SRAM的分配以及EXEC_ROM、EXEC_RAM等执行区域的配置,并展示了如何将函数从加载区复制到执行区以供调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值