MDK 分散加载文件(.sct)剖析及应用

MDK 分散加载文件(.sct)剖析及应用

1、何为分散加载

开发者将代码或数据在指定的内存中运行。做法是通知连接器把程序的某一部分连接到存储器的某个地址空间。可以通过编写一个分散的加载文件来指定ARM连接器生成映象文件(烧录文件)时如何分配code、ro_code、rw_code、rw_date、zi_date(未初始化的数据和初始化为零的数据)等数据的地址。

  • map文件中包含了各种变量的地址和大小
    在这里插入图片描述

2、数据的加载

被用于烧录的文件叫做可执行映象文件(image文件);一个imange文件中包含RO和RW段,RO中为代码和常量(注意:代码中定义的字符串常量和字符常量存储在只读区主要不是静态变量区
程序运行时,RW段还在flash中,需要一段程序将这些变量复制到RAM中,在stm32中__main帮我们完成了这一动作。
在这里插入图片描述

3、加载域和运行域

  • 加载域:映象文件被静态存放的工作区域(一般是内部flash)
  • 运行域:程序运行起来的存储区域;由于flash是可以运行代码的(XIP技术)但是不能用于RW_date和ZI_date变量的读写。一般是放在sram中运行的。

4、分散加载文件的解读

MDK帮我们生成的分散加载文件
在这里插入图片描述

  • C 语言中我们知道可以用 attribute 关键字将变量指定到某个地址,但是通过分散加载文件可以更方便的将整个文件包括函数地址,变量地址放到指定的地址处。

  • 比如 stm32H7 系列的单片机中,有高速内存区 TCM ( TCM : Tightly-Coupled Memory 紧密耦合内存),这块区域的访问速度极快,stm32H750 拥有高达 480Mhz 的主频,这块区域与内核速度一样。

  • 因此将对运行速度要求极高的代码,比如 GUI 绘图这一过程,将这些绘图代码放到 TCM 空间去运行是很有必要的。此时就需要通过分散加载文件指定某些代码在特定的地址空间去执行。

5、指定某个函数加载到特定位置

  • 在分散加载文件中加入以下代码
  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 中

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

  • 分散加载文件修改
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 文件 发现,整个文件的代码都放到了 ram 中执行。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值