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.

[参考译文] MSP430FR6043:程序在 BOR 后不运行

Guru**** 2481065 points
Other Parts Discussed in Thread: MSP430FR6043, UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1281131/msp430fr6043-program-doesn-t-run-after-bor

器件型号:MSP430FR6043
主题中讨论的其他器件: UNIFLASH

大家好!

我将 msp430fr6043与 USS 模块一起使用。 我正在使用 cl430 (来自 ti-CGT-MSP430_21.6.1.LTS)通过以下标志进行编译/链接:

编译器:

CFLAGS    += --define=__MSP430FR6043__
CFLAGS    += --define=_MPU_ENABLE
CFLAGS    += --c99
CFLAGS    += --silicon_version=mspx
CFLAGS    += --code_model=large
CFLAGS    += --data_model=large
CFLAGS    += --opt_level=4
CFLAGS    += --opt_for_speed=1
CFLAGS    += --use_hw_mpy=F5
CFLAGS    += --compile_only
CFLAGS    += --printf_support=minimal
CFLAGS    += --diag_wrap=off
CFLAGS    += --display_error_number
CFLAGS    += --silicon_errata=CPU21
CFLAGS    += --silicon_errata=CPU22
CFLAGS    += --silicon_errata=CPU40
CFLAGS    += --disable_interrupts_around_hw_mpy=on
CFLAGS    += --section_sizes=on
CFLAGS    += --obj_extension=.o
CFLAGS    += --obj_directory=$(BUILD_DIR)

连接器(也称为 cl430):

LDFLAGS   += --silicon_version=mspx
LDFLAGS   += --silicon_errata=CPU21
LDFLAGS   += --silicon_errata=CPU22
LDFLAGS   += --silicon_errata=CPU40
LDFLAGS   += --code_model=large
LDFLAGS   += --data_model=large
LDFLAGS   += --printf_support=minimal
LDFLAGS   += --run_linker        # Next flags are linker flags
LDFLAGS   += --use_hw_mpy=f5
LDFLAGS   += --heap_size=160
LDFLAGS   += --stack_size=512
LDFLAGS   += --cinit_hold_wdt=on
LDFLAGS   += --entry_point=_c_int00_noargs
LDFLAGS   += --section_sizes=on
LDFLAGS   += -m"$(PROJECT).map"
LDFLAGS   += -xml_link_info="$(PROJECT).xml"

我还要生成一个具有以下内容的.hex 文件:

hex430 --memwidth=8 --romwidth=8 --diag_wrap=off --intel  project.elf -o project.hex

但我遇到了一些不同寻常的行为。


问题1:

  1. 在使用 mspdebug 加载*。elf 文件时、
    1. 程序启动
    2. 运行时间~1s
    3. 停止(无复位、无中断被调用)
  2. 在使用 mspdebug 加载*。elf 文件时、
    1. 程序启动
    2. 正常运行
  3. 在使用 uniflash 加载*。hex 文件时、
    1. 程序启动
    2. 正常运行
  4. 如果程序正在运行、且我通过按下和松开图中指示的
    1. 与(1.)相同

都是1。 和2. 处理同一个文件。 如果我使用同一文件对 MSP 4x 进行一行编程、有时为1. 触发、其他时间为2。 发生


问题2:

如果我将一个全局变量声明为:

const struct my_struct_t my_struct = {
    &my_element_1,
    &my_element_2,
    &my_element_3
};

刷写程序后、存储在结构中的地址是正确的、但在下电上电后不正确。

似乎第二次未初始化存储器。


我认为这两个问题都是相关的、但我不知道我缺少什么...

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

    尊敬的 Eduardo:

    为了澄清、在问题1中、.elf 和.hex 文件中都出现了项目4? 换而言之、器件始终在下电上电后停止约1秒。

    此外、当您说器件停止时、您可以再详细说明一下吗? 您是指器件跳转到默认处理程序、程序执行暂停还是其他情况?

    有趣的是、根据您使用的 ABI、您会有不同的行为。

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

    你好,迪伦,对不起误解。

    问题1、问题4出现、与使用的文件和/或工具无关。

    不过、它有2种不同行为。

    有时程序只是挂起。 正常运行(显然)~1、然后只是挂起。 甚至是我用于节拍的计时器也会停止。

    有时它继续运行,似乎开始运行正常,但看起来它继续重置。

    我在程序的某些部分有一个可切换的针脚、并且可以在我回到办公室后与模式共享一些打印件。

    在 debug (mspdebug with tilib + gdb)下、我似乎无法捕捉到问题。 我很容易找到问题2解决方法(虽然不是解决方案)、但无法找到问题1情况。 有时我单步执行一个操作、甚至 gdb 服务器也会停止运行。 其他时候我会在???? 和无法步进、因为调试器不知道不存在的函数在哪里结束(图)

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

    感谢您澄清 Eduardo、

    您能否尝试降低您使用的优化级别? 如果降低优化级别或完全取消优化、看看该问题是否消失了。 如果这样做没有帮助、我们将继续研究这个问题。

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

    那么、发生了什么使事情变得更糟呢?

    正如你所问的,我使用`- opt_level=off`编译,一切都正常,所以我开始增加优化,也看到它开始的错误行为。

    `--opt_level=4`:引导正常->下电上电->失败

    `--opt_level=off`:引导正常->下电上电->正常

    `--opt_level=0`:Boot OK -> Power cycle -> OK

    `--opt_level=1`:引导正常->下电上电->正常

    `--opt_level=2`:引导正常->下电上电->失败

    从2级向前看、它会失败、但我忘记保存逻辑分析仪输出、所以我回去重复所有操作。

    只有这一次,我回到了4级,没有任何失败。。。

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

    真有意思。 您是否已尝试使用所有默认链接器和编译器设置以及 OPT 级别4运行此项目以查看是否仍然出现此问题? 我很高兴降低优化有助于解决问题、但我想知道到底是什么问题/优化设置究竟发生了什么变化、从而导致器件在下电上电后挂起。

    您可以尝试的另一项操作是调试器件、关闭再打开电源、然后当器件挂起时、可以在器件运行时使用调试器连接到该器件、以查看其挂起的位置。 这可能有助于我们发现问题。 如果您需要有关如何连接到正在运行的设备的说明、请告诉我。 您需要调整一些调试设置、以防止连接复位。

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

    您好,Dylan,

    我尝试使用尽可能少的标志进行编译、但最终需要使用以下

    CFLAGS    += --c99
    CFLAGS    += --silicon_version=mspx
    CFLAGS    += --silicon_errata=CPU21
    CFLAGS    += --silicon_errata=CPU22
    CFLAGS    += --silicon_errata=CPU40
    CFLAGS    += --code_model=large
    CFLAGS    += --data_model=large
    CFLAGS    += --printf_support=minimal
    CFLAGS    += --opt_level=1     #tried off -> 0 -> 1 -> 2
    CFLAGS    += --compile_only
    
    # Linker Flags
    LDFLAGS   += --silicon_version=mspx
    LDFLAGS   += --silicon_errata=CPU21
    LDFLAGS   += --silicon_errata=CPU22
    LDFLAGS   += --silicon_errata=CPU40
    LDFLAGS   += --code_model=large
    LDFLAGS   += --data_model=large
    LDFLAGS   += --printf_support=minimal
    LDFLAGS   += --run_linker        # Next flags are linker flags
    LDFLAGS   += --entry_point=_c_int00_noargs

    与先前一样、从2级向前看、程序无法从引导加载程序

    正如您在下图中看到的那样,pic 4.0.1和 pic 4.0.2应该相同,但 OPT_LEVEL>1时发生了这种情况

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

    明白了、感谢您尝试这么做。

    所以在您的映像中、增加优化级别似乎会缩短启动过程(但仅在器件重启之后)?

    我担心的是、我不知道优化设置中的某些情况会导致您看到的更改。 这些编译器和链接器标志对我来说也很好。  

    似乎有些内容应保存到闪存中、并且通过 BOR 持续存在的内容没有正确保存。 我最初怀疑优化级别与一些标志相结合、您设置了这些标志以在存储器中移动重要设置、但我在您的标志中看不到任何异常的情况。  

    当然、您可以将优化保持在较低水平、但我理解您不希望这样做的原因。 如果您想向我发送您的代码(通过此帖子或通过 e2e 消息)、我可能会告诉您更多信息、但到目前为止、我无法告诉您确切的问题是什么。  

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

    抱歉 Dylan、

    我实际上无法发送项目、但是问题解决了。

    解决方案是有点反气候...

    ` cl430文档时、我找到这个并在4.3.7中看到 μ V-ROM_MODEL`是默认值、所以我没有使用该标志。

    最后、还有一份 较新的 cl430用户指南。 本指南中没有引用默认值、默认值似乎是`-ram_model`……

    这就是在启动后什么也不起作用的原因。 不存在全局变量初始化(引导时间更短)