gpt4 book ai didi

c - 函数指针或跳转表

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:34 24 4
gpt4 key购买 nike

在问这个问题之前,请让我提供一些背景:

我正在阅读 technical article关于 Autosar体系结构,它建议对应用层软件组件采用即插即用方法。基本上,文章建议您可以将内存划分为单独的组件,并且仅对那些已修改的组件进行编程/闪存,而不是整个软件镜像。这将在拜访经销商期间节省一些重新编程的时间。现在,由于正在重新编程的函数的地址可能会发生变化,因此当位于另一个分区(内存部分)中的函数调用这些修改后的函数时,这将导致问题。这篇文章提出了一种解决方案,通过使用位于固定地址并包含更新函数地址的跳转/间接表。

现在让我进入问题部分:

我不是从Autosar开始思考这个问题的体系结构,但从嵌入式工程师的角度来看,虽然这种方法可行,但它会增加吞吐量。我认为可以使用的另一个选项可能是函数指针。但是后来我想到在正常情况下,是链接器将函数符号名称替换为其实际地址,因此函数 A(位于未更改的分区中)被初始化为函数 B(位于更新的分区中,并且可能在不同的地址)将不起作用。

这终于让我想到了最后一个问题:

  1. 函数指针的方法行得通吗? (我认为它可能不会。)
  2. 如果上述问题的答案是否定的,我是否仍可以使用函数指针方法,例如将所有函数指针保持在固定地址并使用脚本和映射文件来修补实际地址。

我感谢所有耐心解答这么长问题的人。我希望我能想出一个更小的问题。

最佳答案

我认为指向函数的指针会起作用,但它与跳转表并没有太大区别。您仍然需要一个位于固定地址的表,您可以在其中找到最终函数的地址。您必须初始化函数指针,链接器对此没有帮助。唯一的好处是在执行时:函数是直接调用的,而不是从间接跳转中调用的。

在下面的代码中,我假设一个组件位于固定地址 0xf800 并且该组件的函数地址存储在该内存的开头:

// Functions addresses table at 0xf800
// 0xf800 stores the @ of func1 of the component
// 0xf804 @func2
// 0xf808 @func3
// etc.

// Initialization of the pointers to function
// Here each function has a int as parameter and returns an int
int (*func1)(int) = *((int(**)(int))(0xf800));
int (*func2)(int) = *((int(**)(int))(0xf804));
int (*func3)(int) = *((int(**)(int))(0xf808));

// Use of a pointer to call a function of the component
int result = func1(1234);

关于c - 函数指针或跳转表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31376210/

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