gpt4 book ai didi

embedded - 多个独立编译的二进制/十六进制文件之间的代码共享

转载 作者:行者123 更新时间:2023-12-02 02:47:06 26 4
gpt4 key购买 nike

我正在寻找有关如何在为 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 部分,我可以将函数指针复制到其中。

我很乐意让源二进制文件的编译步骤输出一些可以包含在跳转二进制文件的编译步骤中的内容。但是,它需要是可重现的,并且只要不更改接口(interface),重新编译源二进制文件不应破坏与跳转二进制文件的兼容性(即使它包含与现在输出的文件不同的文件)。

要澄清源二进制文件不需要任何有关跳转二进制文件的特定知识。代码不应驻留在两个二进制文件中,因为这会破坏此机制的目的。该机制的总体目标是在 cortex-m 处理器上创建多二进制应用程序时节省空间。

欢迎任何想法或资源链接。如果您还有其他问题,请随时评论该问题,我会尽力回答。

最佳答案

我很难想象您想要做什么,但如果您有兴趣拥有针对引导加载程序/ROM 的应用程序链接,请参阅 Loading symbol file while linking获取有关您可以做什么的提示。

构建您的“源”(?)图像,抓取其映射文件并创建一个符号文件,然后在链接“跳转”(?)图像时使用它。

这确实意味着您需要将“跳转”图像链接到“源”图像的特定版本。

如果您需要它们是半版本无关的(即您定义了一组导出的函数,但您可以在任一侧重建),那么您需要在“源”图像中的已知位置导出函数指针并链接到“跳转”图像中的那些函数指针。您可以通过使函数指针结构通过任一侧访问函数来简化簿记。

例如:

shared_functions.h:

struct FunctionPointerTable
{
void(*function1)(int);
void(*function2)(char);
};

extern struct FunctionPointerTable sharedFunctions;

“源”图像中的源文件:

void function1Implementation(int a) 
{
printf("You sent me an integer: %d\r\n", a);

function2Implementation((char)(a%256))
sharedFunctions.function2((char)(a%256));
}

void function2Implementation(char b)
{
printf("You sent me an char: %c\r\n", b);
}

struct FunctionPointerTable sharedFunctions =
{
function1Implementation,
function2Implementation,
};

“跳转”图像中的源文件:

#include "shared_functions.h"

sharedFunctions.function1(1024);
sharedFunctions.function2(100);

当您编译/链接“源”时,获取其映射文件并提取sharedFunctions的位置,并创建一个与源“跳转”图像链接的符号文件。

注意:printf(或共享函数直接调用的任何内容)将来自“源”图像(而不是“跳转”图像)。

如果您需要它们来自“jump”镜像(或可重写),那么您需要通过相同的函数指针表访问它们,并且“jump”镜像需要用它的函数指针表来修复函数指针表。相关功能的版本。我更新了 function1() 以显示这一点。对 function2 的直接调用将始终是“源”版本。其共享函数调用版本将遍历跳转表并调用“源”版本,除非“跳转”镜像更新函数表以指向其实现。

你可以摆脱这个结构,但是你需要将函数指针一一导出(不是一个大问题),但你希望保持它们按顺序排列并位于固定位置,这意味着显式地将它们放入链接器描述 rune 件等。我展示了将其提炼为最简单示例的结构方法。

如您所见,事情变得非常棘手,并且存在一些惩罚(通过函数指针调用速度较慢,因为您需要加载要跳转到的地址)

关于embedded - 多个独立编译的二进制/十六进制文件之间的代码共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55418301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com