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.

[参考译文] MSP-EXP430F5529LP:如果添加了另一个变量或使一个数组变大、程序将不会运行

Guru**** 2587365 points
Other Parts Discussed in Thread: ENERGIA

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/913499/msp-exp430f5529lp-program-will-not-run-if-another-variable-is-added-or-an-array-is-made-larger

器件型号:MSP-EXP430F5529LP
主题中讨论的其他器件:Energia

大家好、我遇到了一个与 MSP 电路板相关的非常奇怪的问题。

如果将额外的变量编译到程序中或如果数组大小增加、程序将不会启动(程序的第一步是打开 LED)。  

我不知道是什么导致了这种情况,我认为它与大型的全球变量有关,但如果是这样,我真的不知道如何处理它。 是否有人知道为什么会出现此问题? 我使用的是 Energia 而不是 code composer、因此我希望它不会与之相关。

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

    您正在使用多少个全局变量?

    您是否也在栈上分配了大量变量?

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

    当然有很多全局变量、程序有很多设置变量、还有一些大型288个项目数组。

    我不知道我是否在堆栈上分配它们

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

    当您在函数内创建变量("auto"变量)时、您会在栈上分配。

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

    一些局部变量是在接近全局变量数量的地方创建的。 此程序是4-5个不同库的组合、每个库都有各自的全局变量、但也有示例文件中的全局变量。 ID 估计至少有20个全局变量。

    我应该补充一点、即使将这些大型全局数组减少到3个项目、问题仍然存在、该版本的代码也使用大约26%的8kB RAM

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

    通常、当您有一个能够占用存储器某些重要部分的通配指针时、会发生这种情况。 当它干扰不重要的变量时、它可以正常工作、但是一旦您在位周围移动东西、您就会开始覆盖重要位-例如堆栈返回地址。

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

    您对我如何解决该问题有什么想法吗? 这些大型数据阵列非常重要。 是否有办法提高堆栈的大小或这是否是硬件限制? 还是另一种存储这些变量的方法?

    我刚尝试将项目导入 code composer 以尝试使用调试器、我认为它可能会让我对错误有一些了解、但它会出现 Java 堆栈溢出错误。 您认为这可能有关系吗?

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

    Keith、您好、我最后通过创建一个大型数组(1000个大数组)在另一个 Energia 项目中复制了该问题、并使用反汇编器来查看该问题是否正在实际运行、我对此感到惊讶。 它似乎进入了一个"run_array"函数、并执行了几次该操作、然后在程序开始时再次启动。 但奇怪的是、该函数只有一个返回值、但从未达到该值。 我想知道、如果这个函数运行时间很长、它是否可以是看门狗定时器来复位电路板?

    编辑:它似乎是一个特定的 MOV.A 指令、程序在之后重新启动。 然后、我更改了数组的大小、以查看位置是否会改变、它似乎具有这样的情况、它会运行循环、如果我将大小增加100、则会更早发生、如果我将大小缩小100、则会花费更长的时间

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

    使用 CCS、如果数据太大、看门狗计时器可能会在 C (.data/.bss)初始化期间超时。 通常的修复方法是定义一个_system_pre_init()函数来停止看门狗(在 C 初始化运行之前)。 [REF CC 用户指南(SLAU132)第6.9.1] CCS 的最新版本也有一个项目级复选框、要求 C 启动自动执行此操作。

    我不知道 Energia 是否具有类似的机制。 我想您可以添加类似的内容

    int _system_pre_init (void){
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗
    退货(1); //您可以立即完成 C 初始化
    } 

    看看它是否有用

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

    我刚刚找到了该函数、很遗憾、Energia 看起来不使用该函数、这很烦人。 很难找到有关 Energia 版本的任何信息、我可能已经完成了所有工作。

    希望 Energia 代码能够以某种方式移植到正常项目

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

    在 GitHub 上四处寻找、Energia 看起来使用 MSP430-gcc。 这可能具有类似的机制,但我不知道,并且我在 SLAU646E 中看不到任何提示。

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

    它确实让我使用 TI 编译器进行编译、尽管我似乎没有帮助、但我也阅读了类似 gcc 的内容。 我一直在看它、因为它可能是正确的方向

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

    我找到了解决方案、就像您说的 GCC 有自己的声明"noinit"的方式一样、我这样做后必须立即进行设置、因为我已经在稍后初始化变量、但看起来看门狗计时器在使用 forloop 时会复位。

    若要不初始化全局变量或数组、请在变量之后编写以下代码:

    __attribute__((section (".noinit"))) 

    示例:

    键入 array[1000]__attribute__((section (".noinit"))); 

    感谢您的帮助!