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:MSP430FR5994 "string.h"probelm

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1235778/msp430fr5994-msp430fr5994-string-h-probelm

器件型号:MSP430FR5994

大家好、团队成员:

   我遇到了一个非常令人头疼的问题、因为我的代码使用了 memset 函数、所以我的代码经常跳到屏幕截图的 while 循环。由于在 while 循环中执行的时间太长、因此后续代码的执行时间出现了问题。 例如、如果我在调用 memset 函数后调用 LED 闪烁函数、由于代码通常会跳到 while 循环、因此我的 LED 灯将不会按预期闪烁、它可能会持续亮起或熄灭。

我想知道如何解决这个问题。请帮助我。谢谢

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

    您如何调用 memset? 或者更重要的是*为什么*您要调用 memset?您的时钟频率是多少? 您可以共享代码吗?

    您只有8KB 的 RAM、因此即使您将整个内存设置为1MHz、它也应该会很快发生。

    当然、保持 LED 持续闪烁的最佳方法是使用计时器和中断。

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

    另一个想法:

    您是否关闭了看门狗计时器? 您的计算机是否会不断复位? 在清除所有全局存储器区域时可能会调用 memset。

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

    您如何调用 memset? 或者更重要的是*为什么*您要调用 memset?

    ---------------- 调用一些读取和写入函数时、相关的数组将被清除。 调用 memset 主要用于清除数组的内容。

    您的时钟频率是多少?

     ---------------- 时钟频率 :SMCLK:2MHz、MCLK:16MHz、SPI 通信波特率:2MHz

    您可以共享代码吗?

    ---------------- 出于某些原因、我在公共平台上共享代码不方便

    当然、保持 LED 持续闪烁的最佳方法是使用计时器和中断。

    ---------------- LED 灯的闪烁只是我给出的一个简单示例。 事实上、后续代码主要是处理故障判断和处理逻辑。 例如、当发生某个故障时、系统将确认该故障5秒、然后控制我的设备、以便在判断故障后执行相关操作。 由于系统将始终跳转到屏幕截图的 while 循环、因此测试确认时间将长于5s、这将影响我的逻辑判断。

    我的代码与下例中的用法类似

    int SpiWriteReg(BYTE bID, uint16 wAddr, uint64 dwData, BYTE bLen, BYTE bWriteType) {
        // device address, register start address, data bytes, data length, write type (single, broadcast, stack)
        bRes = 0;
        memset(spiBuf,0,sizeof(spiBuf));
        while(gioGetBit(gioPORTA, 1) == 0) delayus(5); //wait until SPI_RDY is ready
        switch (bLen) {
        case 1:
            spiBuf[0] = dwData & 0x00000000000000FF;
            bRes = SpiWriteFrame(bID, wAddr, spiBuf, 1, bWriteType);
            break;
        case 2:
            spiBuf[0] = (dwData & 0x000000000000FF00) >> 8;
            spiBuf[1] = dwData & 0x00000000000000FF;
            bRes = SpiWriteFrame(bID, wAddr, spiBuf, 2, bWriteType);
            break;
        case 3:
            spiBuf[0] = (dwData & 0x0000000000FF0000) >> 16;
            spiBuf[1] = (dwData & 0x000000000000FF00) >> 8;
            spiBuf[2] = dwData & 0x00000000000000FF;
            bRes = SpiWriteFrame(bID, wAddr, spiBuf, 3, bWriteType);
            break;
        case 4:
            spiBuf[0] = (dwData & 0x00000000FF000000) >> 24;
            spiBuf[1] = (dwData & 0x0000000000FF0000) >> 16;
            spiBuf[2] = (dwData & 0x000000000000FF00) >> 8;
            spiBuf[3] = dwData & 0x00000000000000FF;
            bRes = SpiWriteFrame(bID, wAddr, spiBuf, 4, bWriteType);
            break;
        case 5:
            spiBuf[0] = (dwData & 0x000000FF00000000) >> 32;
            spiBuf[1] = (dwData & 0x00000000FF000000) >> 24;
            spiBuf[2] = (dwData & 0x0000000000FF0000) >> 16;
            spiBuf[3] = (dwData & 0x000000000000FF00) >> 8;
            spiBuf[4] = dwData & 0x00000000000000FF;
            bRes = SpiWriteFrame(bID, wAddr, spiBuf, 5, bWriteType);
            break;
        case 6:
            spiBuf[0] = (dwData & 0x0000FF0000000000) >> 40;
            spiBuf[1] = (dwData & 0x000000FF00000000) >> 32;
            spiBuf[2] = (dwData & 0x00000000FF000000) >> 24;
            spiBuf[3] = (dwData & 0x0000000000FF0000) >> 16;
            spiBuf[4] = (dwData & 0x000000000000FF00) >> 8;
            spiBuf[5] = dwData & 0x00000000000000FF;
            bRes = SpiWriteFrame(bID, wAddr, spiBuf, 6, bWriteType);
            break;
        case 7:
            spiBuf[0] = (dwData & 0x00FF000000000000) >> 48;
            spiBuf[1] = (dwData & 0x0000FF0000000000) >> 40;
            spiBuf[2] = (dwData & 0x000000FF00000000) >> 32;
            spiBuf[3] = (dwData & 0x00000000FF000000) >> 24;
            spiBuf[4] = (dwData & 0x0000000000FF0000) >> 16;
            spiBuf[5] = (dwData & 0x000000000000FF00) >> 8;
            spiBuf[6] = dwData & 0x00000000000000FF;
            bRes = SpiWriteFrame(bID, wAddr, spiBuf, 7, bWriteType);
            break;
        case 8:
            spiBuf[0] = (dwData & 0xFF00000000000000) >> 56;
            spiBuf[1] = (dwData & 0x00FF000000000000) >> 48;
            spiBuf[2] = (dwData & 0x0000FF0000000000) >> 40;
            spiBuf[3] = (dwData & 0x000000FF00000000) >> 32;
            spiBuf[4] = (dwData & 0x00000000FF000000) >> 24;
            spiBuf[5] = (dwData & 0x0000000000FF0000) >> 16;
            spiBuf[6] = (dwData & 0x000000000000FF00) >> 8;
            spiBuf[7] = dwData & 0x00000000000000FF;
            bRes = SpiWriteFrame(bID, wAddr, spiBuf, 8, bWriteType);
            break;
        default:
            break;
        }
        return bRes;
    }

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

    当我初始化程序时、安全装置将被禁用、并且之后我将不启用安全装置或者给安全装置喂入狗。 程序初始化后、它将进入 while 循环并在循环中执行我的相关逻辑函数。

    我不知道 memset 函数的调用位置。

    当我为目标代码行设置一个断点、然后单击 CCS 的"运行"按钮时、如果花费很长时间、程序将不会跳转到该断点。 暂停代码后、我发现程序运行到 while 循环。 此时、我单击软复位按钮、然后再次开始运行代码、有时可以正常跳至断点、有时则无法跳至断点。

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

    如何定义 spiBuf?

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

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

    如果您需要任何其他信息,请及时与我联系,谢谢

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

    memset()应该不需要任何时间来执行此操作。

    我会认为、循环一直在耗时是不确定的。

    当然、您没有屏蔽 spiBuf 的正确位数(您只屏蔽8而不是16、因此前8位始终为零)、但这应该不是不一致时序的问题。

    不一致的断点通常由优化引起。 您可以尝试关闭优化以进行调试。

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

    该64位整数将会减慢速度。 尤其是那些位的移位会很慢。 CPUx 多位移位对多字整数毫无帮助。 每次移位需要四条指令。  (乘以8、加16、加等) 您可以希望优化器能够提供帮助、但您应该构建更好的代码来帮助您解决问题。

    更快速的方法是构造64位整数和8字节数组的联合体。 不是很便于携带、但速度更快。