将功能复制到RAM

时间:2014-06-18 07:44:25

标签: c memory embedded allocation

我正在开发一个嵌入式应用程序,它具有开机初始化程序,然后是一个无限循环,它包含常驻程序(驻留在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中。善意的帮助 使用链接器脚本,我们只能在运行时之前将函数放在所需的地址,而不是在运行时。在这里,我想在运行时放置它。有谁可以帮助解决这个问题。我也不想打扰其他变量所占据的位置。

2 个答案:

答案 0 :(得分:3)

我的建议(至少从一些经验的位置)是按照操作系统的方式来做:使用适当的目标文件格式,并自己加载。

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

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

答案 1 :(得分:1)

您的程序需要知道功能代码所在的只读存储器的位置。一种方法是将代码放在“命名部分”中。您的函数需要编译,以便它将在您要将其复制到的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