在进行MCU开发时,根据实际需要,将数据、函数与文件存入指定位置,对合理使用存储器的十分重要。经常有客户问如何将某一数据、函数或文件存入指定的地址空间,结合客户的问题,本文主要对此进行讲解。
构建工程后,代码与数据的默认存放位置
以LPC54628中helloworld例程为例,开发环境:MCUXpresso IDE。
构建工程(Build)后,内存分配如以下console窗口所示:
其中.text,.data,.bss,.dec与Flash,RAM的关系如下所示:
自定义Flash与RAM分区
为了将某一数据、函数或文件存入指定的地址空间,我们先要自定义分区。
打开工程属性设置界面,在MCU settings选项中分区出MY_FLASH与MY_RAM两个区用于测试,可以自定义这两个区的大小,如下所示:
配置完Flash与RAM之后,点击Apply and Close后会在工程栏看到我们分区出来的Flash2和RAM2,如下所示:
数据存入指定位置
1) 变量与常量默认存放位置
我们先查看变量和数组的默认位置。例如:
初始化过的变量:uint16_t value1 = 1;
未初始化的数组:char data_buffer1[1024];
常量数组: const char data_buffer2[1024] = "hello nxp";
使用MCUXpressoIDE自带的Image Info窗口来查看数组存放位置:
可读写变量和数组默认存放在名为“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".
全局变量和数组存放在名为“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; }
指定文件存放到指定位置
当存在大量函数需要存入指定Flash时,使用__TEXT(Flash)的方法设置每一个函数就略显笨拙。
如需要某个C源文件中的所有函数放入指定Flash区域,只需将编译完成的.o文件放入指定Flash即可。
我们新分区出名为“MY_FLASH_O”的Flash3,在source文件夹下新建hello.c,编译生成hello.o,并配置Linker Script将hello.o放入新分区出的Flash中,如下:
本文涉及到的演示代码,可以在NXP社区下载。
来源:恩智浦MCU加油站
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。