查看: 3772|回复: 0

[原创] LPC54608J512 内存配置及管理链接脚本

[复制链接]
  • TA的每日心情
    开心
    2024-3-12 16:11
  • 签到天数: 818 天

    连续签到: 1 天

    [LV.10]以坛为家III

    3

    主题

    860

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2759
    最后登录
    2025-5-22
    发表于 2019-11-22 20:18:54 | 显示全部楼层 |阅读模式
    本帖最后由 idiy 于 2019-11-25 14:18 编辑

    链接脚本是由 MCUXPresso IED 自动生成,在 Debug 或者 Release 目录下,这取决于项目的配置。

    linker-script-overview.png

    默认映像布局如下:



    lpc54608j512-image-layout.png

    几点说明:
    • 地址自下往上增长
    • 4个存储块
      • FLASH:地址范围 0x0000 0000 - 0x0007 FFFF
        • 中断向量表
        • 可运行代码
        • 初始化为非零值的变量初始值
        • 常量变量
      • SRAMX:地址范围 0x0400 0000 - 0x0400 7FFF
        • 指令缓存
        • 数据缓存
        • 指定存储的变量
        • 指定的可运行代码
      • SRAM UPPER:地址范围 0x2000 0000 - 0x2002 7FFF
        • 默认变量存储区
        • 初始化为非0值的变量
        • 初始化为0值的变量
        • 未初始化变量
        • 堆(heap)在 BSS 段之后,向上增长
        • 栈(stack)在存储器的顶端向下生长
        • 指定的可运行代码
      • USB RAM:地址范围 0x4010 0000 - 0x4010 1FFF
        • USB 通信缓冲
        • 指定存储的变量
        • 指定的可运行代码
    • 启动时,DATA 被拷贝到 SRAM,并且将 BSS 初始化为0


    存储器配置
    可使用存储器配置编辑器设置,Project Properties -> C/C++ Build -> MCU settings,打开如下:

    mcu-settings.png

    修改 heap 和 stack
    Project Properties -> C/C++ Build -> Settings -> MCU Linker -> Managed Linker Scripts

    heap-stack-placement.png

    在源代码里指定放置的代码和数据
    在源代码里通过 IDE 提供的宏来完成放置代码和数据到不同的存储区。源代码里需要增加一行:

    1. #include <cr_section_macros.h>
    复制代码

    这里提供一个例子,更多的用法打开 cr_section_macros.h 参考使用。
    连接脚本中有以下一段:

    1.     .data_RAM2 : ALIGN(4)
    2.     {
    3.         FILL(0xff)
    4.         PROVIDE(__start_data_RAM2 = .) ;
    5.         *(.ramfunc.$RAM2)
    6.         *(.ramfunc.$SRAMX)
    7.         *(.data.$RAM2)
    8.         *(.data.$SRAMX)
    9.         *(.data.$RAM2.*)
    10.         *(.data.$SRAMX.*)
    11.         . = ALIGN(4) ;
    12.         PROVIDE(__end_data_RAM2 = .) ;
    13.      } > SRAMX AT>PROGRAM_FLASH
    复制代码

    为了将数据放置到这个存储段,使用了 __DATA 宏,如下:

    1. // create an unitialised 1k buffer in RAM2
    2. __DATA(RAM2) char data_buffer[1024];
    复制代码


    使用 FreeMarker 链接脚本模板修改参数
    IDE 内置了 FreeMarker 模板引擎。在编译的时候,IDE 调用 FreeMarker ,并将数据模型传递给 FreeMarker 。数据模型描述了目标的存储器布局和根模板,根模板被处理并生成链接脚本。根据本包含了更多的组件模板,这个结构使得链接脚本可以拆分成不同的组件,用户可以为某个组件提供自己的模板而不必修改所有的链接脚本。

    MCUX_Freemarker.jpg

    在项目文件下建立 linkscripts 目录,将修改好的连接器脚本模板放到这个目录下,然后编译。
    这里也举一个例子。我想对 bss 进行绝对定位,所以需要修改连接器脚本。在安装目录\ide\Wizards\linker下,复制main_bss_section.ldt到 linkscripts 目录下,内容如下:

    1.     /* MAIN BSS SECTION */
    2.     .bss 0x20010000:
    3.     {
    4.         . = ALIGN(${bss_align}) ;
    5.         _bss = .;
    6.         KEEP(*(.bss.test))
    7. <#include "extrasections_bss.ldt">
    8. <#include "main_bss.ldt">
    9.         *(COMMON)
    10.         . = ALIGN(${bss_align}) ;
    11.         _ebss = .;
    12.         PROVIDE(end = .);
    13.     } > ${DATA}
    复制代码

    在源代码里,定义如下数组:

    1. __attribute__ (section(".bss.test"))uint8_t testbuf[4096];
    复制代码

    这样 testbuf 数组的绝对地址就定位到了 0x20010000 。


    该会员没有填写今日想说内容.
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-25 03:19 , Processed in 0.079662 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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