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.

[参考译文] TM4C1294KCPDT:TCP 接收有效载荷问题

Guru**** 2558250 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/877345/tm4c1294kcpdt-tcp-receive-payload-issue

器件型号:TM4C1294KCPDT

您好!

我正在尝试使用 MbedTLS 和非基于操作系统的系统在 Tiva C 上实施 HTTPS 发布。 我正在使用 LwIP。

我能够在服务器端发布数据并查看结果、但在成功发布后、TCP 接收回调函数正在接收缓冲区、其中负载指向 ResetISR 的存储器位置、同一缓冲区中的下一个负载指向 一个未知的存储器位置、由于该位置、我接收到总线故障、处理器进入故障 ISR。

有人能帮助我了解正在发生什么以及发生这种情况的原因吗?

这是缓冲区的屏幕截图

0x00063341是我可以在存储器浏览器中看到的 ResetISR 的位置。

next ->有效载荷指向0x56BDFCD6

此致、

Deepak

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

    您好!

     您能否增大堆栈大小并查看这是否会产生影响? 尝试使用您当前堆栈大小的2倍、然后查看故障是否消失。  

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

    [引用 user="Deepak rai"]是否有人能帮助我了解正在发生的情况以及发生这种情况的原因?

    也许接收器正在溢出、数据表寄存器 DMARIS 状态位通常指示发生了哪种异常中断事件。  

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

    我尝试增大大小、但遇到错误  

    错误#10099-D:程序不能放入可用内存中。 对于“DATA_GROUP”大小为0x1ad3的段,运行定位失败。 可用存储器范围:
    SRAM 大小:0x40000未使用:0x1a7d 最大空洞:0x1a78

    我尝试增加堆、它暂时解决了问题、但在一段时间后、我再次遇到了一个错误。

    是否有办法检查我的存储器正在用于什么用途? 我没有编写我拥有的整个代码库。 我只是尝试添加一些功能、以便了解内存使用情况。

    此致、

    Deepak

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

    您可能会在某个地方发生内存泄漏。 SRAM 为256k、您似乎使用了大部分 SRAM。 您还有0x1a7d 字节的 SRAM 存储器空间。 当你增加堆时、它会失败、因为剩余的动态内存不足。 不确定您的问题是否是 由 MbedTLS 造成的。 您可能需要先删除 MbedTLS、然后查看您是否仅遇到 lwip TCP/IP 问题。 我们对第三方 MbedTLS 没有任何经验。 我在这里没有什么可以帮助的。 我认为 您可以向 MbedTLS 供应商提供更好的帮助。   

     您可以检查.map 文件以查找代码/数据的分配。  

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

    您好、Charles、

    在存储器分配中、我可以看到96%的 SRAM 正在使用中。

    如果没有 MbedTLS、85%的人正在使用、我觉得这仍然很高。 是的、我当时没有遇到这个问题、但我想知道如何减少这个问题。  

    如果没有 MbedTLS、.bss 将使用216k、我可以看到其中的一个  

    .bss:ram_heap (mem.obj)为131k  

    .bss:memp_memory_PBUF_pool_base 为66K

    这两个设备使用的大多数 RAM 与 MbedTLS 无关。

    此致、

    Deepak

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

    有关 LwIP 动态内存管理的链接可能会有所帮助。  https://lwip.fandom.com/wiki/Lwipopts.h

    是否已将 MEM_libc_malloc 设置为1或正在使用 Lwip 的自定义堆管理? 如果您对 MEM_libc_malloc 进行了注释并设置为1、我建议您对#define 进行注释、并看到它会产生不同的效果。  

    您是否有任何机会更改了 lwipopts.h?  

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

    这是 lwipopts.h 中的"Memory"选项

    //------ 内存选项--------------------------------------------------------
    //
    //
    //#define MEM_libc_malloc 0
    #define MEM_alignment 4.
    #define MEM_SIZE (128 * 1024)//(128 * 1024)
    //#define MEMP_OVERFLOAD_CHECK 0
    //#define MEMP_sanity_check 0
    //#define MEM_USE_Pools 0
    //#define MEMP_USE_CUSTOM_Pools 0

    您可以看到 、MEM_libc_malloc 被注释掉。 我的 MEM_SIZE 是我在内存浏览器中可以看到的131k。

    我可以减小它吗? 这会对 我的代码产生负面影响吗?

    此致、

    Deepak

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

    现在、这就解释了为什么堆容量大。 TivaWare 以太网示例仅使用64x1024。 您可以将其减少到与示例相同的值、看看这是否会产生影响?

    下面是 TivaWare enet_io.c 示例的 lwipopts.h。  

    //
    ////
    --- 内存选项--------------------------------------------------------
    ////
    *****************
    //#define MEM_libc_malloc 0
    #define MEM_alignment 4. //默认为1
    #define MEM_SIZE (64 * 1024)//默认值为1600
    //#define MEMP_overflow_check 0
    //#define MEMP_sanity_check 0
    //#define MEM_USE_Pools 0
    //#define MEMP_USE_CUSTOM_Pools 0
    
    //*****************
    ////
    --- 内部内存池大小--------------------------------------------------------
    ////
    *****************
    #define MEMP_NUM_PBUF 48 //默认16
    //#define MEMP_NUM_RAW_PCB 4
    //#define MEMP_NUM_UDP_PCB 4
    #define MEMP_NUM_tcp_PCB 16 //默认5
    //#define MEMP_NUM_tcp_PCV_Listen 8
    #define MEMP_NUM_tcp_SEG 32 //默认16
    //#define MEMP_NUM_REASSDATA 5
    //#define MEMP_NUM_ARP_queue 30
    //#define MEMP_NUM_IGMP_GROUP 8
    #define MEMP_NUM_SYS_TIMEOUT 8
    //#define MEMP_NUM_NETBUF 2
    //#define MEMP_NUM_NETCONN 4
    //#define MEMP_NUM_TCPIP_MSG_API 8
    //#define MEMP_NUM_TCPIP_MSG_INPKT 8
    #define PBUF_POOL_SIZE 48 //默认16 

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

    您好、Charles、

    我减小了 MEM_SIZE、现在我有了 SRAM、但仍然面临这个问题。  

    有时、它的工作方式非常好、有时 TCP 有效负载仍指向未定义的位置。

    我已经尝试更改堆栈大小和堆 、但我无法找到此类行为的原因。  

    您是否对这种情况的发生有任何想法?

    此致、

    Deepak

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

    您如何更改堆栈大小?

    您是否在以下示例等两个方面都发生了变化?

     除了堆栈大小、我真的不知道是什么导致了您的问题。 通常、硬故障主要与堆栈不足相关。 除非您未正确增加堆栈大小、否则您的情况看起来不是这样。 请注意、我们的专业技术不在 LwIp 等第三方软件上。  同时、我建议您按照此应用手册 http://www.ti.com/lit/an/spma043/spma043.pdf 诊断硬故障问题。