【发布时间】:2019-03-29 13:17:57
【问题描述】:
我正在寻找有关如何在为 Cortex-m/0/4/7 架构编译的多个二进制文件之间共享信息/代码的文档/信息。这两个二进制文件将位于相同的芯片和相同的架构上。它们在不同的位置闪烁并设置主堆栈指针并重置程序计数器,以便一个二进制“跳转”到另一个二进制。我想在这两个二进制文件之间共享代码。
我已将函数指针数组简单地复制到链接描述文件中定义的部分到 RAM 中。然后在另一个二进制文件中读取 RAM 并将其转换为一个数组,然后使用索引调用另一个二进制文件中的函数。这确实可以作为概念验证,但我认为我正在寻找的是更复杂的东西。因为我想要某种方式来描述两个二进制文件之间的兼容性。我想要一些共享库的功能,但我不确定是否需要位置无关的代码。
作为一个例子,当前的复制过程是如何完成的:
源码二进制:
void copy_func()
{
memncpy(array_of_function_pointers, fixed_size, address_custom_ram_section)
}
也从源二进制跳转的二进制:
array_fp_type get_funcs()
{
memncpy(adress_custom_ram_section, fixed_size, array_of_fp)
return array_of_fp;
}
然后我可以使用array_of_fp 从跳转二进制文件调用驻留在源二进制文件中的函数。
因此,我正在寻找一些资源或输入,以供已实施类似系统的人使用。就像我不想有一个自定义 RAM 部分,我将函数指针复制到其中。
我可以让源二进制文件的编译步骤输出一些可以包含在跳转二进制文件的编译步骤中的东西。但是,它必须是可重现的,并且只要您不更改接口,重新编译源二进制文件不应破坏与跳转二进制文件的兼容性(即使它包含与现在输出的文件不同的文件)。
澄清源二进制文件不需要任何关于跳转二进制文件的特定知识。代码不应驻留在两个二进制文件中,因为这会破坏此机制的目的。如果这种机制是在 cortex-m 处理器上创建多二进制应用程序时节省空间的一种方式,那么总体目标是。
欢迎任何想法或资源链接。如果您还有其他问题,请随时对问题发表评论,我会尽力回答。
【问题讨论】:
-
我不太明白,也许您只是想将第一个程序编译为库并编译第二个程序,包括第一个库?也许解释一下你为什么想做这样的事情,以便我们提出解决方案
-
所以我希望源二进制文件作为程序运行(可以编译为库,但我不想将其编译为跳转二进制文件),因为要求两者都可以单独编程他们共享一些资源。所以在某种程度上,你有例如。带有网络堆栈(很大)的引导加载程序我想在引导加载程序和使用它的应用程序之间共享网络堆栈。引导加载程序不了解应用程序,但应用程序了解引导加载程序。这是否清除了@Julien?所以我不想使用源代码二进制文件中的代码。
-
这实际上与 dll 或 .so 文件的工作方式没有什么不同,听起来您在正确的轨道上,您需要某种数据结构来识别函数或变量及其在编译后的二进制文件,将其传递给辅助程序,它需要使用函数指针等连接到另一个二进制文件。这不是一个被无数次解决的新问题,与 mcus 或 cortex-m 无关......如果我理解这个问题。
-
很清楚,谢谢。今晚我将为您的使用提供解决方案。但是,我们可以想象一个应用程序 + 一个依赖于相同动态库的引导加载程序。 app 和 boot 依赖于 lib,app 可以改变而不影响 lib 或 boot。这合适吗?
-
执行此操作的方法可能是特定于工具链的,因此您可能需要指定工具链。但本质上,您创建了一个函数指针表,并通过工具链支持的任何方式安排该表,以将该表定位在为此目的而保留的已知地址处。然后第二个二进制文件可以访问该表以调用函数。
标签: embedded cortex-m cortex-m3