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