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.

[参考译文] WEBENCH®︎工具/MSP430FR6972:有关自定义段的问题

Guru**** 2606725 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/647419/webench-tools-msp430fr6972-a-question-about-selfdefine-segment

器件型号:MSP430FR6972

工具/软件:WEBENCHRegistered设计工具

1、我想将一些变量放置在 lnk430fr6972.xcl 中定义的名为 BOOTPARASEG 的自定义段中

-Z (data) BOOTPARASEG=4C00-571F

2、变量定义如下

#pragma dataseg=_data16 BOOTPARASEG

PARACFG_EXT __NO_INIT uint8 g_ucWakeUpFlag;
PARACFG_EXT __NO_INIT uint8 g_ucRFRecvFlag;

PARACFG_EXT __NO_INIT uint16 g_ucCodeVersion[5];

#pragma dataseg=default

3、"g_ucRFRecvFlag" 不在 seldefine 段中的编译结果。 我想知道原因是什么、谢谢。

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

    您是否已针对您的变量尝试过 pragma 位置?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的答复。我尝试了@的方法、它是有效的、但我想同时将多个变量放入一个自定义段中、这样就不需要为每个变量写入"位置"或"@"。

    此致

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

    你好!

    您能否提供完整示例? 如果我尝试您的示例(在删除 PARACFG_EXT 之后)、它似乎按预期工作。

      Anders Lindgren,IAR Systems

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

    海洛!

    这个问题也许只是在我的项目中。我不能提供整个项目,抱歉!

    那么,您能否根据您的经验向我展示一些可用于解决问题的建议?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哦、您不需要提供整个项目。 事实上,你不应该像我那样过年。 我需要的是一个称为最小、完整的示例的东西。

    在您的情况下、使用几行代码可能就足够了。

    正如我之前说过的、我尝试根据您提供的代码自行重新创建问题、但当我执行所有操作时、似乎都按预期工作。

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

    是的、我知道并且我也尝试制作一个简单的项目进行测试。结果是我在项目中遇到的问题。

    这个问题只是 在整个项目中发现的。 我没有其他示例要提供。

    接下来该怎么办?

    谢谢!

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

    您可以尝试剪切原始应用程序。 通常、您可以移除其中的大部分内容、同时仍然保留问题。 如果问题消失、您可以恢复更改并消除其他问题。

    最后、您将有一些小问题、但仍然可以证明问题。

      Anders Lindgren,MSP430 IAR 编译器的作者。 IAR 系统

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

    e2e.ti.com/.../MiniPrj.rar

    感谢您的建议。 附件 是问题最小的项目。谢谢!

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

    我看了一个示例。 解压 include 文件后、我将其归结为以下几行代码:

    //从 AppParaCfg.h 
    #pragma DATAEG=_data16 BOOTPARASEG __NO_init unsigned char g_ucRFRecvFlag;//@0x5017; #pragma datasedeseg=default //来自 AppComRef.h
    extern unsigned char g_ucRFRecvFlag;

    编译器将使用它看到的最后一个定义或声明指定的段。 在这种情况下、声明(以"extern "开头的行)。 由于没有"dataseg" pragma 处于活动状态、因此它会将变量放置在 DATA16_N 存储器中。

    要解决此问题、可以在声明中添加"pragma dataseg"指令。 或者、重新组织头文件、以便定义最后出现。

    另一种更好的方法是使用"#pragma LOCATE"、因为此结构不会遇到相同的问题(使用"pragma LOCATE"时、定义将始终控制放置)。 如果您不想为每个定义写出 pragma 指令、则可以使用"_Pragma "结构、该结构可以嵌入到预处理器宏(我注意到您已经使用了预处理器宏)中。

    例如:

    #ifdef _PARACFG
    #define PARACFG_EXT _Pragma ("location="\" BOOTPARASEG\")
    #else
    #define PARACFG_EXT extern
    #endif
    
    PARACFG_EXT __no_init unsigned char g_RecucWakeUpchar;//@0x56FC
    PARACFG_EXT_EXT_ENDIT_RF17/@0xFFT;//
    

      Anders Lindgren,IAR Systems MSP430 IAR 编译器的作者

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯、看起来编辑器混乱了代码示例的格式。 在第一个示例中、文件名中的".h"后面应该有换行符。 它应如下所示(增加了更多空间以避免不必要的干扰):

    //从 AppParaCfg.h

    #pragma dataseg=_data16 BOOTPARASEG

    _no_init unsigned char g_ucRFRecvFlag;//@0x5017;

    #pragma dataseg=default

    //从 AppComReg.h

    extern unsigned char g_ucRFRecvFlag;

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

    这就是我需要知道的。 正如 您所说,我已经尝试了,它是有效的。谢谢。