Как связать программу в GCC с предварительно связанной библиотекой? - PullRequest
0 голосов
/ 25 ноября 2018

ОК, у меня проблема, я не знаю точно правильных терминов, чтобы найти то, что я ищу в Google.Поэтому я надеюсь, что кто-то здесь может мне помочь.

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

К сожалению, объем оперативной памяти большинства устройств намного меньше, чем у флэш-памяти.Таким образом, в какой-то момент ваша программа становится слишком большой, чтобы вместить в нее все переменные и т. Д. (Вы выбираете размер устройства таким образом, чтобы допустить, что он будет помещаться во весь код позже).

Классические общие объекты не работают, поскольку в моей среде нет ничего похожего на динамический компоновщик.Там нет ни ОС, ни чего-либо подобного.

Моя идея заключалась в следующем: Для контроллера нет проблем с выполнением кода как из ОЗУ, так и из флэш-памяти.При компиляции с правильными атрибутами для функций для компилятора также не составляет большой проблемы поместить часть программы в ОЗУ, а часть во флэш-память.Когда некоторые функции работают успешно, я создаю библиотеку и помещаю ее во флэш-память.Основная разработка выполняется в «изменчивой» части разработки в оперативной памяти.Таким образом, флэш-память сохраняется.

Проблема в следующем: мне нужно убедиться, что библиотека всегда связана с одним и тем же местом, пока я не перепрошиваю.Таким образом, отдельная функция всегда должна быть на одном и том же адресе во флэш-памяти для каждого цикла компиляции.Когда что-то во флэш-памяти отсутствует, оно должно быть помещено в ОЗУ или возникла ошибка с подкладкой.

Я думал о том, чтобы собрать реальную библиотеку и связать ее.Здесь я немного растерялся.Мне нужно сказать GCC / LD связать предварительно связанный файл (и создать такой предварительно связанный файл).

Должна быть возможность собрать все объекты библиотеки и связать их вместе во флэш-памяти.Затем адреса могут быть извлечены, и основная программа (для использования в ОЗУ) может связываться с ней.Но: Как сделать эти шаги?

В интернете есть термин prelink, а также соответствующая программа для linux.Это предназначено для ускорения времени загрузки.Я не знаю, может ли эта программа помочь мне как побочный эффект.Я сомневаюсь в этом, но я не понимаю внутренностей его работы.

У вас есть хорошая идея, как достичь цели?

1 Ответ

0 голосов
/ 08 мая 2019

Вы решаете не проблему.Встроенная флэш-память обычно имеет МИНИМАЛЬНЫЙ цикл записи 10000.Так что, даже если вы будете мигать 20 раз в день, это будет продолжаться полтора года.St-Nucleo - 13 долларов.Так что это менее 3 копеек в день :-).ТИПИЧНЫЙ цикл записи еще длиннее - около 100 000.Это будет долгое время, прежде чем вы их изнашиваете.

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

Но ответить на вашвопросы, вы можете легко встроить свой код в библиотеку .a файл.Однако GCC не гарантирует связывание объектного кода в любом порядке, так как это зависит от уровня оптимизации.Кроме того, извлекаются только те функции, на которые есть ссылки в библиотечном файле, поэтому, если ваши вызовы функций изменятся, они могут задействовать больше или меньше библиотечных функций.

...