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.

[参考译文] LAUNCHXL-CC3235SF:从 ADS 读取数据和发送 UDP 数据报时发生硬件异常

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1193605/launchxl-cc3235sf-hardware-exception-reading-data-from-ads-and-sending-udp-datagrams

器件型号:LAUNCHXL-CC3235SF
主题中讨论的其他器件:CC3235SFADS1298

尊敬的 simplelink 团队:


我们在 CC3235SF 中实施以下程序时遇到硬件异常问题:
该功能非常简单:MCU 从 ADS1298的8个通道读取 SPI 数据、采样率为2000个样本/秒、并通过 WiFi 连接通过 UDP 数据包发送这些数据。 该程序基于 Simplelink SDK 6.10演示中包含的示例代码"udpecho"。


我们已经更改了代码、以便在数据缓冲区已满时立即发送 UDP 数据报。我们使用了300到1400字节的缓冲区大小。
一旦程序启动且器件连接到 WiFi 网络、UDP 线程就会以信标形式等待:

(笑声)
ads_start();
while (1)

  Semaphore_pend (semAPP、BIOS_wait_forever);
  sendBuffer();

sendBuffer 例程编码如下:
void sendBuffer()

   字节 Sent=sendto (server、buffer_ads、udp_packet_size、0、(struct sockaddr *)&clientAddr、addrlen);
  ads_enableInt();

ADS 配置为触发 DRDY 线路、GPIO 中断通过 SPI 将数据读取到缓冲区中、一旦缓冲区达到 UDP 有效载荷数据包的大小、硬件中断例程就布置信标、以允许任务发送数据。 当任务发送数据时、GPIO 中断被禁用。 该函数编码如下:

void ADS1x9X_ReadData()

  GPIO_WRITE (ADS_CS、ADS_CS_ON);

  ads_spiTransaction.count = 3+24;
  ADS_transmitBuffer[0]= 0;

  ads_spiTransaction.txBuf =空;
  ads_spiTransaction.rxBuf =(void *) ads_receiveBuffer;

  ads_transferOK = spi_transfer (ads_SPI、&ads_spiTransaction);

  GPIO_WRITE (ADS_CS、ADS_CS_OFF);

  if (ads_transferOK)
  {
    uint8 idx=0;

    if (cnt_Bytes+BYTESxSAMPLES>udp_packet_size)
   {
       CNT_Bytes=0;
       Semaphore_post (semAPP);

   }否则
   {
          for (idx=0;idx <BYTESxSAMPLE;idx++) buffer_ads[cnt_bytes++]=ads_receiveBuffer[idx];

   }
 }


但是、几秒钟后、程序会在 Hwi 异常处理程序例程:rm_m3_Hwi_exhandlerAsm__I 内的循环中挂起

如果没有调用 Sendto 函数(sendBuffer 已注释掉)、则程序始终可以读取 ADS 数据而不停止。
如果我们将采样率降低到1000个样本/秒、则始终工作正常。SPI 的工作速率为18Mbps。

我的问题是:
有没有关于这个问题的建议,以及如何解决这个问题?
我们如何调试此异常的原因? Sendto 函数是否可以生成硬件异常? MCU 是否无法执行这一要求苛刻的任务?

谢谢

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

     它看起来像是 导致异常的内存损坏(例如堆栈溢出)(例如跳转到超出范围的地址)。

    调试此类问题没有简单的方法。

    您可以尝试检查堆栈大小(或只增加堆栈以进行调试)、如果 您在分配数据 时不检查返回值、则增加堆大小。

    确保您正在检查函数的返回代码。

    没有已知的"sendo"问题。 您是从应用程序任务(线程)上下文调用它、对吧?

      

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

    感谢 Kobi 的回答。

    我们最终解决了这个问题。 我们正在通过 Hwi 内的 SPI 读取一些 ADS 寄存器、一旦我们将采样率提高到2ksamples/s、便会出现用于跳转的异常。 我们已将对 SPI 总线的任何访问移至 Hwi 外部。 Hwi 例程只发布一个信号量。

    您能给我们提供任何链接、其中包含有关 Hwi 例程最佳实践的建议? 谢谢

    此致  

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

    您可以查看SDK 中的技术参考手册(www.ti.com/.../doxygen)文档。

    但我不确定这些部分是否包含"最佳实践"部分。 关于 Hwi 使用的规则是通用的。 如果可能、您应始终尝试避免这种情况。