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.

[参考译文] MSP430F5659:调试期间出现奇怪的问题

Guru**** 2535650 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/804776/msp430f5659-strange-issue-during-debug

器件型号:MSP430F5659

TI 专家早上好!

今天我来到这里是因为在调试模式下测试我编写的代码时遇到了一些问题(我认为是不可预测的)。

让我更好地解释一下情况:我正在编写一个键盘和记事本应用程序、并将 FT812控制器用于我的显示屏。

在 Keyboard()例程的某个时候,我注意到处理器停止正常工作。

因此、我尝试在函数中添加一些断点、以了解崩溃的位置、我可以注意到3种不同的行为:

  • 该程序将跳转到 _mpyi_f5hw
  • 该程序会跳转到 _TI_ISR_TRAP
  • 程序跳转至0x0004 (在反汇编窗口中、我看到3FFF JMP   (0x0004)
  • 程序将触发看门狗并重新启动

我确定问题在该例程中、但哪种方法是找出其根源的最佳方法?  

下面是我的假设。

  • 该例程会调用 memset 函数、以在启动操作之前清除缓冲区
/*清除行*/
for (tval=0;<MAX_lines; tval++) {
安全装置();
memset (&buffer.notepad[tval]、'\0'、sizeof (buffer.notepad[tval]));
} 

  • 我有一个用于编写文本的函数:
void cmd_text (unsigned int x、unsigned int y、unsigned int 字体、unsigned int 选项、const char * t){
unsigned int lung=0;
肺= strlen (t);
WRITE_COMMAND32 (CMD_TEXT);
WRITE_COMMAND16 (x);
WRITE_COMMAND16 (y);
WRITE_COMMAND16 (字体);
WRITE_COMMAND16 (opts);
write_text (t、lung);
}

void write_text (const char *字符串、unsigned int longn){
const char dummy_byte=0x00;
执行{
write_COMMAND8 (* stringa);
*STRING++;
}
while (*字符串!=0);
if (longn>0){
执行{
WRITE_COMMAND8 (虚拟字节);
longn++;
}
while ((longn%4)!=0); //-->要在 RAM_CMD 上加载正确的字符值,偏移量必须是4
的倍数}
if (longn=0){
WRITE_COMMAND8 (虚拟字节);
WRITE_COMMAND8 (虚拟字节);
WRITE_COMMAND8 (虚拟字节);
}
} 

如果有任何建议和帮助、我们将不胜感激。
感谢您的关注、

此致、
Maria Angela

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

    您好!

    根据下面的线程、由于代码大小的原因、MSP 不使用 memset、memset 不适用于大型代码、小型数据模型。 我觉得这是另一种使用某些 C 函数的情况、因为它的资源有限、所以会让 MCU 不堪重负。 对于这些类型的问题的常规调试、请确保关闭编译器优化、并尝试注释掉某些代码行、直到问题消失、然后再重新处理。

    在 msp430g2553中使用 memset 时遇到问题

    此致、

    James

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

    早上好,James!

    非常感谢您的明确回答。

    我已经替换了每个 memset 函数、我注意到我仍然有问题、但这次与我在调用时编写的另一个函数有关

    strlen (string_pointer) 

    我是否可能不仅对 memset、而且对 string.h 库中的其他函数都有相同的问题?

    此致、  

    Maria Angela

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

    您好!

    当您也删除 strlen()函数时,问题是否会消失? 如果是、则可能是导致问题的原因。 根据下面线程中的 Jens-Michael Gross,使用 strlen()函数可能有一种更简单、更快的方法。

    在 IAR 中使用字符串函数时需要帮助。

    此致、

    James

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

    早上好、James、

    最后、我找到了该问题的解决方案。

    我认为问题的根源是 CCS 的优化级别。

    我研究了每个级别在代码优化方面的含义、并决定暂时禁用它。

    我还创建了我自己的函数版本  

    memcpy();
    strlen(); 

    以避免出现任何问题。

    我希望这对其他人也有帮助、

    非常感谢您的帮助和建议!

    此致、

    Maria Angela