使用MCUXpresso IDE将数据、函数与文件存入指定位置

cathy的头像
cathy 发布于:周一, 07/26/2021 - 13:43 ,关键词:

在进行MCU开发时,根据实际需要,将数据、函数与文件存入指定位置,对合理使用存储器的十分重要。经常有客户问如何将某一数据、函数或文件存入指定的地址空间,结合客户的问题,本文主要对此进行讲解。

构建工程后,代码与数据的默认存放位置

以LPC54628中helloworld例程为例,开发环境:MCUXpresso IDE。

构建工程(Build)后,内存分配如以下console窗口所示:

“使用MCUXpresso

其中.text,.data,.bss,.dec与Flash,RAM的关系如下所示:

“使用MCUXpresso

自定义Flash与RAM分区

为了将某一数据、函数或文件存入指定的地址空间,我们先要自定义分区。

打开工程属性设置界面,在MCU settings选项中分区出MY_FLASH与MY_RAM两个区用于测试,可以自定义这两个区的大小,如下所示:

“使用MCUXpresso

配置完Flash与RAM之后,点击Apply and Close后会在工程栏看到我们分区出来的Flash2和RAM2,如下所示:

“使用MCUXpresso

数据存入指定位置

1) 变量与常量默认存放位置

我们先查看变量和数组的默认位置。例如:

初始化过的变量:uint16_t value1 = 1;

未初始化的数组:char data_buffer1[1024];

常量数组: const char data_buffer2[1024] = "hello nxp";

使用MCUXpressoIDE自带的Image Info窗口来查看数组存放位置:

“使用MCUXpresso

可读写变量和数组默认存放在名为“SRAM_UPPER”的RAM(0x20000000-0x20014000)中,const类型的数组存放在名为“PROGRAM_FLASH”的Flash(0x0-0x40000)中。

2)将指定的变量与常量存入指定位置

将数组存入自定义的Flash与RAM中,需要调用C语言中的

__attribute__ ((section(#type#bank)))

例如 将数据放入Flash2的 .text中

__attribute__ ((section("text_Flash2"".$Flash2"))) + 数据声明

官方已封装并定义到cr_section_macros.h中,__DATA(RAM2)将可读写数组放入RAM2的.data段,__RODATA(Flash2)指将只读数组放入Flash2的 .rodata段,即:

__DATA(RAM2) char data_buffer3[1024];

__RODATA(Flash2) const chardata_buffer4[1024] = "hello nxp";

注意使用时要先包含头文件

#include "cr_section_macros.h".

“使用MCUXpresso

全局变量和数组存放在名为“MY_RAM”的自定义RAM2(0x20014000-0x20028000)中,只读的const类型数组存放在名为“MY_FLASH”的自定义Flash2(0x40000-0x80000)中。

函数存入指定位置

1)function默认放置位置

代码默认会放置在名为“PROGRAM_FLASH”的Flash(0x0-0x40000)中,定义函数

int hello1(void)

{

        return 1;

}

2)function存入指定位置

将函数存入指定Flash,需要调用C语言中的这个定义:

__attribute__ ((section(#type#bank)))

如函数存入Flash2中,可以写作:

__attribute__ ((section("text_Flash2"".$Flash2")))+函数声明

同样官方进行了封装,使用__TEXT(Flash2)+函数声明即可。

更改代码放置位置的方法如下所示,将代码存入名为“MY_FLASH”的自定义Flash(0x40000-0x80000)中,定义函数:

__TEXT(Flash2) int hello2(void)
{
        return 2;
}

“使用MCUXpresso

指定文件存放到指定位置

当存在大量函数需要存入指定Flash时,使用__TEXT(Flash)的方法设置每一个函数就略显笨拙。
如需要某个C源文件中的所有函数放入指定Flash区域,只需将编译完成的.o文件放入指定Flash即可。
我们新分区出名为“MY_FLASH_O”的Flash3,在source文件夹下新建hello.c,编译生成hello.o,并配置Linker Script将hello.o放入新分区出的Flash中,如下:

“使用MCUXpresso

“使用MCUXpresso

“使用MCUXpresso

本文涉及到的演示代码,可以在NXP社区下载

来源:恩智浦MCU加油站
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 15