查看: 1660|回复: 1

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

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32017
    最后登录
    2024-4-9
    发表于 2021-7-15 09:51:45 | 显示全部楼层 |阅读模式
    使用MCUXpresso IDE将数据、函数与文件存入指定位置


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


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


    以LPC54628中helloworld例程为例,开发环境:MCUXpresso IDE。
    构建工程(Build)后,内存分配如以下console窗口所示:
    11.png
    其中.text,.data,.bss,.dec与Flash,RAM的关系如下所示:
    12.png
    自定义Flash与RAM分区


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


    打开工程属性设置界面,在MCU settings选项中分区出MY_FLASH与MY_RAM两个区用于测试,可以自定义这两个区的大小,如下所示:
    13.png
    配置完Flash与RAM之后,点击Apply and Close后会在工程栏看到我们分区出来的Flash2和RAM2,如下所示:
    14.png
    数据存入指定位置


    1) 变量与常量默认存放位置
    我们先查看变量和数组的默认位置。例如:


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


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


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


    使用MCUXpressoIDE自带的Image Info窗口来查看数组存放位置:
    15.png
    可读写变量和数组默认存放在名为“SRAM_UPPER”的RAM(0x20000000-0x20014000)中,const类型的数组存放在名为“PROGRAM_FLASH”的Flash(0x0-0x40000)中。


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


    将数组存入自定义的Flash与RAM中,需要调用C语言中的
    1. __attribute__ ((section(#type#bank)))
    复制代码
    例如 将数据放入Flash2的 .text中
    1. __attribute__ ((section("text_Flash2"".$Flash2"))) + 数据声明
    复制代码
    官方已封装并定义到cr_section_macros.h中,__DATA(RAM2)将可读写数组放入RAM2的.data段,__RODATA(Flash2)指将只读数组放入Flash2的 .rodata段,即:
    1. __DATA(RAM2) char data_buffer3[1024];

    2. __RODATA(Flash2) const chardata_buffer4[1024] = "hello nxp";
    复制代码
    注意使用时要先包含头文件
    1. #include "cr_section_macros.h".
    复制代码
    16.png
    全局变量和数组存放在名为“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;
    }
    17.png

    指定文件存放到指定位置


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

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

    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2021-7-15 10:32:28 | 显示全部楼层
    这个可是高级用法。
    坦白讲,好多人工作五年了都不一定会用得到
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-24 13:22 , Processed in 0.112748 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表