如何在 C 中的特定地址放置函数

How to place a function at a particular address in C?

本文关键字:地址 函数      更新时间:2023-10-16

我想在特定位置放置一个函数void loadableSW (void)0x3FF802 .在另一个函数residentMain()中,我将使用指向函数的指针跳转到此位置。如何声明函数 loadableSW实现这一目标。为了清楚起见,我附上了residentMain的骨架。

更新:目标硬件是 TMS320C620xDSP。由于这是一个航空航天项目,因此确定性行为是一个理想的设计目标。理想情况下,他们想知道内存的哪一部分在特定时间包含什么。我刚刚知道的解决方案是在链接器文件中定义内存中的部分。该部分应从0x3FF802(放置函数的位置)开始。由于loadableSW函数的大小是已知的,因此也可以确定内存部分的大小。然后指令#pragma CODESECTION ("function_name", "section_name")可以将该函数放在指定的部分中。

由于测试脚本中不允许使用pragma指令,我想知道是否有任何其他方法可以在不使用任何链接器指令的情况下执行此操作。

此外,我很好奇。C++ 中是否有函数的放置语法?我知道有一个对象,但是函数呢?

    void residentMain (void)
    {
        void (*loadable_p) (void) = (void (*) (void)) 0x3FF802;
        int hardwareOK = 0;
    
        /*Code to check hardware integrity. hardwareOK = 1 if success*/
    
        if (hardwareOK)
        {
            loadable_p (); /*Jump to Loadable Software*/
        }
        else
        {
            dspHalt ();
        }
    }

我不确定您的操作系统/工具链/IDE,但以下答案应该有效:

如何指定存储函数的内存位置?

我知道只有一种方法,它显示在第一个答案中。

更新

如何在 gcc 中定义部分:

变量:http://mcuoneclipse.com/2012/11/01/defining-variables-at-absolute-addresses-with-gcc/

方法(部分("部分名称")):http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Function-Attributes.html#Function%20Attributes

如何在 C 中的特定地址放置函数?

由于杂注指令在测试脚本中是不允许的,我想知道是否有任何其他方法可以在不使用任何链接器指令的情况下做到这一点。

如果目标支持 PC 相对寻址,并且可以确保它是纯的,则可以使用memcpy()来重新定位例程。

如何从内存运行代码...对此有一些提示。 如果您无法生成与PC相关的/可重定位的代码,那么如果没有链接器的帮助,则绝对无法做到这一点。 这是链接器/加载器的定义,用于修复地址。

这可以带你到一个不同的概念。 不要完全链接您的代码。 而是将地址修复推迟到加载。 然后,您必须编写一个加载器以在运行时放置代码;但从您的航空航天项目评论来看,我认为复杂性和分析也很重要,所以我不相信您会接受这一点。 您还需要双倍的存储空间等。