【问题标题】:Linker file update in microcontroller微控制器中的链接器文件更新
【发布时间】:2021-07-29 06:00:49
【问题描述】:

能否请您帮我为以下代码编写链接器文件(高级且不特定于任何 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 中的宏相关代码, 数据、堆、栈

【问题讨论】:

  • 代码无关紧要,链接描述文件始终特定于特定的 MCU,因为它们具有不同的内存映射,并且可能从 ROM 执行或需要将代码传输到 RAM 以执行。编译器/链接器将不会期望声明特定的部分(例如.bss、.data .text)。无论如何,它们都将位于您平台的默认链接器脚本中。您很少需要从头开始创建,通常只需要针对特定​​的内存支持和特殊要求进行自定义。

标签: c embedded


【解决方案1】:

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

_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 数据表中找到地址并填写您需要的段
链接描述文件中声明的符号与您的启动文件相关,一个很好的例子是第一部分:

.isr_vector :
{
  . = ALIGN(4);
  KEEP(*(.isr_vector)) /* Startup code */
  . = ALIGN(4);
} >FLASH

更多here

【讨论】:

  • 感谢您的回复,但是如何将我的代码、数据、堆栈链接到链接器文件。我使用 memap.h 编写了变量 a、b、c、d、e、f、g
  • 编译器链接器的工作是在内存段中分配变量。您只需要在链接描述文件中定义部分(并最终在启动文件中进行初始化),您的编译器就可以完成所有工作。我不知道你想用 memap.h 实现什么,但它不正确
【解决方案2】:

听起来你在做像 MemoryMapping 这样的 AUTOSAR。

你应该看看

AUTOSAR SWS MemoryMapping

AUTOSAR SWS CompilerAbstraction

还有一些针对变量和代码描述的标准“部分”。它们还具有某些初始化策略或安全性(QM、ASIL_A、ASIL_B)和对齐选项(8、16、32、PTR、UNSPECIFIED、..)。

最后,您的代码应如下所示:

#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),编译器将创建一个新的输入节并将变量放在那里,然后链接器将尝试将其放入您的输出节在要使用的链接描述文件中定义。

SECTIONS {
    GROUP {
        .fast.bss {
            *(.adc_fast.bss)
            *(.pwm_fast.bss)
        }
    } > DTCM0;
    GROUP {
        .bss {
            *(.adc_slow.bss)
            *(.pwm_slow.bss)
        }
    } > RAM_L3;
}

【讨论】:

    猜你喜欢
    • 2017-03-24
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 2017-05-17
    • 2015-03-11
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    相关资源
    最近更新 更多