基本上,当我的系统运行时,我希望用户将一些新代码 ftp 到 SD 卡,并动态加载新功能并创建一个任务以在系统中运行。这对于 Linux 来说是正常的。例如,我可以编译一个 SO,并动态加载到内存中。
如何在 uC/OS II 或 III 中做到这一点?
基本上,当我的系统运行时,我希望用户将一些新代码 ftp 到 SD 卡,并动态加载新功能并创建一个任务以在系统中运行。这对于 Linux 来说是正常的。例如,我可以编译一个 SO,并动态加载到内存中。
如何在 uC/OS II 或 III 中做到这一点?
这不是 uC/OS-II 或 uC/OS-III 自己可以提供的服务。
您需要一个能够读取 ELF 文件、根据指定的加载地址将其相关部分(例如 .text、.rodata 等)复制到内存中并为未初始化的内存部分分配内存的程序加载器。然后,您将能够创建一个新的 uC/OS 任务并将对应于 ELF 入口点的函数指针传递给它。
大多数嵌入式系统没有内存管理单元 (MMU),因此您需要特别注意链接过程,以确保这些部分中的任何部分都不会与您的目标上已经运行的任何代码重叠。根据您的工具链,这很可能涉及仔细制作链接描述文件。
避免内存空间潜在重叠问题的另一个选择是使用工具链,该工具链可以生成与位置无关的代码,并将 ELF 加载到主应用程序的堆中或任何其他分配的可用内存空间中您的主要应用程序。
另一种选择是生成可重定位代码并使用或构建能够在运行时处理重定位的程序链接器,当您想要加载上传的代码时。