GNU Linker Script - переместить память sh в новый регион - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь перемещать разделы памяти, используя скрипт компоновщика для микроконтроллера STM32F446ZE. Моя первоначальная установка состояла в следующем:

MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 512K - 128k
DATA (rwx)      : ORIGIN = 0x08060000, LENGTH = 5120
}

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

  .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

  .rodata :
  {
    . = ALIGN(4);
    *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
    . = ALIGN(4);
  } >FLASH

  .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

  . = ALIGN(4);
  .bss :
  {
    /* This is used by the startup in order to initialize the .bss secion */
    _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 left */
  ._user_heap_stack :
  {
    . = ALIGN(4);
    PROVIDE ( end = . );
    PROVIDE ( _end = . );
    . = . + _Min_Heap_Size;
    . = . + _Min_Stack_Size;
    . = ALIGN(4);
  } >RAM

Что я хочу сделать, это переместить DATA, чтобы начать с 0x08000000 (где в данный момент запускается fla sh), и запустить FLA SH с 0x08040000 (после DATA ). Я могу изменить это в разделе памяти достаточно легко, но моя программа не запустится. Я полагаю, что часть кода в блоке SECTIONS, возможно, придется изменить, но я не уверен, как это сделать. Вопрос: как я могу переместить fla sh (где находится код программы) на более поздний адрес памяти.

Ответы [ 3 ]

1 голос
/ 30 января 2020

Это невозможно, поскольку ваш STM32 u C запускается с адреса 0x8000000 при загрузке с fla sh.

Вопрос: как я могу переместить fla sh (где находится код программы) на более поздний адрес памяти.

Ответ: это невозможно. Векторная таблица должна начинаться с 0x8000000 при загрузке с FLA SH memory

0 голосов
/ 22 февраля 2020

Как мне изменить начальный адрес на fla sh? Это применимо, если у вас был stmf7, к сожалению, у вас нет возможности загрузки с любого адреса, который вам нравится. У вас есть фиксированное количество опций,

Взгляните на таблицу данных, 7.1.2 Сброс: Вектор служебной процедуры RESET зафиксирован по адресу 0x0000_0004 в карте памяти. Это означает, что вторые 4 байта в вашем fla sh являются адресом обработчика сброса.

Однако вы можете изменить место загрузки с помощью булавки BOOT, снова обратитесь к таблице данных по адресу 2.4 В микроконтроллерах STM32F4xx реализован специальный механизм, позволяющий загружаться из другой памяти (например, из внутренней памяти SRAM).

Таким образом, единственным вариантом является изменение типа памяти, используемой для загрузки. Но в вашем случае это совсем не поможет.

0 голосов
/ 14 февраля 2020

Как упоминалось в P__J__, вы не можете переместить всю область данных на адрес 0x0800 0000, поскольку MCU ожидает, что вектор прерывания начнется там. Когда MCU загружается из памяти fla sh, адрес 0x0800 0000 сопоставляется с адресом 0x0000 0000. Вместо этого вы можете создать другую область для длины таблицы векторов и переместить другие части ваших разделов, как вам угодно.

MEMORY
{
RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 128K
VECTORS (rx)    : ORIGIN = 0x08000000, LENGTH = 0xB8
FLASH (rx)      : ORIGIN = 0x080000B8, LENGTH = 512K - 128k - 0xB8
DATA (rwx)      : ORIGIN = 0x08060000, LENGTH = 5120
}

  .isr_vector :
  {
    KEEP(*(.isr_vector))
  } > VECTORS

...