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.

[参考译文] CCS/MSP430FR2311:使用简单的引脚切换时的启动时间

Guru**** 2589280 points
Other Parts Discussed in Thread: MSP430FR2311

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/630160/ccs-msp430fr2311-start-up-time-with-simple-pin-toggle

部件号:MSP430FR2311

工具/软件:Code Composer Studio

大家好,

我有一个关于MSP430FR2311 Devkit的简单问题。 这是我的代码:

#include <MSP40.0.h>
#include <driverlib.h>

unsigned char i = 0;

int main(void)
{
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器

P1DIR || BIT0 | BIT1 | BIT2;

PM5CTL0 &=~LOCKLPPM5;

P1OUT |= BIT1 | BIT2;

for (I = 0;I<10;I++)
{
P1OUT &=~BIT0;
__DELAY周期(5万);
P1OUT |= BIT0;
__DELAY周期(5万);
}
} 

我通过测量WFP 1.1 和WFP 1.2 的开机和上升之间的时间来检查MCU的启动时间。  

对于for循环,它是1.14ms,而对于for循环,它是2ms以上。 当我在for循环下面放置更多的代码(没有其他代码)时,这一次会变得更高。

这对我没有意义,因为此代码在PIN切换后... 是否有我忘记的东西,或者有人能解释我的那种行为? 如果需要,我可以发布一些测量图片。

非常感谢!

此致,

曼努埃尔

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

    很难预测编译器在将代码编程到程序存储器中时如何优化代码。 令人奇怪的是,删除“For”循环会导致代码花费更长的时间才能看到WFP 1.1 的上升。 您如何衡量此延迟时间? 您是直接测量VCC线路上的电压和WFP 1.1 上的电压,还是测量触发复位后的时间?

    我还想问一下,使用和不使用For循环确定启动时间的目的是什么? 是否有您尝试满足的特定要求?

    此致,

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

    Matt,您好

    感谢您的回答。 我使用Agilent动力分析仪N6705B进行测量。 我测量了VCC (3V)上升和引脚上升之间的时间。

    是的,这段时间尽可能短非常重要。 它用于非常低功耗的系统,在该系统中,我可以节省的每一个UJ都非常重要。

    此致,

    曼努埃尔

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

    正如我所说的,很难预测编译器在将代码写入程序内存时对代码执行了什么操作。 我们只能建议编码最佳实践策略,我可以建议的一件事是尝试在主函数的末尾进入低功耗模式,或者在末尾包括一个while (1)循环。也许您代码末尾的当前未定义状态是 造成这种现象。

    当您说更多的代码会导致延迟时间增加时,这是有意义的,因为更多的代码会导致初始化代码在运行main函数之前增加。 如果您的解决方案对电源敏感,那么您最好的选择是让代码尽可能在LPM状态下运行。

    此致,

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

    Matt,您好

    再次感谢您的回答。

    似乎需要初始化更多的代码。 我还不完全理解这些FRAM微控制器,但我从未通过使用其他(非FRAM)微控制器看到过此问题。 因此我认为可以通过更改启动代码或类似内容来消除额外的时间。

    我还没有设法改变起点。  我知道缺省值 是_c_int00,但是在这个项目中 ,函数_c_int00_noargs_notexit被用作入口点。 如何将其切换到boot_special,c文件的另一个功能? 或者如何编写自己的函数? 这似乎都是在库中预编译的。 我通常不会在链接器中进行“深入”的工作,但最好是检查我是否能够获得尽可能最有效的启动。

    我在代码末尾有一个while (1)循环,当然我尽可能多地使用LPM状态。

    此致,

    曼努埃尔

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

    我刚刚将固件移植到IAR,启动时没有出现此类延迟!
    由于IAR中的许可证,在CCS中也能得到同样的行为,这将是一种很好的做法。

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

    您是否可以提供为代码生成的.map文件(带或不带"For (用于)"循环)。 MAP文件可以揭示有关运行时支持库在项目中包含的启动代码的更多信息。

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

    Matt,您好!

    我再次使用的代码:

    #include <MSP40.0.h>
    #include <driverlib.h>
    
    unsigned char i = 0;
    
    int main(void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
    
    P1DIR || BIT0;
    P1OUT || BIT0;
    
    PM5CTL0 &=~LOCKLP5;
    
    __DELAY_CYCLES (5万);
    
    for (i = 0; I<10;I++)
    {
    P1OUT &=~BIT0;
    __DELAY周期(5万);
    P1OUT |= BIT0;
    __DELAY周期(5万);
    }
    
    while (1);
    } 

    这里是我的.map文件。 CCS似乎正在自动选择自定义_c_int00函数...

    e2e.ti.com/.../mapFiles.zip

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

    Manuel

    我刚刚使用了你在第一篇文章中的代码,以便重新创建你的发现,但我无法这样做。 我为MSP430FR2311创建了一个新项目,并将您的代码复制到main.c文件中。 然后,我测量了从VCC上升到WFP 1.2 上升的时间,发现当“For”循环被包括在内时,延迟时间会更大。 这是有意义的,因为内存中有更多的值要初始化。

    测量到没有“For”回路的延迟为1.247毫秒,而对于for回路的延迟为1.5毫秒。 我还在项目属性中优化了编译器的速度。 我已附上屏幕截图和.map文件以供参考。

    e2e.ti.com/.../Start_2D00_Up-Info.zip

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

    Matt,您好

    感谢您的努力! 你刚刚写道,你无法重新创建我的发现,但你完全重新创建了这种延迟。 这正是我的问题。 在本例中,这是一个非常短的延迟,所以您可能会想,为什么我会关注这一点... 在我的较大固件中,主要是SPI通信和引脚切换,这种延迟比5毫秒还要长。 此时,我松开了几个微焦耳!

    在具有相同固件的IAR中,此延迟仅为1.5毫秒。 而且,它不会以更多或更少的代码来提高。 我在IAR中浏览了汇编程序代码,在跳转到主地址之前没有什么可做的,而CCS有那些自定义 的_c_int00函数,我无法更改。 因此,CCS也可以关闭这些功能。 这会很好,因为我比IAR更喜欢它:)

    我希望现在可以更清楚一点。

    此致,

    曼努埃尔

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

    当我说我无法在第一篇文章中重现问题时,我提到您说过,没有"For (为)"循环,代码的延迟时间会更长。 在我的一端,带有“for”循环的代码的延迟时间较长。

    无论我看到的是小代码,您的问题都是在大代码中看到的~5ms延迟。 我可以尝试重新创建它,看看如果您向我发送较大的代码,如何减少它。

    此致,

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

    Matt,您好!

    这是我的错!! 我搞砸了这两个延误。 当然,对于for循环,它的长度更长。 很抱歉,我无法提供代码,因为它是保密的。 最近,我尝试在没有机密信息的情况下创建一个类似的新项目...

    或者,有人可以向我解释如何影响启动程序...


    谢谢,此致,

    曼努埃尔

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

    这是可以理解的! 对于您的类似项目文件,请确保具有虚拟变量/数组和与您的机密代码类似的代码流,这样我就可以尝试重新创建您看到的较大延迟。

    此致,

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

    Matt,您好!

    这是我刚刚创建的项目。 结构相同,变量数量相同。

    从VCC到WFP 1.2 和WFP 1.4 的上升时间为5.3毫秒。 当我删除main中的switch指令时,这一次只有4毫秒。 只是因为换了一家酒店……

    具有相同固件的IAR的启动时间仅为1.3毫秒,并且在添加更多代码时不会增加。

    谢谢!

    此致,

    曼努埃尔

    e2e.ti.com/.../StartUpMeasurementMSP430FR2311.zip

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

    Manuel

    感谢您发送项目等效产品! 在测试启动时间(包括和不包括switch语句)后,我测量到延迟为2.14ms和1.921ms。 我的方法是在CCS中为MSP430FR2311启动一个新项目,然后将main.c,SPI.c和spi.h文件复制到目录中。 然后我进入了我的项目属性并优化了一些设置,以使初始化代码更小(即 --cinit_hHold_wdt到off, --zero_init到off,以及优化的编译器以提高速度)。 我对设备进行了编程,断开了连接,并使用了电源为电路板通电并测量相应的信号。

    我不知道为什么您会遇到超过5毫秒的延迟,但也许使用优化的设置创建新项目会对您有所帮助。 另一件事是确保您的所有软件和编译器版本都是最新的(我使用的是编译器版本TI v 16.9 .4.LTS)。

    CCS和IAR之间的区别仅仅是因为它们基于两个完全不同的编译器。 如果您真的想深入了解编译器的不同之处,最好在TI C/C++编译器论坛上发布您的查询,并参考此主题以获取背景信息。

    此致,

    Matt Calvo

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

    Matt,您好!

    感谢您进行此测试。 很遗憾,我无法再现。 我为MSP430FR2311创建了一个新项目,并在其中复制了main.c,spi.c和spi.h,并删除了main.c (包括)的前两行。

    然后我去了项目合作,做了以下事情:

    -编译器版本为TI v.16.9 .4.LTS
    -已关闭--cinit_hHold_WDT
    -已关闭--zero_init
    -针对速度优化的编译器

    启动时间仍为5毫秒。 我上面提到的其中一个选项会导致启动时间缩短0.3毫秒。

    下面是我使用的新项目(我的测量图片包含在项目根中)

    此致,

    曼努埃尔

    e2e.ti.com/.../3324.Test.zip

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

    这听起来很显然,现在应该将其发送到编译器论坛,因为我已经用尽了MSP430和CCS方面的所有途径。 感谢您的耐心等待,我希望您能找出造成此延迟的原因。 如果几天后您未收到有关此主题的响应,请直接在TI C/C++编译器论坛上发布新帖子,以便他们的支持团队可以看到它。

    此致,

    Matt Calvo