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