Все ли разделы RAM, используемые в этом линкере, для микроконтроллера STM32H743 (Cortex-M7)?

== сравнивает ссылки на объекты в Java и не является исключением для объектов String.

Для сравнения фактического содержимого объектов (в том числе String) необходимо использовать equals.

Если сравнение двух объектов String с использованием == оказывается true, это связано с тем, что объекты String были интернированы, а виртуальная машина Java имеет несколько ссылки указывают на тот же экземпляр String. Не следует ожидать сравнения одного объекта String, содержащего то же содержимое, что и другой объект String, используя == для оценки как true.

2
задан K.Mulier 13 July 2018 в 10:59
поделиться

1 ответ

С помощью gcc вы можете добавить атрибут секции к переменным. Исходя из этого, переменная затем переносится на конкретный сеанс.

В качестве примера. Предположим, у вас большой массив:

#define BUF_SIZE 2048

__attribute__ ((section(".buffers"), used))
uint8_t pipe_buffer[BUF_SIZE];

Затем вы добавляете секцию в сценарий загрузчика и назначаете ее в определенную область памяти ( RAM_D3 ] в этом случае):

.buffers(NOLOAD) : {
    . = ALIGN(4);
    *(.buffers*)
} > RAM_D3

Таким образом, буферы заканчиваются в RAM_D3 .

3
ответ дан Codo 17 August 2018 в 13:06
поделиться
  • 1
    Спасибо @ Кодо! Что NOLOAD вы ввели в linkerscript? Является ли это признаком того, что этот раздел похож на раздел bss: не инициализирован? Если это так, то почему секция bss начинается следующим образом: .bss : {...} вместо .bss(NOLOAD) : {...}? – K.Mulier 13 July 2018 в 11:57
  • 2
    Кроме того, означает ли это, что STMicro ожидает, что пользователь добавит такой код в линкерсрипт, иначе все остальные разделы RAM не будут доступны? – K.Mulier 13 July 2018 в 12:24
  • 3
    Скорее всего, (NOLOAD) не требуется. Загрузка относится к процессу загрузки исполняемого файла, находящегося на диске в память. Для MCU исполняемый файл находится во FLASH. Поэтому ни один из разделов не может быть загружен. – Codo 13 July 2018 в 13:10
  • 4
    У вас есть несколько вариантов использования специальных разделов ОЗУ. 1. С помощью сценария компоновщика, как описано выше. 2. Если предоставляется специальная версия malloc, которая принимает дополнительный параметр для выбора раздела RAM (SDK для ESP32 предоставляет такую ​​функцию) 3. Вы назначаете значение 0x38000000 указателю. Тогда у вас есть массив в RAM_D3. 4. Еще кое-что, о чем вы можете подумать ... STMicro, похоже, не предоставляет какой-либо конкретной поддержки. Если я не ошибаюсь, MCU может также использовать внешнее ОЗУ. Это снова изменило бы историю. – Codo 13 July 2018 в 13:16
  • 5
    Привет @Codo, Итак, похоже, что STMicro просто поместил эти RAM-секции там в linkerscript, но не создавая компоновщика для их использования? – K.Mulier 13 July 2018 в 13:23
Другие вопросы по тегам:

Похожие вопросы: