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