主题中讨论的其他器件:Energia
大家好、我遇到了一个与 MSP 电路板相关的非常奇怪的问题。
如果将额外的变量编译到程序中或如果数组大小增加、程序将不会启动(程序的第一步是打开 LED)。
我不知道是什么导致了这种情况,我认为它与大型的全球变量有关,但如果是这样,我真的不知道如何处理它。 是否有人知道为什么会出现此问题? 我使用的是 Energia 而不是 code composer、因此我希望它不会与之相关。
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 电路板相关的非常奇怪的问题。
如果将额外的变量编译到程序中或如果数组大小增加、程序将不会启动(程序的第一步是打开 LED)。
我不知道是什么导致了这种情况,我认为它与大型的全球变量有关,但如果是这样,我真的不知道如何处理它。 是否有人知道为什么会出现此问题? 我使用的是 Energia 而不是 code composer、因此我希望它不会与之相关。
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 初始化 }
看看它是否有用
我找到了解决方案、就像您说的 GCC 有自己的声明"noinit"的方式一样、我这样做后必须立即进行设置、因为我已经在稍后初始化变量、但看起来看门狗计时器在使用 forloop 时会复位。
若要不初始化全局变量或数组、请在变量之后编写以下代码:
__attribute__((section (".noinit")))
示例:
键入 array[1000]__attribute__((section (".noinit")));
感谢您的帮助!