OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5120|回复: 0

自定义GCC链接LD文件,GCC设置外部SRAM通用方法(F103外挂SRAM,使用HAL库)

[复制链接]

4

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2019-5-15
在线时间
21 小时
发表于 2020-12-28 14:08:14 | 显示全部楼层 |阅读模式
板子:F103ZET6用FSMC外挂了1M的SRAM,开发环境STM32CubeIde v1.5.0
问题:在启动阶段(即SystemInit()阶段),不需要定义DATA_IN_ExtSRAM宏,不需要调用SystemInit_ExtMemCtl(),直接使用官方HAL库流程,如何让GCC自动处理储存在SRAM的变量(不需要手动分配外挂SRAM的绝对地址等等。。。)?
解决方案:
1)打开项目下的STM32F103ZETX_FLASH.ld文件
2)给GCC添加外挂内存(CubeMX设置为FSMC_BANK1_3),起名字为:EXTSRAM
修改前:
/* Memories definition */
MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 64K
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 512K
}

修改后:
/* Memories definition */
MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 64K
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 512K
  EXTSRAM (rw)     : ORIGIN = 0x68000000,  LENGTH = 1024K
}
3) 添加section段:ext_sram(NOLOAD),注意NOLOAD的意思是储存在ext_sram段的内存变量,在启动的时候(就是main()之前的阶段)不需要初始化。这里容易出问题,标准HAL库是在进入main()才开始初始化(外挂SRAM需要调用MX_FSMC_Init()初始化,才可以使用),不加NOLOAD的话,在启动阶段GCC默认加载内存变量(extern或者static变量),找不到外挂SRAM,导致HardFault
修改前:
  /* User_heap_stack section, used to check that there is enough "RAM" Ram  type memory left */
  ._user_heap_stack :
  {
    . = ALIGN(8);
    PROVIDE ( end = . );
    PROVIDE ( _end = . );
    . = . + _Min_Heap_Size;
    . = . + _Min_Stack_Size;
    . = ALIGN(8);
  } >RAM

  /* Remove information from the compiler libraries */
  /DISCARD/ :
  {
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
  }

修改后:
  /* User_heap_stack section, used to check that there is enough "RAM" Ram  type memory left */
  ._user_heap_stack :
  {
    . = ALIGN(8);
    PROVIDE ( end = . );
    PROVIDE ( _end = . );
    . = . + _Min_Heap_Size;
    . = . + _Min_Stack_Size;
    . = ALIGN(8);
  } >RAM

  /* external sram data, do not initialize at startup  */
  .ext_sram(NOLOAD) :
  {
    . = ALIGN(4);
    _sext_sram = .;        /* create a global symbol at ext_sram start */
    *(.ext_sram)
    *(.ext_sram*)
   
    . = ALIGN(4);
    _eext_sram = .;        /* define a global symbol at ext_sram end */
  } >EXTSRAM AT> FLASH

  
  /* Remove information from the compiler libraries */
  /DISCARD/ :
  {
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
  }
4)完毕,按照HAL库的官方流程走
5)使用实例,给出emWin的例子,其他如文件系统之类的也适用
修改前(借用MDK的例子,网上找的):
#define GUI_NUMBYTES      (1024 * 512)
static U32 aMemory[GUI_NUMBYTES / 4] __attribute__((at(0X68000000)));

修改后(使用GCC):
#define GUI_NUMBYTES      (1024  * 512)
static U32 aMemory[GUI_NUMBYTES / 4] __attribute__ ((section (".ext_sram")));
6)缺点:外挂SRAM变量(带属性 __attribute__ ((section (".ext_sram"))))需要手动初始化,稍微不方便,比较适合用于大容量缓冲等应用场景(GUI,文件系统等)

欢迎探讨!!!


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 11:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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