选项 1:解释语言
这并不能直接回答问题(这是一个很好的问题,顺便说一句,我希望从一个可以直接解决它的答案中学习),但是在做可以加载外部程序以编写外部程序的项目时,这很常见一种解释性语言。如果资源紧张(它们将在此处理器上,您是否考虑过为此使用 PIC32 或小型 ARM 处理器?),通常将语言限制为完整规范的子集。更进一步的是特定领域的语言,它们只做一些事情。
例如,elua 项目是低资源 (64 kB RAM) 解释语言的示例。如果您删除某些功能,您可以将其压缩到 32k 的 RAM(注意:它不适用于您当前的 8 位架构处理器。使用外部 RAM 对于图形来说可能太慢了)。它提供了一种快速、灵活的语言,如果您提供最小的 API,新用户可以轻松地使用该语言编写游戏。在线语言有大量可用的文档。您可以以类似的方式使用其他语言(如 Forth 和 Basic),但我认为 Lua 是目前最好的选择。
同样,您可以创建自己的特定领域语言。您必须提供更成熟的 API 和外部文档,但如果游戏都相似,那么这不会太难。
无论如何,PIC18 可能不是我用于涉及自定义编程/脚本和图形的处理器。您可能熟悉这类处理器,但我建议现在是使用带有显示驱动程序和更多内存的东西的好时机。
选项2:只需重新编程整个事情
但是,如果您已经计划自己用 C 语言编写所有游戏,那么就不必费心只从 SD 卡加载游戏逻辑了。您只有 32kB 的闪存可供重新编程,并且可以轻松获得 4 GB 的 microSD 卡。(注意:较大的卡通常是 SDHC,更难连接)。假设您使用了 32 kB 的每个最后一个字节,那么 SD 卡上的空间可以容纳 131,072 个固件副本以及您需要的任何游戏逻辑。
有很多应用笔记可以为 PIC 编写引导加载程序,例如AN851。您需要将引导加载程序设计为占用特定的内存区域(可能是内存区域的顶部,您可以在链接器中指定),并指定完整的固件项目不会到达该区域。appnote 更详细地说明了这一点。只需将“PIC18F452 的引导部分”替换为“我在链接器中指定的引导部分”,这一切都有意义。
然后,您的引导加载程序只需要允许用户从 SD 卡中选择要运行的程序,然后将整个内容复制过来。UI 可能是用户必须按住按钮才能进入选择模式。通常,引导加载程序只会在重置时检查此按钮的状态,如果没有被按住,则启动进入游戏。如果它被按住,则需要允许用户选择 SD 卡上的文件,复制程序,然后继续启动进入 [新] 游戏。
这是我目前的建议。
选项 3:涉及仅存储部分 hex 文件的深层魔法
您设想的机制的问题在于处理器不处理 API 和函数调用,它处理数字- 指令指针可以跳转到的地址,并期望有代码根据 API 规范执行函数调用。check_button_status()
如果您尝试只编译程序的一部分,当您调用或时,链接器将不知道该做什么toggle_led()
。您可能知道这些函数存在于处理器的 hex 文件中,但它需要准确地知道它们所在的地址。
链接器已经将您的代码分成多个部分;-section
从理论上讲,您可以将其分解为带有一些#pragma
咒语的附加部分。我从来没有这样做过,也不知道怎么做。直到上述两种方法都失败了(或者有人在这里发布了一个很棒的答案),我可能不会学习这个机制,所以我不能教给你。