Я сейчас пишу собственный загрузчик Ethe rnet для STM32F103C8T6 с контроллером Wi zNet W5500 Ethe rnet. Я хочу сохранить код загрузчика как можно более отдельным от кода пользователя.
Проблема в том, что библиотека Wi zNet занимает около 25% всего доступного ПЗУ (только 64 КБ), поэтому я не хочу включить библиотеку как в загрузчик, так и в код пользователя, но вместо этого включить ее только в загрузчик и получить доступ к библиотеке из кода пользователя.
Моя текущая идея подхода будет:
В загрузчике :
- Включите необходимые файлы Wi zNet .h (и выполните Ethe rnet init и загрузчик foo)
- Использование структуры / массива для хранения всех уже используемых функций библиотеки в качестве указателей в предопределенном месте в ОЗУ
В коде пользователя :
- По-прежнему включайте файлы Wi zNet .h, но используйте указатели хранимых функций, чтобы «перезаписать» вызовы библиотечных функций по умолчанию или сообщить компоновщику, что им не нужно связывать их для экономии места в ПЗУ. (Это то, чего я точно не знаю)
Но есть некоторые открытые требования, которые я не знаю, как решить:
- Не все функции библиотеки вызываются в загрузчике, поэтому они не будут связаны.
Так что в коде пользователя через указатели функций следует вызывать только уже существующие функции.
Если в пользовательском корде вызывается функция библиотеки, которая не нужна в загрузчике, компилятор / компоновщик должен поместить эту функцию в код пользователя. - Когда библиотека компилируется внутри кода пользователя, она должна для внутренних целей также используйте указатели функций, где это возможно.
- В идеале имена функций должны оставаться неизменными, поэтому код пользователя остается совместимым независимо от использования существующих функций с помощью указателя на функцию или автономной библиотеки.
Я не понимаю, C связывание достаточно, чтобы это работало. Может быть, мой подход совершенно неправильный и есть лучший способ, или, возможно, это вообще невозможно. Я надеюсь, что кто-то сможет мне здесь помочь, и я смог бы достаточно четко описать мою проблему.
Некоторые дополнительные ограничения / информация:
- Код пользователя всегда должен найти указатели на функции, даже если изменяется версия загрузчика (перекомпилируется и меняются адреса библиотечных функций)
- Я не хочу просто включать все библиотечные функции, потому что это приведет к потере ROM aswell.
- Как ПЗУ, так и код пользователя должны находиться в ПЗУ (например, для возврата к загрузчику в случае сбоя в коде пользователя)
- Загрузчик может обновить код пользователя, но оставить сам. нетронутым.
- (Необязательно) Я бы не хотел слишком сильно изменять исходную библиотеку Wi zNet.