MDK 分散加载文件剖析(二)

本文介绍了如何通过分散加载文件配置,将特定函数或整个.C文件加载到RAM中执行。通过在分散加载文件中添加指定段落,并使用__attribute__((section(.RAM1)))函数属性,可以实现函数在RAM中的定位。同时,为整个.C文件指定加载位置,只需在分散加载文件中添加相应.o文件并明确其为RO区域。这在需要快速执行或动态分配内存的嵌入式系统中尤为重要。

1、指定某个函数到特定位置

1.1 默认分散加载文件

LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00010000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

默认情况下代码地址

void dev_test(void)
{
    rt_kprintf("dev_test function address = 0x%08x\n",dev_test);
}
MSH_CMD_EXPORT(dev_test,devtest);
msh />dev_test
dev_test function address = 0x0800a2f1 //可以看出,默认情况下这个函数在 flash 中

1.2 在分散加载文件中加入以下代码

LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00010000  {  ; RW data
   .ANY (+RW +ZI)
   *(.RAM1) // 新增
  }
}

在要指定的函数前加入以下代码

__attribute__((section(".RAM1"))) void dev_test(void)
{
    rt_kprintf("dev_test function address = 0x%08x\n",dev_test);
}
MSH_CMD_EXPORT(dev_test,devtest);
msh />dev_test
dev_test function address = 0x20000001 // 指定到了 ram 中

但是如果需要整个.c 文件的代码都要放到 ram 中去运行怎么办?总不可能一个一个加代码吧?

2、指定某个文件到特定地址

2.1 分散加载文件修改

LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00010000  {  ; RW data
   .ANY (+RW +ZI)
   test_dev.o (+RO)//新增,为何不加入+RW +ZI ? 是因为 .ANY(+RW +ZI) 已经制定了,任何的 RW ZI 都在这块区域,又因为只有这一块 ram ,因此,加上 +RW +ZI 显然是多余的。
  }
}

查看 map 文件

  rt_test_dev_init                         0x20000015   Thumb Code    34  test_dev.o(i.rt_test_dev_init)
    test_close                               0x20000059   Thumb Code    12  test_dev.o(i.test_close)
    test_open                                0x20000071   Thumb Code    14  test_dev.o(i.test_open)
    test_read                                0x2000008d   Thumb Code    22  test_dev.o(i.test_read)
    test_write                               0x200000b1   Thumb Code    22  test_dev.o(i.test_write)

查看 map文件 发现,整个文件的代码都放到了 ram 中执行。

3、总结

由于这块芯片只有一片 ram, 因此 RW-data 与 ZI-data 只能放在这一块内存中去,如果有多个 ram 区且内存不连续,可以新增一块运行域,将指定的数据以及一些代码指定到这个位置即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值