stm32专题三十六:MDK编译过程和文件类型(四)
2021-11-01 来源:eefocus
sct 分散加载文件的格式与应用
在使用 MDK 新建工程时,MDK 软件会要求选择对应的芯片型号:
然后,MDK会根据选择的芯片型号,自动获取(写入)芯片内部的 FLASH 和 SRAM 存储器概况如下:
然后,MDK 会生成一个后缀名为 sct 的分散加载文件,如下所示:
链接器根据该文件的配置分配各个节区地址,生成分散加载代码,因此我们通过修改该文件可以定制具体节区的存储位置。
下面,来分析一下这个 sct 文件:
在默认的 sct 文件配置中仅分配了 Code、 RO-data、 RW-data 及 ZI-data 这些大区域的地址,链接时各个节区(函数、变量等)直接根据属性排列到具体的地址空间。
sct 文件中主要包含描述加载域及执行域的部分,一个文件中可包含有多个加载域,而一个加载域可由多个部分的执行域组成。同等级的域之间使用花括号“{ }”分隔开,最外层的是加载域,第二层“{ }”内的是执行域,如图所示:
加载域:
sct 文件的加载域格式如下:
执行域:
和加载域的基本语法非常类似。
输入节区描述:
配合加载域及执行域的配置,在相应的域配置 “输入节区描述” 即可控制该节区存储到域中:
模块选择样式:
输入节区样式:
节区属性描述符:
具体举例如下:
通过 MDK 配置选项来修改 sct 文件
了解 sct 文件的格式后,可以手动编辑该文件控制整个工程的分散加载配置,但 sct 文件格式比较复杂,所以 MDK 提供了相应的配置选项可以方便地修改该文件,这些选项配置能满足基本的使用需求。
图中 Device 标签页中选定了芯片的型号为 STM32F103VE,选中后,在 Target 标签页中的存储器信息会根据芯片更新。
下面,我们来尝试重新分配 SRAM 的空间大小,将64KB分成2个32KB,观察编译后 sct 文件的变化。
编译结果如下所示:
可以发现, sct 文件根据 Target 标签页做出了相应的改变,除了这种修改外,在 Target标签页上还控制同时使用 IRAM1 和 IRAM2、加入外部 RAM(如外接的 SRAM),外部FLASH 等。
上面的操作是将内部 SRAM 分成2份,来进行存储数据,接下来,尝试将文件存储到 RAM2 区域:
然后重新编译,可以看到 sct 文件的内容发生了改变:
可以看到在 sct 文件中的 RW_IRAM2 执行域中增加了一个选择 bsp_led.o 中 RW 内容的语句。
关于 MDK 存储器配置选项的描述: