Part Number:MSP430FR6972
程序定义的全局变量数组在执行某些函数的时候会变成随机数据,将变量定义到fram串口发送击败字节数据时会死机,如何解决
Cherry Zhou:
您好我们已收到您的问题并升级到英文论坛,由于美国感恩节假期将近,预计答复您的时间将稍晚,敬请谅解!
,
Cherry Zhou:
您好,看起来像是您的全局变量都在被覆盖,但是通过目前您提供的图片不太好判断具体原因。您能否提供全局变量的整体图?
,
HaiBin li:
您看看这个图片可以吗
,
Cherry Zhou:
好的谢谢您提供的图片,已经跟进给工程师,有新的信息会尽快给到您。
,
Cherry Zhou:
抱歉回复晚了。
这可能是缓冲区溢出或堆栈溢出引起的软件问题。 您能不能逐步浏览代码,确定一下变量被覆盖的确切位置?
此外您还可以参阅该应用手册,了解 MSP + CCS 的高级调试功能以帮助缩小问题范围:
https://www.ti.com/lit/slaa393
下面是一些相关问题您也可以参考下,其中包含有关如何检测可能的堆栈溢出的调试提示:
https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/18766/stack-overflow-with-static-variables/72413#72413
https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/396854/detect-stack-overflow
,
HaiBin li:
跟踪到变量被覆盖的确切位置之后,需要怎么做才能解决这个问题
,
Cherry Zhou:
HaiBin li 说:跟踪到变量被覆盖的确切位置之后,
一旦跟踪到确切位置后,请检查周围的code,确定一下是不是软件的问题。
比如您可以检查超出范围的数组访问、错误指针、堆栈溢出、新数据实际上是随机的还是有一个模式等等问题,也可以检查下变量和内存。
主要是想看看这个问题是否可以重现,哪些变量在哪些特定函数处被覆盖? 一旦能确定,您就可以review这些特定功能,然后就能解决编码问题。
,
HaiBin li:
找到具体位置了,是在串口发送数据的时候变量变了,您帮忙给看一下是什么原因,怎么解决
,
HaiBin li:
我串口发送函数发送207个字节数据,当发送到77个字节的时候开始覆盖我的全局变量数据,发送一个字节覆盖一个字节
,
HaiBin li:
我调用一个函数,当这个函数执行完返回的时候,单片机死机
,
Cherry Zhou:
好的帮您跟进给工程师了哈,应该下周会给您答复。
,
Cherry Zhou:
您好,写入发送缓冲区会清除 UCTXIFG。 请您将 usart0_fasong () 中的第 92 行放在第 91 行之前。 您可以参考 MSP UART Academy 和器件 UART 代码示例,了解如何构建 UART TX 和 RX 功能[academy, examples]。
此外其他变量 (yali_k/b 、 xunhuan _guding_flag 等) 是否为正确的值? 看起来也是调用 usart0_fasong () 修改的。
建议您检查 "buf" 和 "len" 的值,检查 UART TX 和 RX 功能,添加一个watchpoint,可在特定存储器访问时触发[link]。
这个问题是需要您在客户端调试的问题,因为我们不知道项目的具体细节和代码。
,
HaiBin li:
都确定到那个地址的指令出问题了还不行吗?我觉得就是芯片的bug
,
Cherry Zhou:
您的问题应该不太是与芯片有关,覆盖全局阵列一般是软件问题。
从您提供的信息来看,阵列是被放置在 RAM 中。 我们建议您使用 "persistent " pragma 将阵列放置在 FRAM 中,然后使用 FRAM 控制器将其锁定,使其不被写入。
这会防止意外 RAM 溢出等等问题。 有关于此操作的更多信息,请参阅 FRAM best practices app note的第六节:FRAM Protection and Security: https://www.ti.com/lit/slaa628