This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSPM0C1105:如何使用链接器文件定义。

Guru**** 2763595 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1604793/mspm0c1105-how-to-use-linker-file-definitions

器件型号: MSPM0C1105

define FLASH_STARTUP_ADDRESS  0x00000000U

 

Can we use the definitons from the linker file rather than hardcoding address here

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Santhosh、

    您能提供更多背景信息吗? 我不确定我是否完全理解您的要求。 您认为是否可以将定义用作 MEMORY 指令内的值?

    MEMORY
    {
        FLASH           (RX)  : origin = 0x00000000, length = 0x0000FFF8
        SRAM            (RWX) : origin = 0x20000000, length = 0x00001000
        BCR_CONFIG      (R)   : origin = 0x41C00000, length = 0x000000FF
        BSL_CONFIG      (R)   : origin = 0x41C00100, length = 0x00000080
    }

    此致、

    Owen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    /*闪存区域的起始*/
    #define FLASH_STARTUP_ADDRESS           0x00000000U

    /*闪存区域结束*/
    #define FLASH_ENDING_ADDRESS            0x00007FFFU
    链接器文件中提供的定义不是对地址进行硬编码。 以便我可以在.c 文件中使用  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Santhosh、

    链接器文件中没有可 在 C 文件中使用的原点和长度定义。 对这些定义进行硬编码可能是最佳选择、因为在开发过程中很少更改内存布局、并且需要对项目进行最少的更改。

    如果要在链接器文件中创建定义、仍需要对其进行硬编码。 此外、您必须在.syscfg 文件中禁用链接器文件生成、以便在构建工程时不会擦除这些定义。 我个人不会推荐这里。 但是、如果要遵循此方法、下面是一个需要添加到链接器文件中的示例:

    __FLASH_START = 0x00000000;
    __FLASH_END   = 0x0000FFF7;    /* 0x00000000 + 0x0000FFF8 - 1 */
    __FLASH_SIZE  = 0x0000FFF8;
    __SRAM_START  = 0x20000000;
    __SRAM_END    = 0x20000FFF;    /* 0x20000000 + 0x00001000 - 1 */
    __SRAM_SIZE   = 0x00001000;

    用户需要制作链接器文件的副本并将其移动到 Debug 文件夹之外。

    构建时、您可以在.map 文件中观察全局符号。 然后、您可以在 C 文件中访问它们、如下所示:

    extern const uint32_t __FLASH_START;
    extern const uint32_t __FLASH_END;
    extern const uint32_t __FLASH_SIZE;
    extern const uint32_t __SRAM_START;
    extern const uint32_t __SRAM_END;
    extern const uint32_t __SRAM_SIZE;
    
    #define FLASH_STARTING_ADDRESS  ((uint32_t)&__FLASH_START)  // 0x00000000
    #define FLASH_ENDING_ADDRESS    ((uint32_t)&__FLASH_END)    // 0x0000FFF7

    如您所见、这比对.c 或.h 文件中的定义进行硬编码要做得多。  

    此致、

    Owen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的答复

    如何在不使用全局变量(这意味着没有 extern)的情况下访问该变量。

    我知道静态声明它不起作用。 任何其他想法都直接从链接器文件访问、而不使用全局变量。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Santhosh、

    我理解对于“全局变量“的混淆、但链接器符号与常规全局变量有着根本的不同。

    外部声明不会创建全局变量。 它们告诉编译器如何访问链接器创建的符号。 这是所有嵌入式系统中使用的业界认可的标准方法。

    没有其他方法可以访问 C 代码中由链接器定义的存储器区域。

    您不想使用硬码定义的原因是什么吗? 这基本上是可维护的、就像在链接器文件中定义符号一样。

    此致、

    Owen