Stm32H7XX GCC下分散加载实现

STM32H750XBHT这块单片机,里面有五块内存区:

TCM 区

速度: 400MHz。
DTCM 地址: 0x2000 0000, 大小 128KB。
ITCM 地址: 0x0000 0000, 大小 64KB。

AXI SRAM 区

位于 D1 域, 数据带宽是 64bit, 挂在 AXI 总线上。 除了 D3 域中的 BDMB
主控不能访问,其它都可以访问此 RAM 区。
速度: 200MHz。
地址: 0x2400 0000, 大小 512KB。
用途:用途不限,可以用于用户应用数据存储或者 LCD 显存。

SRAM1, SRAM2 和 SRAM3 区,这三块都位于D2区

位于 D2 域, 数据带宽是 32bit, 挂在 AHB 总线上。 除了 D3 域中的 BDMB
主控不能访问这三块 SRAM,其它都可以访问这几个 RAM 区。
速度: 200MHz。
SRAM1: 地址 0x3000 0000, 大小 128KB, 用途不限,可用于 D2 域中的 DMA
缓冲, 也可以当D1 域断电后用于运行程序代码。
SRAM2:地址 0x3002 0000, 大小 128KB, 用途不限,可用于 D2 域中的 DMA
缓冲,也可以用于用户数据存取。
SRAM3:地址 0x3004 0000, 大小 32KB, 用途不限, 主要用于以太网和 USB 的缓冲。

SRAM4 区

位于 D3 域, 数据带宽是 32bit,挂在 AHB 总线上,大部分主控都能访这块 SRAM 区。
速度: 200MHz。
地址: 0x3800 0000, 大小 64KB。
用途:用途不限,可以用于 D3 域中的 DMA 缓冲,也可以当 D1 和 D2 域进入 DStandby
待机方式后, 继续保存用户数据。

Backup SRAM 区

备份 RAM 区, 位于 D3 域, 数据带宽是 32bit,挂在 AHB 总线上,大部分主控都能
访问这块 SRAM区。
速度: 200MHz。
地址: 0x3880 0000, 大小 4KB。
用途:用途不限, 主要用于系统进入低功耗模式后, 继续保存数据(Vbat 引脚外接电池)。

既然有这么多快内存区域,那么我们在使用gnu环境下应该怎么使用各块区域的内存呢?
这里就要使用“分散加载法”。

打开STM32H7的链接脚本:

MEMORY
{DTCMRAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128KITCMRAM    (xrw)    : ORIGIN = 0x00000000,   LENGTH = 64KRAM_D1    (xrw)    : ORIGIN = 0x24000000,   LENGTH = 512KRAM_D2    (xrw)    : ORIGIN = 0x30000000,   LENGTH = 288KRAM_D3    (xrw)    : ORIGIN = 0x38000000,   LENGTH = 64KFLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 128K
}

链接脚本中已经给我们定义好了各个内存区块,可以看到跟我们前面介绍的是一样的。
那么怎么使用呢?
先抛出一个问题,我们之前在写stm32代码的时候,定义的全局变量会保存在哪里?
答案是全局区,那这个全局区到底在哪?
链接脚本会告诉我们:

  /* Initialized data sections into "RAM_D1" Ram type memory */.data : {. = ALIGN(4);_sdata = .;        /* create a global symbol at data start */*(.data)           /* .data sections */*(.data*)          /* .data* sections */. = ALIGN(4);_edata = .;        /* define a global symbol at data end */} >RAM_D1 AT> FLASH

可以看到我们定义的全局变量会保存在RAM_D1区域。
所以我们要将这些内存区域定义成相关的sectin。加到ld文件中
写法如下:

/*************************************************************************************************
** DEFINE DTCMRAM RAM_D2 RAM_D3
** WE CAN USE THESE RAM LIKE THIS:
** uint8_t mpudata[128] __attribute__((section(".dtcmram")));
*************************************************************************************************/.dtcmram :{. = ALIGN(4);*(.data)           /* .data sections */*(.data*)          /* .data* sections */. = ALIGN(4);} >DTCMRAM AT> FLASH.ramd2 :{. = ALIGN(4);*(.data)           /* .data sections */*(.data*)          /* .data* sections */. = ALIGN(4);} >RAM_D2 AT> FLASH.ramd3 :{. = ALIGN(4);*(.data)           /* .data sections */*(.data*)          /* .data* sections */. = ALIGN(4);} >RAM_D3 AT> FLASH

加好之后,我们就可以指定全局变量定义在哪一块ram中了。

uint8_t mpudata[128] __attribute__((section(".dtcmram")));

可以打印一下该数组的地址,位于DTCMRAM 区。定义到其他几个区也是一样的写法。
所谓分散加载法,其实就是用Ld文件指定数据到目标存储区域。

Stm32H7XX GCC下分散加载实现相关推荐

  1. NXP SPIFI(QSPI)应用详解与程序固件分散加载

    文章目录 1. SPIFI 标准 1.1 SPI分类 1.2 SPIFI与SPI 2. SPIFI 2.1 SPIFI外设 2.2 SPIFI IO 2.3 串行flash选择 2.4 SPIFI 库 ...

  2. 13、MDK分散加载方式管理多块内存

    MDK分散加载: 默认情况下是通过MDK的option选项设置Flash和RAM大小,这种情况下所有的管理工作都是编译来处理的, MDK自动生成的分散加载文件:H7_ProjectTest.sct ; ...

  3. linux path环境变量检索目录,Linux下动态链接库加载路径及搜索路径问题

    引子 近日,服务器迁移后,偷懒未重新编译nginx的,直接./nginx启动,结果遇到如下问题: "error while loading shared libraries" 这是 ...

  4. stm32h7内存分配_stm32h7“分散加载方式管理多块内存”

    默认情况下,我们都是通过 MDK 的 option 选项设置 Flash 和 RAM 大小,如图1 图1 这种情况下,不方便用户将变量定义到指定的 CCM 或者 SDRAM 中.而使用attribut ...

  5. sct分散加载文件格式与应用

    *.sct分散加载文件是根据芯片内部FLASH和SRAM存储器概况生成的配置文件,链接器根据该文件的配置分配各个节区地址,生成分散加载代码,通过修改该文件可以定制节区的具体存储位置.例如控制代码的加载 ...

  6. 【IoT】STM32 分散加载文件 .sct 解析

    1.STM32 启动文件与 .sct 文件分析 1) 定义STACK段,{NOINIT,读写}:分配一段内存大小为0.5K; 2) 定义HEAP段, {NOINIT,读写}:分配一段内存大小为1K; ...

  7. keil的sct文件_STM32 分散加载文件 .sct 解析

    1.STM32 启动文件与 .sct 文件分析 1) 定义STACK段,{NOINIT,读写}:分配一段内存大小为0.5K; 2) 定义HEAP段, {NOINIT,读写}:分配一段内存大小为1K; ...

  8. keil的sct文件_Keil sct分散加载文件

    博主是个还没入门的弱菜,老师让查资料所以我把自己找的资料整理一下搁在这里方便以后查阅用的,自己并没有试过. 如有错误,欢迎指正. 参考资料: 首先介绍几个概念: 1.ARM映像文件 ARM映像文件是一 ...

  9. KEIL MDK链接脚本-分散加载文件sct

    在了解keil的链接脚本之前需要了解几个重要概念: RO(ReadOnly):表示程序中的指令和常量 RW(Read/Write):表示程序中已初始化的变量 ZI(Zero):表示程序中未初始化的变量 ...

最新文章

  1. 《强化学习周刊》第2期:多智能体强化学习(MARL)赋能“AI智能时代”
  2. 小米电脑做开发java_JAVA学习系列之一-搭建开发环境
  3. 【转】The Google File System 中文版
  4. linux python软连接_Linux软链接的创建,删除,修改
  5. jeecg 分布式部署附件共享问题(Linux软连接和硬链接)
  6. hive连接mysql报错_hive远程模式初始化mysql报错
  7. 一款免费的网络时间校准小程序
  8. ora-30926:无法在源表中获得一组稳定的行
  9. 设计模式(7)——适配器模式
  10. 列出所有内核_Windows系统内核溢出漏洞提权
  11. 解决AD不能复制粘贴
  12. linux字体使用教程,Ubuntu 字体设置:使用Windows 字体
  13. PADS——导出Gerber文件
  14. 复信号在信号处理中的意义
  15. 日常使用的图片文件格式及各自的区别,JPG/PNG/GIF/RAW/WebP/HEIC
  16. 程序员该如何释放压力
  17. Unity-Photon Pun2个人总结
  18. 关于打游戏ping值不稳定问题的解决经历(疑难篇)
  19. 微信营销为什么会用到微信公众号客服系统?
  20. IT项目经理的个人知识管理(转)

热门文章

  1. 美国南加大工程学院计算机,美国南加州大学工程学院排名是多少?
  2. 辅流式沉淀池固体负荷计算方法_辐流式沉淀池设计计算
  3. meta-data 占位符的引用
  4. kali Linux渗透测试黑客专用系统命令
  5. 最小自然数原理及其证明过程
  6. OpenGL总结15-光照模型
  7. Scratch制作俄罗斯方块消除游戏
  8. xp安装java_在WindowsXP中,如何安装JAVA软件?
  9. 1528. 重新排列字符串
  10. 华红兵:2019带你探索“共享服务模式”