首页 > 解决方案 > 动态内存分配硬故障问题

问题描述

我正在为某些以太网进程使用 stm32f4 微处理器和 lwip 库。

我有动态内存分配的问题。由于某种原因,当我向我的硬件发送 ping 时,该设备在 1 小时后遇到了 Hardfault 问题。

这些是我的固件程序main.c

while(1)
{
    uint8_t * incomingData = ethernetif_input(&gnetif);
    
    if(incomingData != NULL)
    {
        if(incomingData[0] == 0x01)
        {
            // doing some process
        }
        incomingData = NULL;
        free(incomingData)
    }
}

ethernetif.c

uint8_t * ethernetif_input(struct netif *netif)
{
    struct pbuf *p;
    p = low_level_input(netif);
        if (p == NULL) {
        return NULL;
    }
    uint8_t * data = (uint8_t*)(malloc(sizeof( uint8_t) * 61U));
    if ((memcmp (p->payload, EXPECTED_ETHERNET_FRAME, 6) == 0))
    {
        for(int i = 0; i < 61; i++) 
        {
            data[i]=(((uint8_t*)p->payload)[i]);
        }
    }
    else
    {
        err = netif->input(p, netif);
        data = NULL;
        free(data);
        if (err != ERR_OK)
        {
            pbuf_free(p);
            p = NULL;
        }
        {
        if(p != NULL)
        {
            pbufFreeErr = pbuf_free(p);
            if( !(_Bool)pbufFreeErr)
            {
        
            } 
    }
    return data;
}

标签: cpointerslwip

解决方案


你的内存不足了。

正如评论中已经提到的:data=NULL; free(data)没有意义。它说忘记数据指向的内容,然后什么也不做。您应该先将free(data)其设置为 NULL。这将使指向的内存data可供将来的malloc调用使用。

而且您还应该pbuf_free在所有情况下调用,如果不这样做,您将耗尽内存。

最后一点,不要使用 for 循环来复制缓冲区,使用memcpy.


推荐阅读