Вариант 1: устный перевод
Это не дает прямого ответа на вопрос (это отличный вопрос, кстати, и я надеюсь извлечь урок из ответа, который непосредственно к нему относится), но это очень часто встречается при выполнении проектов, которые могут загружать внешние программы для записи внешних программ в интерпретируемый язык. Если ресурсы ограничены (какими они будут на этом процессоре, вы думали об использовании PIC32 или небольшого процессора ARM для этого?), Обычно ограничивают язык подмножеством полной спецификации. Еще дальше в цепочку входят предметно-ориентированные языки, которые делают только несколько вещей.
Например, проект elua является примером интерпретируемого языка с низким ресурсом (64 КБ ОЗУ). Вы можете сжать это до 32 КБ ОЗУ, если удалите некоторые функции (Примечание: он не будет работать на вашем текущем процессоре, который является 8-битной архитектурой. Использование внешней ОЗУ, вероятно, будет слишком медленным для графики). Он обеспечивает быстрый и гибкий язык, на котором новые пользователи могут легко программировать игры, если вы предоставите минимальный API. Для этого языка доступно множество документов. Существуют и другие языки (например, Forth и Basic), которые вы можете использовать аналогичным образом, но я думаю, что Lua - лучший вариант на данный момент.
Аналогичным образом вы можете создать свой собственный предметно-ориентированный язык. Вам нужно будет предоставить более полнофункциональный API и внешнюю документацию, но если бы все игры были похожи, то это было бы не слишком сложно.
В любом случае, PIC18, вероятно, не тот процессор, который я бы использовал для чего-то, что включает в себя пользовательское программирование / скриптинг и графику. Возможно, вы знакомы с этим классом процессоров, но я бы предположил, что сейчас самое время использовать что-нибудь с драйвером дисплея и большим объемом памяти.
Вариант 2: просто перепрограммируйте все
Однако, если вы уже планируете программировать все игры самостоятельно на C, не стоит загружать только игровую логику с SD-карты. Для перепрограммирования у вас есть всего 32 КБ флэш-памяти, и вы можете легко получить карту памяти microSD емкостью 4 ГБ. (Примечание: карты большего размера часто являются SDHC, с которыми сложнее взаимодействовать). Предполагая, что вы используете каждый последний байт из 32 КБ, это оставляет место на SD-карте для 131 072 копий вашей прошивки с любой игровой логикой, которая вам нужна.
Существует множество приложений для написания загрузчиков для PIC, таких как AN851 . Вам необходимо спроектировать загрузчик так, чтобы он занимал определенную область памяти (вероятно, верхнюю часть области памяти, вы должны указать это в компоновщике), и указать, что полные проекты встроенного ПО не достигают этой области. Приложение разъясняет это более подробно. Просто замените «Загрузочный раздел PIC18F452» на «Загрузочный раздел, который я указываю в компоновщике», и все это будет иметь смысл.
Затем ваш загрузчик просто должен позволить пользователю выбрать программу для запуска с SD-карты и полностью скопировать ее. Пользовательский интерфейс может состоять в том, что пользователь должен удерживать нажатой кнопку, чтобы войти в режим выбора. Обычно загрузчик просто проверяет состояние этой кнопки при перезагрузке и, если она не удерживается, загружается в игру. Если он удерживается, ему нужно будет разрешить пользователю выбрать файл на SD-карте, скопировать программу и продолжить загрузку [новой] игры.
Это моя текущая рекомендация.
Вариант 3: Глубокая магия, включающая хранение только части шестнадцатеричного файла
Проблема с вашим предполагаемым механизмом состоит в том, что процессор не имеет дело с API-интерфейсами и вызовами функций, он имеет дело с числами - адресами, на которые может перейти указатель инструкции, и ожидать наличия кода, который выполняет вызов функции в соответствии со спецификацией API. Если вы попытаетесь скомпилировать только часть программы, компоновщик не будет знать, что делать, когда вы звоните check_button_status()
или toggle_led()
. Возможно, вы знаете, что эти функции существуют в шестнадцатеричном файле на процессоре, но ему нужно точно знать, по какому адресу они находятся.
Компоновщик уже разбивает ваш код на несколько разделов; Вы можете теоретически разбить это на дополнительные разделы с некоторыми -section
и #pragma
заклинаниями. Я никогда не делал этого и не знаю как. До тех пор, пока вышеупомянутые два метода не подведут меня (или кто-то не отправит здесь удивительный ответ), я, вероятно, не изучу этот механизм, и поэтому я не могу научить его вам.