OpenEdv-开源电子网

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

C语言__attribute__ (at())地址定位移植到STM32CUBUIDE平台

[复制链接]

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2017-2-11
在线时间
306 小时
发表于 2020-8-20 20:40:13 | 显示全部楼层 |阅读模式
/*
* bsp_attribute.c
*
*  Created on: Aug 20, 2020
*      Author: jiangyuanyuan
*/

#include "bsp_attribute.h"

/*
* gFlashDefValue[0]:FW_VER1
* gFlashDefValue[1]:FW_VER2
* gFlashDefValue[3]:MAX_PARAM_NUM
*/

#ifdef __SINGLE_MODE_
        const uint8_t gFlashDefValue[20] __attribute__((section(".ARM.__at_0x0800F000"))) =
        {
                0x1B,0x00,0xC2
        };
#else
        const uint8_t gFlashDefValue[20] __attribute__((section(".ARM.__at_0x0800F000"))) =
        {
                0x73,0x02,0xC2
        };
#endif

/*
* bsp_attribute.h
*
*  Created on: Aug 20, 2020
*      Author: jiangyuanyuan
*/


#ifndef INC_BSP_ATTRIBUTE_H_
#define INC_BSP_ATTRIBUTE_H_
#include "stm32f4xx_hal.h"

#define __SINGLE_MODE_

extern const uint8_t gFlashDefValue[20];
#endif /* INC_BSP_ATTRIBUTE_H_ */




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

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2017-2-11
在线时间
306 小时
 楼主| 发表于 2020-9-24 17:27:41 | 显示全部楼层
回复 支持 反对

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2017-2-11
在线时间
306 小时
 楼主| 发表于 2020-9-24 17:38:08 | 显示全部楼层
回复 支持 反对

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2017-2-11
在线时间
306 小时
 楼主| 发表于 2020-9-24 19:22:45 | 显示全部楼层
回复 支持 反对

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2017-2-11
在线时间
306 小时
 楼主| 发表于 2020-9-24 20:20:24 | 显示全部楼层
/**
******************************************************************************
* @file      LinkerScript.ld
* @Author    Auto-generated by STM32CubeIDE
* @brief     Linker script for STM32F407ZGTx Device from STM32F4 series
*                      1024Kbytes FLASH
*                      64Kbytes CCMRAM
*                      128Kbytes RAM
*
*            Set heap size, stack size and stack location according
*            to application requirements.
*
*            Set memory bank area and size if external memory is used
******************************************************************************
* @attention
*
* <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
*                        opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/

/* Entry Point */
ENTRY(Reset_Handler)

/* Highest address of the user mode stack */
_estack = ORIGIN(RAM) + LENGTH(RAM);        /* end of "RAM" Ram type memory */

_Min_Heap_Size = 0x200 ;        /* required amount of heap  */
_Min_Stack_Size = 0x400 ;        /* required amount of stack */

/* Memories definition */
MEMORY
{
  CCMRAM    (xrw)    : ORIGIN = 0x10000000,   LENGTH = 64K
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128K
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 1024K
  SRAM   (rx)    : ORIGIN = 0x68000000,   LENGTH = 1024K
}

/* Sections */
SECTIONS
{
  /* The startup code into "FLASH" Rom type memory */
  .isr_vector :
  {
    . = ALIGN(4);
    KEEP(*(.isr_vector)) /* Startup code */
    . = ALIGN(4);
  } >FLASH

  /* The program code and other data into "FLASH" Rom type memory */
  .text :
  {
    . = ALIGN(4);
    *(.text)           /* .text sections (code) */
    *(.text*)          /* .text* sections (code) */
    *(.glue_7)         /* glue arm to thumb code */
    *(.glue_7t)        /* glue thumb to arm code */
    *(.eh_frame)

    KEEP (*(.init))
    KEEP (*(.fini))

    . = ALIGN(4);
    _etext = .;        /* define a global symbols at end of code */
  } >FLASH

  /* Constant data into "FLASH" Rom type memory */
  .rodata :
  {
    . = ALIGN(4);
    *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
    . = ALIGN(4);
  } >FLASH

  .ARM.extab   : {
    . = ALIGN(4);
    *(.ARM.extab* .gnu.linkonce.armextab.*)
    . = ALIGN(4);
  } >FLASH

  .ARM : {
    . = ALIGN(4);
    __exidx_start = .;
    *(.ARM.exidx*)
    __exidx_end = .;
    . = ALIGN(4);
  } >FLASH

  .preinit_array     :
  {
    . = ALIGN(4);
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
    . = ALIGN(4);
  } >FLASH

  .init_array :
  {
    . = ALIGN(4);
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
    . = ALIGN(4);
  } >FLASH

  .fini_array :
  {
    . = ALIGN(4);
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(SORT(.fini_array.*)))
    KEEP (*(.fini_array*))
    PROVIDE_HIDDEN (__fini_array_end = .);
    . = ALIGN(4);
  } >FLASH

  /* Used by the startup to initialize data */
  _sidata = LOADADDR(.data);

  /* Initialized data sections into "RAM" 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 AT> FLASH

  /* Uninitialized data section into "RAM" Ram type memory */
  .ccmram :
  {
    . = ALIGN(4);
    _sccmram = .;       /* create a global symbol at ccmram start */
    *(.ccmram)
    *(.ccmram*)

    . = ALIGN(4);
    _eccmram = .;       /* create a global symbol at ccmram end */
  } >CCMRAM AT> FLASH /*新增*/

  . = ALIGN(4);
  .bss :
  {
    /* This is used by the startup in order to initialize the .bss section */
    _sbss = .;         /* define a global symbol at bss start */
    __bss_start__ = _sbss;
    *(.bss)
    *(.bss*)
    *(COMMON)

    . = ALIGN(4);
    _ebss = .;         /* define a global symbol at bss end */
    __bss_end__ = _ebss;
  } >RAM

  /* 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

  .sram :
  {
    . = ALIGN(4);
    _SRAM_SYMBOLS = .;      /* create a global symbol at data start */
    *(.sram)                           /* .data sections */
    *(.sram*)                          /* .data* sections */

    . = ALIGN(4);
    _ESRAM_SYMBOLS = .;     /* define a global symbol at data end */

  } >SRAM AT> FLASH/*新增*/
  /* Remove information from the compiler libraries */
  /DISCARD/ :
  {
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
  }

  .ARM.attributes 0 : { *(.ARM.attributes) }
}

/*新增*/  是我添加进去的,有两处地方添加,分别是内部CCM内存池和外部SRAM。
然后我移植正点原子的内存池管理(基于HAL库),定义几个数组如下:
//内存池(32字节对齐)
__attribute__ ((aligned (32))) u8 mem1base[MEM1_MAX_SIZE];                                                                                                                //内部SRAM内存池
__attribute__ ((aligned (32))) u8 mem2base[MEM2_MAX_SIZE] __attribute__((section(".sram.__at_0x68000000")));    //外部SRAM内存池
__attribute__ ((aligned (32))) u8 mem3base[MEM3_MAX_SIZE] __attribute__((section(".ccmram.__at_0x10000000")));         //内部CCM内存池


问题就来了:
1.编译出现错误,提示warning: memory region `FLASH/' not declared
2.如果把  >SRAM AT> FLASH/*新增*/   地方改成>SRAM/*新增*/   也就是不指向FLASH,编译会通过,但是生成的.bin文件超级大,大概有1.6个G,.hex有3M多。

请问怎么解决?

回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-16 18:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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