【问题标题】:Copying a function to RAM将函数复制到 RAM
【发布时间】:2014-08-08 09:47:10
【问题描述】:

我正在开发一个嵌入式应用程序,它有一个开机初始化例程,后面是一个无限循环,其中包含驻留程序(驻留在 ROM 内存中)和一个远程程序(驻留在 RAM 内存中)。类似于下面显示的代码

       main()
     {
       por();    // power on initialization
       while(1)
       {
          if(Flag == Resident) // enum Flag{Resident,Remote};
           ResidentProgram();           
          else
            RemoteProgram();   // program which needs to placed in RAM area of memory
       }
      }

在 por() 例程中,我想将 RemoteProgram() 复制到 RAM。稍后如果需要,我会将标志更改为远程。之后我希望程序从 RAM 位置执行 在这里,我无法将 RemoteProgram() 函数放在 RAM 中。好心的帮助 使用链接器脚本,我们将能够仅在运行前而不是在运行时将函数放置在所需的地址。在这里我想在运行时放置它。任何人都可以帮助解决这个问题。我也不想打扰其他变量占用的位置。

【问题讨论】:

  • 这完全取决于您使用的平台和工具链,没有标准的方式来表达这种事情。

标签: c memory embedded allocation


【解决方案1】:

我的建议(至少根据一些经验)是按照操作系统的方式进行操作:使用适当的目标文件格式,并自行加载。

你不能期望能够在 C 中复制一个已经编译好的函数,因为你无法访问函数中代码的任何基本信息(甚至不能访问它的大小,更不用说任何重定位信息) )。

因此,将代码嵌入为ELF 或其他格式,并编写一个可以将数据加载到所需位置的 ELF 加载器。在格式的“内部”可以让您在需要时正确实施重定位。

【讨论】:

    【解决方案2】:

    您的程序需要知道您的功能代码在只读存储器中的位置。一种方法是将代码放在“命名部分”中。您的函数需要编译,以便它可以在您要将其复制到的 ram 位置正确运行。所以该函数有一个加载位置和一个运行时位置。然后你可以编写一些 C 代码来将函数代码从它的加载位置复制到它的运行时位置。

    正如已经说过的,您如何做这一切取决于平台和工具链。这是一种方法:

    C源代码:

    #include <string.h>
    
    void copy_code_to_ram()
    {
        extern char _my_code_in_ram_start_space[];
        extern char _my_code_in_ram_end_space[];
        extern char _my_code_in_ram_start[];
        memcpy(_my_code_in_ram_start, _my_code_in_ram_start_space, _my_code_in_ram_end_space - _my_code_in_ram_start_space);
    }
    
    int i;
    
    #pragma code_seg("my_code_in_ram")
    
    void function_in_sram()
    {
        i++;
    }
    
    #pragma code_seg()
    
    void main()
    {
        copy_code_to_ram();
        function_in_sram();
        while (1);
    }
    

    链接器脚本提取:

    MEMORY
    {
        rom:    origin = 0XFFF00000, length = 0X100000
        ram:    origin = 0X00000000, length = 0X800000
    }
    
    SECTIONS
    {
        ____CODE :
        {
            <additional script here>
            __my_code_in_ram_start_space = .;
            . += sizeof(my_code_in_ram);
            __my_code_in_ram_end_space = .;
        } > rom
    
        __my_code_in_ram LOAD(__my_code_in_ram_start_space) :
        {
            __my_code_in_ram_start = .;
            *(my_code_in_ram)
            __my_code_in_ram_end = .;
        } > ram
        <additional script here>
    }
    

    显示生成此 C 代码和链接器脚本的工具链特定方法的视频可能很有用:

    http://www.crossware.com/coldfire/CCodeInRamVideo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-11
      • 2016-01-13
      • 2018-01-05
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 2016-12-03
      • 2017-09-12
      相关资源
      最近更新 更多