C 将函数复制到RAM

C 将函数复制到RAM,c,memory,embedded,allocation,C,Memory,Embedded,Allocation,我正在开发一个嵌入式应用程序,它有一个开机初始化例程,然后是一个无限循环,其中包含驻留在ROM内存中的程序和驻留在RAM内存中的远程程序。类似于下面显示的代码 main() { por(); // power on initialization while(1) { if(Flag == Resident) // enum Flag{Resident,Remote}; Residen

我正在开发一个嵌入式应用程序,它有一个开机初始化例程,然后是一个无限循环,其中包含驻留在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语言中,您不能期望能够复制已经编译好的函数,因为您将无法访问函数中代码的任何基本信息,甚至不能访问其大小,更不用说任何重新定位信息了


因此,将代码嵌入为一种或其他格式,并编写一个ELF加载程序,它可以将数据加载到所需的位置。如果需要,处于该格式的内部将允许您正确地实施重新定位。

我的建议是,至少有一些经验的职位可以按照操作系统的方式进行重新定位:使用适当的对象文件格式,然后自己加载

在C语言中,您不能期望能够复制已经编译好的函数,因为您将无法访问函数中代码的任何基本信息,甚至不能访问其大小,更不用说任何重新定位信息了


因此,将代码嵌入为一种或其他格式,并编写一个ELF加载程序,它可以将数据加载到所需的位置。如果需要,位于格式内部将允许您正确执行重新定位。

您的程序需要知道功能代码在只读内存中的位置。一种方法是将代码放在“命名节”中。您的函数需要进行编译,以便它能够在您要将其复制到的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代码和链接器脚本的特定于工具链的方法,可能很有用:


您的程序需要知道功能代码在只读存储器中的位置。一种方法是将代码放在“命名节”中。您的函数需要进行编译,以便它能够在您要将其复制到的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代码和链接器脚本的特定于工具链的方法,可能很有用:


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