3

我想在位置 0x3FF802 放置一个函数 void loadableSW (void)。在另一个函数 residentMain() 中,我将使用指向函数的指针跳转到该位置。如何声明函数 loadableSW 来完成这个。为了清楚起见,我附上了 residentMain 的骨架。

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

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

另外我很好奇。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 ();
        }
    }
4

2 回答 2

0

我不确定您的操作系统/工具链/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

于 2013-10-31T08:28:03.940 回答
0

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

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

如果您的目标支持PC 相对寻址并且您可以确保它是pure,那么您可以使用 amemcpy()重定位例程。

How to run code from RAM...对此有一些提示。如果您不能生成PC 相对/可重定位代码,那么没有链接器的帮助您绝对无法做到这一点。那是链接器/加载器的定义,用于修复地址。

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

于 2013-10-31T13:11:38.637 回答