谈谈不同 IDE 下 RW 段的连接方法

1、为什么要这种链接方法

最近在支持一家客户遇到需要 RW 段数据的连接方案。现在的 MCU 越来越高端,其内部存储空间也越来越多样化,不再像之前的那么单一,只用一个 Flash 地址空间和一个 RAM 地址空间,而且都是连续的。其中,大多数 M7 内核的 MCU 都有 ITCM,DTCM,普通的 Onchip RAM 以及一些外挂的 SDRAM,Hyprer RAM 等。这么丰富的 RAM ,其一般有着不连续的空间,这时候该如何链接程序的 RW 段分配到我们想要的空间里呢?下面分别讲一下 MDK 和 MCUxpresso 的分配方法。

 

2、MDK 分配 RW 方法

说到 MDK,不得不提 .icf 文件,一般在 SDK 工程里面的 Linker 下可以直接编辑,如下图:


当我们点 Edit 后,加入 SDRAM 地址和对应的 size

#define m_sdram_start                   0x80000000

#define m_sdram_size                    0x01E00000


然后在 .icf 中添加一个 RW_m_data2,在里面加入 .ANY (+RW +ZI)和* (My_Data_Section)


.icf 修改完后,就可以定义代码的 RW 段了。参考代码如下:

float s_table[6000] __attribute__((section(".My_Data_Section"))) = {};


int main(){

            s_table[0] = 1;

            s_table[1] = 2;

            // user code …

}



编译完后发现,s_table 已经放到了我们想要的 SDRAM 位置。
 

 

2、MCUxpresso 分配 RW 方法

借助 MCUXpresso IDE 自带的头文件 cr_section_macros.h 里的宏。用 __DATA(RamAliasName) 或者 __BSS(RamAliasName) 宏来修饰变量定义,这样 MCUXpresso IDE 在链接时会自动将该变量放到指定 RAM 里。

 

另一种做法是在 MCU Linker 下添加一个段,如下,然后代码定义方法和 MDK 的一样



这种方法也是可以成功把 s_table[] 放到 SDRAM。至此,MDK 和 MCUxpresso 的 RW 分配方法介绍完毕。欢迎大家在评论区给出更多其他的方法。

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论