如何在闪存中的特定内存位置写入功能?那有什么指示吗?

时间:2015-05-25 12:32:30

标签: linker 8051 keil

如何在闪存中的特定内存位置写入功能?那有什么指示吗?我需要特定的链接器吗?

3 个答案:

答案 0 :(得分:1)

如果您使用keil ide,可以使用.ARM .__ at_address作为节名称将函数放在特定地址。要将函数add添加到0x20000,请指定:

int add(int n1,int n2) __attribute__((section(".ARM.__at_0x20000")));
int add(int n1,int n2)
{
    return n1+n2;
}

答案 1 :(得分:0)

你使用keil工具链吗?
如果是,也许http://www.keil.com/support/docs/359.htm有帮助。

编辑: .obj文件由编译器生成。我不确定你对'如何配置.obj文件'的意思。

上面提到的链接器获取obj文件,将它们链接在一起并放置代码和变量。

您应该从一个没有错误的编译和链接的项目开始。 然后你有:
- 一些c文件。其中一个有你的功能。
- 包含链接器设置的链接文件 - 一个makefile或某种批处理文件,它使用必要的参数调用编译器和链接器。

如果有,可以在m51文件中查找函数符号的名称。 m51文件是由lx51链接器生成的文本文件,其中包含有关哪些符号以及链接器使用它们的有趣信息。

我提到的链接器的keil文档说:编译器使用以下格式为函数创建符号名称:?PR?function_name?file_name。

这意味着:您将在m51文件中找到项目所有功能的名称。如果您的函数位于文件file_x中并且名为func_x。符号名称为PR?func_x?file_x

http://www.keil.com/support/man/docs/lx51/lx51_segments.htm中,您可以找到有关lx51链接器的SEGMENTS指令用法的一些信息。根据那个:

SEGMENTS (PR?func_x?file_x(C:0x1234))

应将函数放在代码存储区中的地址0x1234。

其实我没有keil工具链。因此,我无法自己测试所有这些。 但我相信如果你从一个简单的工作示例开始,逐步改变并检查会发生什么,你可以自己管理。

祝你好运。
赫尔穆特

答案 2 :(得分:0)

使用ORG指令。

例如,对于从位置2000H开始的函数

ORG 2000H
MY_FUNC:
: YOUR CODE HERE
RET