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.

[参考译文] MSP430FR5994:使用.TI.ramfunc 时不能访问 main()函数

Guru**** 2390755 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1012695/msp430fr5994-main-function-is-not-reached-when-using-ti-ramfunc

器件型号:MSP430FR5994

各位专家、您好!

客户正在编写应用程序代码、并且在使用 TI.ramfunc 时遇到无法访问 main 函数的问题。

当未达到主函数时、以下函数循环。
__TI_auto_init_nopinit_hold_wdt ()-> copy_in ()-> memcpy ()->__TI_auto_init_nopinit_hold_wdt ()->  copy_in ()->  memcpy ()-> __TI_auto_init_init_hold_wdt ()...

您是否有任何想法、这种现象的原因在哪里?

这是正常使用情况下不会发生的行为吗?

根据放置在 RAM 中的代码数量、也许可以或者不可以到达主函数。 但是、我们已确认代码量适合链接器命令文件中指定的 RAM 区域。  顺便提一下、对于示例项目库(使 LED 闪烁)、当我尝试将代码放置在 RAM 区域的限制附近时、在构建阶段会发生错误。 因此、我认为这并不取决于 RAM 中要放置的代码量。

我们可以共享用于重现错误的项目、因此如果您需要、请告知我们。

此致、
还不错

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

    我的第一个猜测是 memcpy 花费的时间太长、并且看门狗正在触发。 一个快速实验是添加如下内容:

    > int _system_pre_init (void){WDTCTL = WDTPW | WDTHOLD;return (1);}//在 C init 前停止看门狗

    [参考 MSP430 C 编译器参考(SLAU132X)第6.9.1]节

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

    您好!

    感谢您的建议。

    根据您的回答,我禁用了 WDT 函数并确认它已到达 main()函数。 我通过直接从 CCS 操作寄存器来禁用 WDT 功能。

    但是、当我将"WDTCTL = WDTPW | WDTHOLD"直接添加到 int _system_pre_init()函数时、它会在执行任何 WDT 寄存器操作之前返回复位状态。 (它永远循环。)

    我的方法是将以下路径的编译器中的"pre_init.c"复制到工程。 之后、我添加了"WDTCTL = WDTPW | WDTHOLD"和"#INCLUDE "。
    C:\ccs1010\ccs\tools\compiler\ti-cgt-msp430_20.2.LTS lib\src

    我添加它的方式可能有问题、但我不想尝试、如果您能告诉我我我做了些什么、我会很感激。

    此致、
    还不错

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

    我想知道它是否希望在 RAM 中找到_system_pre_init(),但它还没有出现。

    看起来--ramfunc=on 适用于所有函数(使用 TI 编译器)。 库中的函数已经过编译、因此位于.text 段而不是.TI.ramfunc 段中。

    如果您向 pre_init.c 添加类似如下内容、是否会有所帮助:

    >#pragma CODE_SECTION (_system_pre_init、".text")

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

    您好!

    我按照您的建议添加了代码,并且能够到达 main()函数。

    感谢您的支持。

    此致、
    还不错