【问题标题】:How to write function at particular memory location in flash memory? Is there any directive for that?如何在闪存的特定内存位置写入函数?有什么指令吗?
【发布时间】:2015-08-06 22:38:37
【问题描述】:

如何在闪存的特定内存位置写入函数?有什么指令吗?我需要特定的链接器吗?

【问题讨论】:

  • 为什么要这样做?您是否尝试使用中断?您使用的是汇编还是 C?
  • 应用程序用于嵌入式编程,我必须在特定的内存位置编写一些函数,你能帮我吗?
  • 好像不行。
  • 我认为下面给出的答案很有帮助,请尝试通过一次

标签: linker 8051 keil


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    使用 ORG 指令。

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

    ORG 2000H
    MY_FUNC:
    : YOUR CODE HERE
    RET
    

    【讨论】:

      【解决方案3】:

      你使用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工具链。因此,我无法自己测试所有这些。 但我相信,如果你从一个简单的工作示例开始,一步一步地改变事情并检查会发生什么,你就可以自己管理它。

      祝你好运。
      赫尔穆特

      【讨论】:

      • 谢谢 Helmut,但你能告诉我如何配置 .obj 文件,因为编译器会处理这个问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-29
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      相关资源
      最近更新 更多