Варіант 1: Інтерпретовані мови
Це не відповідає безпосередньо на запитання (це відмінне запитання, BTW, і я сподіваюся, що я дізнаюся з відповіді, яка безпосередньо вирішує його), але це дуже часто, коли ви робите проекти, які можуть завантажувати зовнішні програми для запису зовнішніх програм у інтерпретована мова. Якщо ресурси обмежені (що вони будуть на цьому процесорі, ви думали про використання для цього PIC32 або невеликого процесора ARM?), Звичайно обмежувати мову підмножиною повної специфікації. Ще далі по ланцюгу знаходяться мови, що стосуються домену, які виконують лише кілька речей.
Наприклад, проект elua - приклад мови, що інтерпретується з низьким ресурсом (64 кБ оперативної пам'яті). Ви можете стиснути це до 32 Кб оперативної пам’яті, якщо ви видалите деякі функції (Примітка. Це не працюватиме на вашому поточному процесорі, який є 8-бітовою архітектурою. Використання зовнішньої ОЗУ, ймовірно, буде занадто повільним для графіки). Він забезпечує швидку, гнучку мову, на якій нові користувачі зможуть легко програмувати ігри, якщо ви надаєте мінімальний API. Існує велика кількість документації для мови онлайн. Є й інші мови (наприклад, Forth та Basic), якими ви могли б користуватися подібним чином, але я думаю, що Lua - найкращий варіант на даний момент.
Так само ви можете створити свою власну мову, що залежить від домену. Вам доведеться надати більш повноцінний API та зовнішню документацію, але якби ігри були подібні, це не було б надто складно.
У будь-якому випадку, PIC18, мабуть, не є процесором, який я б використовував для чогось, що передбачає власні програми / сценарії та графіку. Можливо, ви знайомі з цим класом процесорів, але я б припустив, що це вдалий час використовувати щось із драйвером дисплея та більшою кількістю пам'яті.
Варіант 2: Просто перепрограмуйте всю справу
Якщо ви вже плануєте самостійно програмувати всі ігри на C, тоді не займіться завантаженням лише логічної гри з SD-карти. У вас є лише 32 кБ Flash для перепрограми, і ви можете легко отримати для цього 4 Гб microSD-карту. (Примітка: великі картки часто SDHC, з якими складніше інтерфейс). Якщо припустити, що ви використовуєте останній байт 32 КБ, це залишає на SD-картці 131 072 копії вашої прошивки з будь-якою логікою гри.
Є багато додатків для написання завантажувачів для PIC, як AN851 . Вам потрібно буде розробити завантажувач, щоб він займав певну область пам’яті (можливо, вгорі області пам’яті, ви б вказали це в лінкері) і вказали, що повні проекти програмного забезпечення не досягають цього регіону. Програма розповідає про це детальніше. Просто замініть "Завантажувальну секцію PIC18F452" на "Завантажувальну секцію, яку я вказую в лінкері", і це матиме сенс.
Тоді ваш завантажувач просто повинен дозволити користувачеві вибрати програму для запуску із SD-карти та скопіювати всю справу. Користувальницький інтерфейс може бути таким, що користувач повинен утримувати натиснуту кнопку, щоб увійти в режим вибору. Зазвичай завантажувач просто перевірятиме стан цієї кнопки під час скидання, і, якщо її не затримують, завантажується в гру. Якщо його утримувати, потрібно буде дозволити користувачеві вибрати файл на SD-картці, скопіювати програму і продовжувати завантажуватися в [нову] гру.
Це моя сьогоднішня рекомендація.
Варіант 3: Глибока магія, що включає збереження лише частини шестигранного файлу
Проблема з вашим передбаченим механізмом полягає в тому, що процесор не працює з API та викликами функцій, він розглядає числа - адреси, на які може перейти покажчик інструкцій, і очікує, що там буде код, який виконує виклик функції відповідно до специфікації API. Якщо ви спробуєте скласти лише частину програми, лінкер не буде знати, що робити під час дзвінка check_button_status()
або toggle_led()
. Ви можете знати, що ці функції існують у шістнадцятковому файлі процесора, але він повинен точно знати, за якою адресою вони перебувають.
Лінкер вже розбиває ваш код на кілька розділів; теоретично ви могли б розбити це на додаткові розділи з деякими -section
та #pragma
закликами. Я ніколи цього не робив, і не знаю як. Поки вищевказані два методи не підведуть мене (або хтось опублікує тут дивну відповідь), я, мабуть, не буду вивчати цей механізм, і тому я не можу навчити вас це.