Линкер ARMCC: создание неинициализированного региона - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь (и не могу) заставить компоновщик ARMCC поместить переменные в область ОЗУ, которая НЕ инициализирована (потому что они нужны мне для выживания после сброса).Регион, который я создал в файле scatter-link, указывает UNINIT, и в моем вызове __attribute__ я указываю, что это zero_init RAM (в противном случае я знаю, что компоновщик ARM считает, что это DataRAM и обнуляет его, независимо от того, что вы говорите).Для моего тестового кода ниже файл .map показывает, что компоновщик равен , помещая мою тестовую переменную в правильную область:

Execution Region RW_IRAM1 (Base: 0x200032ac, Size: 0x00000004, Max: 0x00000400, ABSOLUTE, UNINIT)
Base Addr    Size         Type   Attr      Idx    E Section Name  Object
0x200032ac   0x00000004   Zero   RW         8    .bss.noinit      main.o

Еще с этим тестовым кодом:

#include "mbed.h"

// An unsigned int in an uninitialised RAM area
__attribute__ ((section(".bss.noinit"), zero_init))
unsigned int gRetained;

// Entry point
int main()
{
    printf("Retained RAM variable is %d.\n", gRetained);
    gRetained++;
    printf("Retained RAM variable incremented to %d.\n", gRetained);
    printf("Resetting...\n");
    wait_ms(1000);
    NVIC_SystemReset();
}

... вывод, который я получаю:

Retained RAM variable is 0.
Retained RAM variable incremented to 1.
Resetting...
Retained RAM variable is 0.
Retained RAM variable incremented to 1.
Resetting...
Retained RAM variable is 0.
...

Может кто-нибудь заметить, что я делаю не так?

Вот мой полный файл ссылки разброса, где RW_IRAM1 это регион, о котором я говорю:

#! armcc -E

/* Default to no softdevice */
#if !defined(MBED_APP_START)
  #define MBED_APP_START 0x0
#endif

#if !defined(MBED_APP_SIZE)
  #define MBED_APP_SIZE 0x80000
#endif

/* Physical RAM */
#define MBED_RAM_PHYSICAL_START 0x20000000
#define MBED_RAM_PHYSICAL_SIZE 0x10000

/* Reserved areas */
#define MBED_RAM_SOFT_DEVICE_SIZE 0x31d0
#define MBED_RAM_UNINIT_AREA_SIZE 1024

/* If app_start is 0, do not set aside space for the softdevice */
#if MBED_APP_START == 0
  #define MBED_RAM_START  MBED_RAM_PHYSICAL_START
  #define MBED_RAM_SIZE   MBED_RAM_PHYSICAL_SIZE
#else
  #define MBED_RAM_START  (MBED_RAM_PHYSICAL_START + MBED_RAM_SOFT_DEVICE_SIZE)
  #define MBED_RAM_SIZE   (MBED_RAM_PHYSICAL_SIZE - MBED_RAM_SOFT_DEVICE_SIZE)
#endif

#define MBED_RAM0_START MBED_RAM_START
#define MBED_RAM0_SIZE  0xDC
#define MBED_RAM1_START (MBED_RAM0_START + MBED_RAM0_SIZE)
#define MBED_RAM1_SIZE  MBED_RAM_UNINIT_AREA_SIZE
#define MBED_RAM2_START (MBED_RAM1_START + MBED_RAM1_SIZE)
#define MBED_RAM2_SIZE  (MBED_RAM_SIZE - MBED_RAM0_SIZE - MBED_RAM1_SIZE)

LR_IROM1 MBED_APP_START MBED_APP_SIZE {
  ER_IROM1 MBED_APP_START MBED_APP_SIZE {
    *.o (RESET, +First)
    *(InRoot$$Sections) 
    .ANY (+RO)
  }

  RW_IRAM0 MBED_RAM0_START UNINIT MBED_RAM0_SIZE { ;no init section
    *(*nvictable)
  }
  RW_IRAM1 MBED_RAM1_START UNINIT MBED_RAM1_SIZE { ;no init section
    *(*noinit)
  }
  RW_IRAM2 MBED_RAM2_START MBED_RAM2_SIZE {
    .ANY (+RW +ZI)
  }
}

К вашему сведению, это на сканере Nordic NRF52832 с 64 Кбайт оперативной памяти, и я собираюсь собирать с помощью mbed-os, хотя я не верю в этодолжен иметь отношение к проблеме.Версия ARMCC - 5.06, обновление 6 (сборка 750).

1 Ответ

0 голосов
/ 03 октября 2018

Что ж, поддержка инструментов ARM подтвердила, что моя конфигурация компоновщика правильная, и проверила мой файл ELF, чтобы убедиться, что ничто не перезаписывает статически мою зону noinit.

Кажется, проблема в том, что на NRF52832 естьстек BLE находится в памяти, и хотя я никогда не активирую BLE, что-то где-то в mbed-os записывает несколько килобайт данных конфигурации BLE в MBED_RAM1_START, предполагая, что ему принадлежит это пространство.Таким образом, решение проблемы заключается в том, чтобы сделать так, как это делают файлы компоновки GCC и IAR, и поместить область noinit после обычной области ОЗУ.Проблема в том, что я не знаю, как это сделать с помощью инструментов ARM, поскольку они не идентифицируют область кучи отдельно в файле компоновщика.Ho hum.

В любом случае, главное, что конфигурация, которую вы видите выше, действительно работает, и что это синий слон в комнате, который бродит по этой оперативной памяти.

...