Повторное использование библиотеки, включенной в загрузчик, в коде пользователя - PullRequest
2 голосов
/ 12 февраля 2020

Я сейчас пишу собственный загрузчик Ethe rnet для STM32F103C8T6 с контроллером Wi zNet W5500 Ethe rnet. Я хочу сохранить код загрузчика как можно более отдельным от кода пользователя.

Проблема в том, что библиотека Wi zNet занимает около 25% всего доступного ПЗУ (только 64 КБ), поэтому я не хочу включить библиотеку как в загрузчик, так и в код пользователя, но вместо этого включить ее только в загрузчик и получить доступ к библиотеке из кода пользователя.


Моя текущая идея подхода будет:

В загрузчике :

  • Включите необходимые файлы Wi zNet .h (и выполните Ethe rnet init и загрузчик foo)
  • Использование структуры / массива для хранения всех уже используемых функций библиотеки в качестве указателей в предопределенном месте в ОЗУ

В коде пользователя :

  • По-прежнему включайте файлы Wi zNet .h, но используйте указатели хранимых функций, чтобы «перезаписать» вызовы библиотечных функций по умолчанию или сообщить компоновщику, что им не нужно связывать их для экономии места в ПЗУ. (Это то, чего я точно не знаю)


Но есть некоторые открытые требования, которые я не знаю, как решить:

  1. Не все функции библиотеки вызываются в загрузчике, поэтому они не будут связаны.
    Так что в коде пользователя через указатели функций следует вызывать только уже существующие функции.
    Если в пользовательском корде вызывается функция библиотеки, которая не нужна в загрузчике, компилятор / компоновщик должен поместить эту функцию в код пользователя.
  2. Когда библиотека компилируется внутри кода пользователя, она должна для внутренних целей также используйте указатели функций, где это возможно.
  3. В идеале имена функций должны оставаться неизменными, поэтому код пользователя остается совместимым независимо от использования существующих функций с помощью указателя на функцию или автономной библиотеки.

Я не понимаю, C связывание достаточно, чтобы это работало. Может быть, мой подход совершенно неправильный и есть лучший способ, или, возможно, это вообще невозможно. Я надеюсь, что кто-то сможет мне здесь помочь, и я смог бы достаточно четко описать мою проблему.

Некоторые дополнительные ограничения / информация:

  • Код пользователя всегда должен найти указатели на функции, даже если изменяется версия загрузчика (перекомпилируется и меняются адреса библиотечных функций)
  • Я не хочу просто включать все библиотечные функции, потому что это приведет к потере ROM aswell.
  • Как ПЗУ, так и код пользователя должны находиться в ПЗУ (например, для возврата к загрузчику в случае сбоя в коде пользователя)
  • Загрузчик может обновить код пользователя, но оставить сам. нетронутым.
  • (Необязательно) Я бы не хотел слишком сильно изменять исходную библиотеку Wi zNet.
...