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.

[参考译文] 编译器/MSP430FR2311:在加载或运行时初始化变量。

Guru**** 2587365 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/604773/compiler-msp430fr2311-initialization-of-variables-at-load-time-or-run-time

部件号:MSP430FR2311

工具/软件:TI C/C++编译器

您好,Champs:

加载时变量初始化(--ram_model)通过减少启动时间和保存初始化表使用的内存来提高性能。

如果我在加载时初始化变量似乎有好处,使用--ram_model进行变量初始化是否有缺点? 如有任何想法,请提供建议,谢谢。

此致,

卢克

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

    使用--ram_model构建时,系统必须包含一个加载程序,该加载程序可以读取.out文件,查找初始化记录,处理这些记录,从而初始化相关变量。  自行引导的系统没有此类加载程序,因此必须使用--rom_model。

    作为可以使用--ram_model...的系统示例 假设此系统具有ARM CPU和DSP CPU,并且Linux正在ARM上运行。  臂侧可以有一个加载程序,可以将.out文件加载到DSP上并开始运行。  在这种情况下,可以使用--ram_model构建DSP可执行文件。

    谢谢,此致,

    -George

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

    我正在使用--ram_model并在.c文件中自己初始化变量。

    这种方法是否可行? 我错过了什么问题吗? 请告知,谢谢。

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

    如果您在CCS下执行,它将起作用。  因为CCS具有可处理变量初始化表的加载程序。  您是否在未使用CCS的情况下尝试执行?  会发生什么?

    谢谢,此致

    -George

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

    您好,George,

    我使用下面的简单代码来评估此案例,

    #include <MSP4S.h>

    无符号字符计数器;

    /**
    主要c
    */
    Void主(void)

      WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器

      计数器= 5;

      P1DIR || BIT0;
      P2DIR || BIT0;
      //------------------
      //禁用GPIO通电默认高阻抗模式以之前激活
      //配置的端口设置
      PM5CTL0 &=~LOCKLPM2;

      同时(1)
      {
       IF (计数器= 5)
       {
         P2OUT &=~BIT0;  //关闭绿色LED
         P1OUT ^= BIT0;   //切换红色LED
         __DELAY周期(50万);
       }
       否则
       {
         P1OUT &=~BIT0;  //关闭红色LED
         P2OUT ^= BIT0;   //切换绿色LED
         __DELAY周期(50万);
       }
      }
    }

    当我同时使用--rom_model和--ram_model时,我得到下面两个使用的FRAM大小,当在独立的带有CCS的FR2311 LaunchPad上运行代码时,我得到相同的结果,红色LED被切换。

    使用时--rom_model
    名称使用的原点 长度   未使用 的属性  填充
    ----------------------------------
    BSL0.001万 0000100.0008万 0000080万 0000000万 0000.08万 RWIX
    RAM 0.002万00 000004000万00400 000000a14亿a1 0000035f10000035f RWIX
    fram 0000f100 00000e80000000e80 0000028e00000028e 0万b08 RWIX

    使用时--ram_model
    名称使用的原点 长度   未使用 的属性  填充
    ----------------------------------
    BSL0.001万 0000100.0008万 0000080万 0000000万 0000.08万 RWIX
    RAM 0.002万00 000004000万00400 000000a14亿a1 0000035f10000035f RWIX
    fram 0000f100 00000e80000000e80 000000868万00086 00000e000.0086万 00000e00 RWIX0万 RWIX

    请发表任何评论?

    此致,
    卢克

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

    Luke CHIN 说:
    在独立的带有CCS的FR2311 LaunchPad上运行代码时,我得到相同的结果,红色LED被切换。[/QUOT]

    该句中的关键字是"与CCS一起"。  CCS有一个加载程序,可以查找并处理初始化记录,从而初始化全局变量。  您的最终应用程序不太可能有这样的加载程序。  如果是这种情况,则必须使用--rom_model。

    谢谢,此致,

    -George

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

    您好,George,

    抱歉输入错误。 我使用--ram_model和--rom_model运行示例代码,但不使用 CCS,结果相同,您可以看到我在main()函数中初始化全局变量。 如果您手头有任何MSP430 LaunchPad,相信您可以试用它。

    当使用--rom_model时,运行时支持库将花费700字节以上的时间用于初始变量,即使我只是声明一个全局变量。 当客户使用2 KB 内存大小MSP430时,这是内存大小问题。 这就是我尝试--ram_model绕过库变量初始化过程并保存内存大小的原因。

    我的问题是,当我使用--ram_model时,除了变量初始化之外,还有什么我们应该注意的?

    此致,
    卢克

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

    我使用--ram_model和--rom_model运行我的示例代码而不使用 CCS,并且得到相同的结果,您可以看到我在main()函数中初始化全局变量。 如果您手头有任何MSP430 LaunchPad,相信您可以试用它。

    我不知道在不使用CCS的MSP430 LaunchPad上运行代码的任何方法。  请向我指出详细说明如何完成这项工作的文件。

    谢谢,此致,

    -George

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

    我的问题是,当我使用--ram_model时,除了变量初始化之外,还有什么我们应该注意的?

    在您的应用程序代码中,您可以确保在应用程序读取变量之前明确分配变量。

    如果链接库函数,这些函数是在假定变量将使用初始化函数(.data部分)或零初始化函数(.bss部分)进行设置的情况下编写的,则在不使用加载程序的情况下使用--ram_model将中断库代码。

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

    我使用CCS开发软件并下载到MSP430,然后断开仿真器,重新启动FR2311 LaunchPad并检查结果。

    这就是我要在没有CCS的情况下运行代码的意思。

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

    我要向你道歉。  我错过了您在6月26日发布的代码示例中的一个重要细节。  这里...

    [引述用户="Luke Chen "]

    无符号字符计数器;

    /**
    主要c
    */
    Void主(void)

      WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器

      计数器= 5;

    [/引述]

    变量计数器由函数main中的赋值语句初始化。  因此,计数器初始化为5,而不考虑使用--rom_model还是--ram_model。  如果你写过...

    无符号字符计数器=5; //此处初始化计数器
    
    /**
    * main.c
    */
    void main(void)
    {
    WDTCTL = WDTPW | WDTHOLD;//停止监视计时器
    
    /*计数器=5;*/ //主中没有计数器初始化 

    ...那么--ram_model或--rom_model的选择就像我描述的那样重要。

    因此,在您演示的非常窄的情况下,您可以使用--ram_model或--rom_model,所有的操作都仍然有效。  在一般情况下,我假设只有在智能加载程序是整个系统的一部分时,才可以使用--ram_model。

    谢谢,此致,

    -George