链接器脚本不依赖于您的代码(特殊内存技巧之外)
它通常看起来像这样:
_estack = ORIGIN(DTCMRAM) + LENGTH(DTCMRAM);
_Min_Heap_Size = 0x1000 ; /* required amount of heap */
_Min_Stack_Size = 0xD000 ; /* required amount of stack */
MEMORY
{
DTCMRAM (xrw) : ORIGIN = 0x20000000,LENGTH = 128K
ITCMRAM (xrw) : ORIGIN = 0x00000000,LENGTH = 64K
RAM_D1 (xrw) : ORIGIN = 0x24000000,LENGTH = 512K
RAM_D2 (xrw) : ORIGIN = 0x30000000,LENGTH = 288K
RAM_D3 (xrw) : ORIGIN = 0x38000000,LENGTH = 64K
FLASH (rx) : ORIGIN = 0x8000000,LENGTH = 1024K
}
SECTIONS
{
...
}
您在 MEMORY
中看到的地址由您的硬件定义(内存映射)。这是 STM32H7 微控制器的示例,它不与您的硬件一起使用
您不应该尝试自己编写它,微控制器分销商应该将它与包/示例代码一起分发。
如果你还想自己做,在MCU datasheet里找地址,填你需要的段
链接描述文件中声明的符号和你的启动文件有关,第一段就是一个很好的例子:
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} >FLASH
更多here
,
听起来你正在做类似 MemoryMapping 的 AUTOSAR。
你应该看看
AUTOSAR SWS MemoryMapping
AUTOSAR SWS CompilerAbstraction
还为变量和代码描述了某些标准“部分”。它们还有某些初始策略或安全性(QM、ASIL_A、ASIL_B)和对齐选项(8,16,32,PTR,UNSPECIFIED,..)。
最后,你的代码应该是这样的:
pointer-events: auto
根据 #define ADC_START_SEC_VAR_FAST
#include "MemMap.h"
// Variables with "fast access",// which should be placed close to the core,e.g. DTCM
static uint32 Adc_FastVariable;
#define ADC_STOP_SEC_VAR_FAST
#include "MemMap.h"
#define ADC_START_SEC_VAR_SLOW
#include "MemMap.h"
// Variables with "normal/slow access",// which could be placed in e.g. L3 RAM
static uint32 Adc_FastVariable;
#define ADC_STOP_SEC_VAR_FAST
#include "MemMap.h"
,随后的 #define
将替换在此位置的配置部分 #include "MemMap.h"
。
如果您更改节名称(例如 #pragma
而不是默认的 .adc_fast.bss
),编译器将创建一个新的输入节并将变量放在那里,然后链接器将尝试将其放入您在要使用的链接描述文件中定义的输出部分。
.bss
本文链接:https://www.f2er.com/18401.html