C gnu链接器脚本-stm32f4xx-全局变量

C gnu链接器脚本-stm32f4xx-全局变量,c,gnu,stm32,stm32f4discovery,linker-scripts,C,Gnu,Stm32,Stm32f4discovery,Linker Scripts,我想在我的固件中提供内存映射(节的开始和结束地址):例如:我想知道用户_数据节的起始位置(0x8800000)以及它的长度(512K)。我曾经在一个示例中看到过,可以在链接器脚本中定义全局变量,固件可以在其中访问它(extern unsigned long global_VAR_USER_SECTION_BEGIN)。有人能帮助我在何处以及如何声明全局变量吗 链接器脚本内存映射 连接脚本 在链接器脚本中定义符号很容易,您的文件包含一些示例。在.data部分中,已经定义了符号\u sdata和\u

我想在我的固件中提供内存映射(节的开始和结束地址):例如:我想知道用户_数据节的起始位置(0x8800000)以及它的长度(512K)。我曾经在一个示例中看到过,可以在链接器脚本中定义全局变量,固件可以在其中访问它(extern unsigned long global_VAR_USER_SECTION_BEGIN)。有人能帮助我在何处以及如何声明全局变量吗

链接器脚本内存映射 连接脚本
在链接器脚本中定义符号很容易,您的文件包含一些示例。在
.data
部分中,已经定义了符号
\u sdata
\u edata
,如注释中所述(
在数据开始时创建全局符号

在链接器脚本中创建后,可以使用C代码中的符号,如下所示:

#include <stdio.h>
void display_data_start(void)
{
    extern int _sdata;

    printf("_sdata:%x\n", &_sdata);
}
#包括
无效显示\u数据\u开始(无效)
{
外部国际数据;
printf(“\u-sdata:%x\n”&\u-sdata);
}

因此
&_sdata
将包含
.data
部分的起始地址。

您可以从make中生成内存和链接描述符文件,然后使用编译器命令行上的变量定义常量(即
-D
选项)。或者您甚至可以生成一个头文件,其中包含
#define
s:

mem.tbl:

RAM_START = 1234
RAM_LENGTH = 5678
生成文件:

include mem.tbl

define MEM_DESC =
MEMORY
{
   RAM (xrw)      : ORIGIN = $(RAM_START), LENGTH = $(RAM_LENGTH)
   CCMRAM (rw)    : ORIGIN = 0x10000000, LENGTH = 64K
   /* BL (rx)         : ORIGIN = 0x8000000,  LENGTH = 32K */
   FLASH (rx)     : ORIGIN = 0x8000000,  LENGTH = 512K
   USER_DATA (rw) : ORIGIN = 0x8800000,  LENGTH = 512K /* user data section of 512K */
}
endef

define MEM_INCLUDE =
#define RAM_START $(RAM_START)
#define RAM_LENGTH $(RAM_LENGTH)
endef


all: mem.map mem.h
    @echo use the header file in your compilation
    @cat mem.h
    @echo and the memory map in your linking
    @cat mem.map

mem.h : mem.tbl
    $(file > mem.h,$(MEM_INCLUDE))

mem.map: mem.tbl
    $(file > mem.map,$(MEM_DESC))

或者,您可以更进一步,使用make中提供的构建管理功能。它是以多平台和交叉开发/嵌入式的方式编写的,提供了算术、表格处理和其他方便的东西。

请看。嗨,gaurav。我是否正确理解了这一点,这允许我将任何变量放置在定义的位置?在我的例子中,我想从链接器脚本访问内存映射,我如何将这些值与链接器脚本一起写入变量?是否要访问C代码中链接器文件中声明和设置的变量?是的;)您知道如何执行此操作吗?
可以在链接器中定义全局变量
-无变量、符号。这有点不一样。嗨。我做了如下尝试:extern int_MYDATA;int main(void){int aaa=_MYDATA;aaa++}/*初始化的数据段进入RAM,在代码/.数据:{.=ALIGN(4);_MYDATA=0x123456;/fixme*/之后加载LMA副本。但这会导致我的硬错误。错误。&&_sdata或在您的情况下&_MYDATA-没有变量唯一的符号!!
RAM_START = 1234
RAM_LENGTH = 5678
include mem.tbl

define MEM_DESC =
MEMORY
{
   RAM (xrw)      : ORIGIN = $(RAM_START), LENGTH = $(RAM_LENGTH)
   CCMRAM (rw)    : ORIGIN = 0x10000000, LENGTH = 64K
   /* BL (rx)         : ORIGIN = 0x8000000,  LENGTH = 32K */
   FLASH (rx)     : ORIGIN = 0x8000000,  LENGTH = 512K
   USER_DATA (rw) : ORIGIN = 0x8800000,  LENGTH = 512K /* user data section of 512K */
}
endef

define MEM_INCLUDE =
#define RAM_START $(RAM_START)
#define RAM_LENGTH $(RAM_LENGTH)
endef


all: mem.map mem.h
    @echo use the header file in your compilation
    @cat mem.h
    @echo and the memory map in your linking
    @cat mem.map

mem.h : mem.tbl
    $(file > mem.h,$(MEM_INCLUDE))

mem.map: mem.tbl
    $(file > mem.map,$(MEM_DESC))