Раздел ОЗУ является частью бинарной прошивки - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь использовать пользовательский раздел ОЗУ, чтобы иметь возможность передавать информацию при перезагрузке. Этот раздел не будет удален при загрузке, и поэтому переменные, помещенные в этот раздел, будут сохраняться при перезагрузке (если, конечно, нет потери питания).

Я использую набор инструментов GNU и MCU Cortex-M0 (STM32)

Итак, я добавил в скрипт компоновщика новую область памяти перед ОЗУ:

RAM_PERSIST (xrw) : ORIGIN = 0x20000000, LENGTH = 0x0040
RAM (xrw)         : ORIGIN = 0x20000040, LENGTH = 0x0FD0

Тогда раздел для входа:

.pds :
{
  KEEP(*(.pds))
} >RAM_PERSIST

Наконец, в коде C я объявляю некоторые данные в этом разделе:

data_t __attribute((section(".pds")) data;

Я компилирую, но я не могу загрузить сгенерированный двоичный файл на свою цель. Используя objdump, я обнаружил, что моя прошивка получила новый раздел ".sec2", начинающийся с 0x20000000:

> (...)/arm-none-eabi-objdump -s ./obj/firmware.hex | tail
 8006d20 f8bc08bc 9e467047 f8b5c046 f8bc08bc  .....FpG...F....
 8006d30 9e467047 e9000008 c1000008 00127a00  .FpG..........z.
 8006d40 19000000 e0930400 409c0000 400d0300  ........@...@...
 8006d50 c0c62d00 30750000 ffffffff 01000000  ..-.0u..........
 8006d60 04000000                             ....
Contents of section .sec2:
 20000000 00000000 00000000 00000000 00000000  ................
 20000010 00000000 00000000 00000000 00000000  ................
 20000020 00000000 00000000 00000000 00000000  ................
 20000030 00000000 00000000 00000000 00000000  ................

Так что я думаю, что должен сказать компоновщику, что этот раздел не во флэш-памяти, поэтому не должен быть частью прошивки.

Я прав? Если да, то как это сделать?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Я добился того, чего хотел, добавив NOLOAD attibute в свой пользовательский раздел:

.pds (NOLOAD): { KEEP(*(.pds)) } >RAM

Вот описание NOLOAD (документация gcc):

(NOLOAD) Директива (NOLOAD) помечает раздел, который не будет загружен во время выполнения. Компоновщик обработает раздел нормально, но пометит так, чтобы загрузчик программы не загружал его в память. Например, в приведенном ниже примере скрипта раздел ROM адресован памяти расположение 0 и не требует загрузки при запуске программы. Содержимое раздела ROM появится в выходном файле компоновщика как обычно.

SECTIONS {
  ROM  0  (NOLOAD)  : { ... }
  ...
}

Я нашел похожий пост, который мне помог, добавлю ссылку для справки: Директива GCC (NOLOAD) в любом случае загружает память в раздел

0 голосов
/ 07 января 2019
MEMORY
{
    rom : ORIGIN = 0x00000000, LENGTH = 0x40000
    ram : ORIGIN = 0x20000000, LENGTH = 0x4000
}

SECTIONS
{
    .text : { *(.text*) } > rom
    .rodata : { *(.rodata*) } > rom
    .bss : { *(.bss*) } > ram
}

У меня был больший контроль / успех, когда я перестал использовать xrw и т. Д. В определении памяти и вместо этого перешел к контролю над .text, .bss, .data и т. Д., И если вам затем понадобится конкретный объект, вы добавляете это , и т.д ...

...