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.

[参考译文] CC3235SF:增加堆大小时出现问题

Guru**** 2555130 points
Other Parts Discussed in Thread: CC3235SF

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1075105/cc3235sf-problem-with-increase-heap-size

部件号:CC3235SF

你(们)好

我想知道是否要增加堆的大小,除了更改项目的.cmd 文件中 HEAPSIZE 的值之外,我还需要做一些其他事情。

我这样说是因为我这样做了,但我遇到了问题,当我尝试通过 HttpClient_sendRequest 函数的 HTTP 发送数据时,如果将此值增加到2KB 以上(32KB+2KB),它将返回错误-2006 - SL_RET_CODE_INVALID_INPUT。

为了进行测试,我将默认值32KB 保留在相同的代码中,一切正常。 当增加到34KB 时,它会返回此错误,代码的唯一区别是内存增加。

谢谢

凯文·Guimarães

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

    凯文:

    您在项目中使用什么 RTOS? 使用 FreeRTOS 时,堆大小应 在 FreeRTOSConfig.h 中设置

    谢谢,
    雅各布

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

    你好,Jacob,

    很抱歉,忘了提及。 我正在使用 TI-RTOS

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

    凯文:

    cmd 文件中的 HEAPSIZE 变量是使用 TI-RTOS 增加堆的方法。 CC3235SF 具有256KB RAM。 也许只有分配的内存超过标准32KB 时,才会出现问题。 您是否看到2006错误与  HttpClient_sendRequest 函数一致?

    谢谢,
    雅各布

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

    你好,Jacob,

    但对我来说,没有意义的是分配大于默认32KB 的 HTTP 之间的关系。

    是的,每次调用 HttpClient 发送请求时,如果分配的大小超过34KB,我都会收到此错误代码。
    如果我坚持使用默认32KB,则所有内容都可以正常工作。

    谢谢,
    凯文

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

    凯文:

    以下是您的案例的详细描述。 这与堆无关。

    1月

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

    你(们)好,Jan

    我认为这不是我遇到的问题。

    我正在尝试发送一个无实体 HTTP GET,只需设置两个标头:HttpClient_HFIELD_REQ_Authorization 和 HttpClient_HFIELD_REQ_USER_AGENT。

    尝试执行另一个帖子所做的操作,但没有更改,我仍然收到相同的错误。

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

    凯文:

    由于您没有提到通过 http 发送数据的准确程度,我希望您使用34KB 正文发送帖子。

    我不确定错误代码 SL_RET_CODE_INVALID_INPUT 的确切来源。 我认为您应该使用调试器来确定错误的来源。

    1月

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

    你好,Jan,

    经过数小时的调试,我相信我发现了这个问题。

    使用 HttpClient_create 创建 HttpClient 句柄时,它会为 HttpClient_CB 结构分配内存,但不会为 secAttribs 属性分配内存。

    当您在 SlNetIfWIFI_sockstartSec 函数中使用此属性时,如果不设置它,它将使用​​指针指向的值。 在我不增加堆的代码中,它工作正常,因为它指向的内存是0,当我增加堆大小时,值不是0 -请使用内存浏览器检查它。

    因此,要修复它,只需在文件 httpclient.c.的 initializeCB 函数中添加 secAttribs 的分配

    static void initializeCB(HTTPClient_CB *cli)
    {
        memset(cli, 0, sizeof(HTTPClient_CB));
        cli->validBufEnd = cli->buff;
        cli->validBufStart = cli->buff;
        cli->half = -1;
        cli->responseHFieldFilter |= RESPONSE_HFIELDS_ENABLED;
        cli->responseHFieldFreeSize = HTTPClient_RES_HFIELD_BUFFER_SIZE;
        cli->secAttribs = calloc(1, sizeof(SlNetSockSecAttrib_t));
        setCliState(cli,ENABLE_REDIRECT_STATE,true);
        setCliState(cli,ENABLE_TLS_DOWNGRADE_STATE,false);
    }

    您能检查它是否有意义吗?


    谢谢,
    凯文

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

    你好,Jan,

    您是否成功检查了我的答案?

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

    凯文:

    很抱歉,我没回答您的问题。

    我不是 http 客户端应用程序的专家,因为我使用自己的 http 客户端库。 但在快速了解 http 客户端代码后,我不理解您的修改点。 HttpClient_CB 的 secAttribs 的指针应通过 HttpClient_connect()设置在您的案例中,使用 SlNetIfWIFI_sockstartSec()的原因是什么? 此 API 直接设置套接字选项,但与 http 客户端库无关。

    1月

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

    你好,Jan,

    我使用 的是 HttpClient_connect(),但 它调用  HttpClient_connect2,而不是调用  SlNetSock_startSec()

    在我的应用程序中,我只是在 SDK 中执行一些操作,例如 http 示例,调用  HttpClient_create()>  HttpClient_setHeader()>  HttpClient_connect()。

    问题是,调用    HttpClient_create()时,API 没有为 HttpClient_CB 结构中的 secAttribs 分配内存。

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

    您好,

    很抱歉,但我无法理解。 因为看起来 HttpClient_connect2()的参数 secAttribs 是由 createSecAttribs()内的 SlNetSock_secAttribCreate()分配的。

    HttpClient_connect()/ createSecAttribs()-> SlNetSock_secAttribCreate()-> calloc()/ -> HttpClient_connect2()-> SlNetSock_startSec()。

    1月

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

    您好,

    我会试着解释我在这里的感受。

    我用 HttpClient_create()创建了一个 HTTP 客户端,它为 HttpClient_CB 分配内存,它使用 initializeCB()初始化 HttpClient_CB。

    我使用 HttpClient_extSecParams 和标志 NULL 调用 HttpClient_connect(httClientHandle, url_server, 0, 0)函数。 由于 exSecParams 为 NULL,它将调用传递 SlNetSockSectrib_t NULL 参数的 HttpClient_connect2()函数。

    因此,调用调用 SlNetSock_startSec()函数时,调用 SlNetIfWiF_sockstartSec()函数,该函数传递为参数 secAttribs,但仍为 NULL。

    在此函数中,它将 tempSecAttrib 变量的值赋给 secAttrib 变量指向的值,即 NULL 指向的值。 如果 NULL 指向的值为零,则该值将起作用,否则它将使用它指向的值。

    很抱歉,我说 了一些错误或理解了一些错误。

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

    凯文:

    如果您使用的是“https://”前缀,则需要为 HttpClient_connect()设置 exSecParams 参数

    顺便说一句...这是 Kobi 的类似回答。

    1月

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

    谢谢 Jan!