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.

[参考译文] CC3220MODA:使用 http 服务器返回大量数据

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1005179/cc3220moda-using-http-server-to-return-large-amounts-of-data

器件型号:CC3220MODA
Thread 中讨论的其他器件:SYSBIOS

我已经使用 TI http 服务器实现了一个应用。 我使用夹头函数返回 http 响应中的大量数据。

因此、实际上我要调用  

https://sendResponseChunked (...)

然后在 while 环路中

httpserver_sendChunk (..)

这对于前几个 KB 来说可以正常工作、但服务器线程将退出。 我已将其向下跟踪到套接字发送函数  SlNetSock_send (在 HTTPServer_sendChunk 中调用)返回-1。 我假设堆栈内的某个位置正在内存不足。 尽管堆没有用尽、但当我查看 ROV 中的堆时、我可以看到仍然有几 KB 可用。

在文档中 SlNetSock_send  函数的阴离子(https://software-dl.ti.com/simplelink/esd/simplelink_msp432e4_sdk/1.55.00.21/docs/ns/html/group__SlNetSock.html#ga46bc70ae63ecd3fc15bfb2c99dda85db)

"SlNetSock_send 函数用于将消息发送到另一个套接字。 在向器件发送数据后立即返回。"

这意味着它在发送数据后返回、因此我们不应排队等待内存、它是否会耗尽器件中的内存?

是否有办法阻止所有数据实际发送出去?  

为了进行调试,我在每次调用 SlNetSock_send  ()后都添加了一个短延迟,这也解决了问题,但这显然是一个黑客攻击。

感谢你的帮助

重做

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

    这有点奇怪。

    假设发送始终按原样发送(即发送了完整的有效负载)、则 HTTPServer 实现是错误的。

    它应该已读取返回值并重新发送未发送的数据(由于缺少 NWP 资源)。

    例如:

    INT RC = 0、偏移= 0;

    while (RC > 0 && offset < chunklen) {

      RC = SEND (chunkbuf+偏移、chunklen -偏移);

      如果(RC >= 0)

        offset += rc;

    我不确定为什么插座会关闭。 如果没有 NWP 资源时发送数据、则返回代码(对于 SEND 命令)应小于请求的传输长度、但不应导致套接字关闭。

    也许 您的应用程序中有一个代码等待某些事件并决定关闭套接字。

    BR、

    Kobi

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

    您好、Kobi、

    感谢您的回答。 正如您指出的、服务器代码未检查返回类型、这是 httpserver_send.c 中的函数:

    void HTTPServer_sendChunk (int s、const void * buf、size_t len)

    char sizeBuf[12];
    int sizeLen;

    sizeLen = snprintf (sizeBuf、sizeof (sizeBuf)、"%x\r\n"、len);
    send (s、sizeBuf、sizeLen、0);
    如果(len > 0){
    send(s)、buf、len、0);

    发送(s、"\r\n"、2、0);

    因此、一旦发送超出资源、我的代码将循环并继续发送下一个卡盘、依此类推、发送将始终返回-1。 while 循环完成后、调用  套接字上的 select (https://c 中的第869行)时、函数 URLSimule_process (根据您的示例进行调整)将返回、随后代码会落在函数 HTTPServer_serveSelect 中。 函数 select 返回-1、然后代码退出、线程也将退出。  

    主要问题是:

    是否有办法阻止我的线程、直到资源再次可用、以便我可以继续发送?

    谢谢

    重做

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

    套接字处于"阻塞" 模式、因此它将在资源可用之前一直处于阻塞状态。

    我不确定-1的来源是什么。 可能在插座已关闭后发生。

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

    我做了更多的挖掘、并跟踪了问题的开始方式。 当我在问题发生后单步进入 SENS()时,我可以看到函数_i16 sl_Send (_i16 sd,const void *pBuf,_i16 len,_i16 flags)在 sl_socket.c 的第603行上调用宏 verify_api_allowed (sl_opcode_silo_socket)时返回

    在进行了一些搜索之后、我发现代码中的某个位置设置了_sl_DRV_STATUS_bit_RESTK_REQUIRED 位、因此我查找了该位并发现从_SlDrvHandleFatalError 调用了宏 sl_Set_REST_REQUIRED。

    当我在那里设置断点时、它确实会掉下来、当函数 void _SlDrvHandleFatalError (_u32 errorId、_u32 info1、_u32 info2)被调用时

    errorId=2
    Info1=0
    info2=0

    这是调用堆栈

    driver.c:2857、PC = 0x2001147C FP = 0x2002D038处的_SlDrvHandleFatalError (unsigned long、unsigned long、unsigned long)
    1 _slDrvRxHdrRead (unsigned char *) at driver.c:2065、PC = 0x20008482 FP = 0x2002D058
    2 _slDrvMsgRead (unsigned short *、unsigned char **) at driver.c:1261、PC = 0x20004D92 FP = 0x2002D088
    3 _slDrvMsgReadSpawnCtx (void *) at driver.c:1883、PC = 0x2000CDB4 FP = 0x2002D0D8
    4 _SlInternalSpawnWaitForEvent() at spaw.c:84、PC = 0x2001848E FP = 0x2002D0F0
    5 _SlInternalSpawnTaskEntry() at spaw.c:107、PC = 0x20016B16 FP = 0x2002D0F8
    6 sl_Task (void *) at device.c:112、PC = 0x2001B792 FP = 0x2002D100
    7 _pthread_runStudiob$43 (unsigned int、unsigned int) at pthread.c:727、PC = 0x2001B144 FP = 0x2002D108
    8 task.c:474、PC = 0x20012F78 FP = 0x2002D110时的 ti_SysBIOS_KNL_Task_exit__e_E ()

    这发生在不同的任务中。 发生这种情况后  ,会永久 设置_sl_DRV_STATUS_bit_RESTK_REQUIRED,任何后续的套接字调用都将失败,因此,我的 http 服务器在 select()之后失败并被终止。  

    有什么关于为什么会发生这种情况的想法?

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

    您使用 的是 TI LaunchPad 还是定制板?

    该问题看起来像是 SPI 问题(在 响应标头中读取错误的同步模式)。  

    如果您可以使用我们的参考板重现此问题、我们将尝试在此处执行此操作以调试问题。

    感谢您能提供尽可能简单的说明(和代码?) 来重现此问题。

    您为 SL_Task 设置了什么线程优先级? 您的 http 服务器线程的优先级是多少?

    BR、

    Kobi

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

    这确实是线程优先级的问题、不知怎么说、sl_Taks 的线程优先级为9、而 httpserver 的线程优先级为5。 我将 sl_Task 的引物更改为2、它起作用!

    感谢您的帮助!