gpt4 book ai didi

c++ - AVR G++ : Executing a function that is past the 128 Kb ROM boundary

转载 作者:太空狗 更新时间:2023-10-29 22:56:52 25 4
gpt4 key购买 nike

AVR g++ 的指针大小为 16 位。但是,我的特定芯片(ATMega2560)有 256 KB 的 RAM。为了支持这一点,编译器会在与当前执行代码相同的 ROM 部分中自动生成蹦床部分,然后包含扩展的汇编代码以跳入高内存或返回。为了生成蹦床,您必须获取位于高端内存中的地址。

在我的场景中,我有一个我编写的引导加载程序位于高端内存中。应用程序代码需要能够调用引导加载程序中的函数。我知道这个函数的地址,并且需要能够通过在我的代码中硬编码地址来直接寻址它。

如何让编译器/链接器为任意地址生成适当的蹦床?

最佳答案

只有当远地址是一个符号地址而不是代码中已有的常量时,编译器和链接器才会生成蹦床代码。类似的东西(假设你想跳转到的地址是 0x20000)。

extern void (*farfun)() = 0x20000;

farfun ();

肯定不会工作,它不会导致链接器做任何事情,因为地址已经解析。

您应该能够像这样在链接器命令行中注入(inject)符号地址:

extern void farfun ();

farfun ();

“正常”编译并链接

-Wl,--defsym,farfun=0x20000

我认为很明显,您需要自己确保 farfun 上有一些合理的东西。

您很可能还需要--relax

编辑

我自己从未尝试过,但也许:

您可能会尝试将函数地址存储在高端内存的表中,并像这样声明它:

extern void (*farfunctable [10])();

(farfunctable [0])();

并使用完全相同的链接器命令来解析外部符号(现在您位于 0x20000 的表(在引导加载程序中)需要如下所示:

extern void func1();
extern void func2();

void ((*farfunctab [10])() = {
func1,
func2,....
};

我建议将 func1() ... func10() 放在与 farfunctab 不同的模块中,以便让链接器知道它必须生成 trampolins。

关于c++ - AVR G++ : Executing a function that is past the 128 Kb ROM boundary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46656072/

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