微控制器中的链接器文件更新

你能帮我为下面的代码编写链接器文件吗(在高层次上,而不是特定于任何 mcu)。

/*Global variable*/

#define adc_start
int a,b,c;
int d=56,e=22;
const int x=23,y=44;
static int z;
static int t=99;
#define adc_end

void add()
{
    int e,f,g;
    e=f+g;
}

main()
{
    int f;

    f=add();
    return 0;
}

/* MemMap.h */

/*Please help here*/
#define adc_start
#define adc_end
    
    
    
;;;;

/* 链接文件 */

/*Please help here*/
MEMORY
{




}

SECTIONS
{

{
}>RAM

}

注意:它只是高级别的,如果我错过了代码中的某些内容,您可以更新, 我想了解 inker 部分中的 RAM、ROM、BSS、STACK、HEAP 如何 他们映射。

特别是我不知道如何在memmap.h中描述宏相关的代码, 数据、堆、栈

wjs1020 回答:微控制器中的链接器文件更新

链接器脚本不依赖于您的代码(特殊内存技巧之外)
它通常看起来像这样:

_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

大家都在问