大家好、团队成员:
我遇到了一个非常令人头疼的问题、因为我的代码使用了 memset 函数、所以我的代码经常跳到屏幕截图的 while 循环。由于在 while 循环中执行的时间太长、因此后续代码的执行时间出现了问题。 例如、如果我在调用 memset 函数后调用 LED 闪烁函数、由于代码通常会跳到 while 循环、因此我的 LED 灯将不会按预期闪烁、它可能会持续亮起或熄灭。
我想知道如何解决这个问题。请帮助我。谢谢
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.
大家好、团队成员:
我遇到了一个非常令人头疼的问题、因为我的代码使用了 memset 函数、所以我的代码经常跳到屏幕截图的 while 循环。由于在 while 循环中执行的时间太长、因此后续代码的执行时间出现了问题。 例如、如果我在调用 memset 函数后调用 LED 闪烁函数、由于代码通常会跳到 while 循环、因此我的 LED 灯将不会按预期闪烁、它可能会持续亮起或熄灭。
我想知道如何解决这个问题。请帮助我。谢谢
您如何调用 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 循环。 此时、我单击软复位按钮、然后再次开始运行代码、有时可以正常跳至断点、有时则无法跳至断点。