Получение компоновщика g cc для размещения нескольких функций по одному адресу - PullRequest
1 голос
/ 12 февраля 2020

У меня встроенная система с внутренним и внешним fla sh. Контроллер MSP430F22x2, внешний флаг sh подключен через SPI. Я могу загрузить данные из внешнего fla sh, но внешний fla sh не отображен в память. Поскольку внутренний флаг sh недостаточно большой, я хочу добавить функции во внешний флаг sh. Таким образом, внешний флаг sh должен быть скопирован во внутренний флаг sh, чтобы можно было выполнять функции. По сути, это похоже на пейджинг бедняги.

Для всего этого у меня есть функция, которая загружает правую часть fla sh и затем вызывает функцию. Он управляет внутренним стеком страниц, отделенным от «реального» стека. Если я хочу вызвать функцию на другой странице, я должен перейти к этой функции. Затем функция вызывает функцию на загруженной странице. Когда функция возвращается, выполнение продолжается в функции управления (потому что она была вызвана оттуда), которая затем загружает нужную страницу и возвращается назад.

Проблема в том, что все функции находятся в одном месте в памяти , так как они скопированы. Но данные в оперативной памяти не могут перекрываться. Мое текущее решение состоит в том, чтобы использовать отдельные сценарии компоновщика для каждой части внешнего кода и устанавливать адреса разделов оперативной памяти вручную. Это, конечно, отнимает много времени, и все должно быть изменено, если деталь нуждается в большем количестве оперативной памяти и т. Д. c.

Отдельные сценарии компоновщика выглядят так:

ENTRY(part)
SECTIONS
{
    .data 0x2A4 :
      {
        . = ALIGN(2);
        *(.data .rodata*)
      }
    .text 0x4000 :
      {
        *(.text)
      }
}

Ничего особенного. Все настроено на указанные c адреса, переполнение не проверяется. Чтобы иметь возможность вызывать функции, я экспортирую таблицу символов и добавляю их в основной скрипт компоновщика. Все это автоматизировано с использованием пакетных сценариев.

enter image description here

Поэтому мне нужен сценарий компоновщика, который по существу размещает несколько секций .text, перекрывающихся в одном и том же диапазоне адресов, и .data разделы непрерывно.

Я не знаю, есть ли способ сделать это. На самом деле мне поможет любое решение (сценарии компоновщика, пакетные сценарии и т. Д. c.). Единственное, что я не могу изменить, это аппаратное обеспечение.

1 Ответ

2 голосов
/ 12 февраля 2020

Вам необходимо использовать компоновщик OVERLAY . Это позволяет месту хранения и месту исполнения отличаться. Вам нужно реализовать менеджер оверлеев (код для копирования кода на адрес выполнения во время выполнения) во время выполнения, но это решает проблему компоновщика.

Найдите работающий пример, загружая код из EEPROM на https://forums.parallax.com/discussion/163970/overlay-code-with-gcc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...