查看: 2232|回复: 3

[求助] KSDK V1.2的LwIP例程在MAPS-K64上能被ping死

[复制链接]

该用户从未签到

11

主题

101

帖子

0

中级会员

Rank: 3Rank: 3

积分
303
最后登录
2021-11-15
发表于 2015-9-23 11:12:40 | 显示全部楼层 |阅读模式
本帖最后由 LuoHG 于 2015-9-23 11:12 编辑

KSDK V1.2的LwIP例程
...\KSDK_1.2.0\examples\frdmk64f\demo_apps\lwip\lwip_tcpecho_demo\tcpecho_rtos
在MAPS上可以运行(网口LED均不亮),但连接ping 192.168.1.101 -t最多杠不过半个小时K64就崩溃了,如果再连TCP不断地发送数据进行压力测试,磕毙得更快,因为是在中断里进行接收处理以为是栈开得小了,结果增大到__stack_size__=0x4000还无济于事,于是改个方法在中断里置位接收标志,在任务中进行数据接收处理,这招仍然行不通,结果比在中断里接收处理磕毙得更为迅速,希望有MAPS-K64或者FRDM-K64的朋友用KSDK V1.2的LwIP例程进行下压力测试,看是不是存在同样的问题。


探讨一下low_level_input函数的实现
static struct pbuf *
low_level_input(struct netif *netif, enet_mac_packet_buffer_t *packetBuffer)
{
    uint16_t location = 0;
    struct pbuf *head, *temphead, *p, *q;
    head = temphead = p = q = NULL;
    uint8_t *pucSrc, *pucDst;
    uint16_t uiCpyLen;

    if (packetBuffer->length != 0)
    {
        head = temphead = p = pbuf_alloc(PBUF_RAW, packetBuffer->length, PBUF_POOL);
        if(p == NULL)
            return NULL;
    }
    else
    {
        return NULL;
    }

    while(1)
    {
        if (packetBuffer->length != 0)
        {
            location = 0;
            for(q = p; q != NULL; q = q->next)
            {
                pucSrc = packetBuffer->data + location;
                pucDst = q->payload;
                uiCpyLen = q->len;
                while (uiCpyLen--)
                    *pucDst++ = *pucSrc++;

                //memcpy((uint8_t*)q->payload, packetBuffer->data + location, q->len);    // 用上面语句替换
                location = location + q->len;
            }
        }

        packetBuffer = packetBuffer->next;
        if (packetBuffer != NULL)
        {
            if (packetBuffer->length != 0)
            {
                p = pbuf_alloc(PBUF_RAW, packetBuffer->length, PBUF_POOL);
                if(p == NULL)
                {
                    pbuf_free(head);   // 原版没有此语句,若无此语句就retur的话,上述已分配的head指针向的pbuf岂不是永远无法释放了
                    return NULL;
                }

                pbuf_chain(temphead, p);
                temphead = p;
            }
            //else   
            //{
            //      break;
           // }
// 本想加这个else判断的,仿真时还真的能入这里,缺此语句又while回去直到packetBuffer->next == NULL为止,我就有点疑惑fsl_enet_drv层会不会存在上一帧未处理然后又来一帧,结果导致数据组织失误导致K64崩溃,因为程序均在执行low_level_input后触发硬件错误崩溃的。这是本人的疑惑而已,还得经FRDM验证确定,若FRDM完全OK,那应该是MAPS的PHY配置不恰,但MAPS的技术支持荡然无存,它出的例程网络部分完全用不了还一点更新的音讯都没有。
        }
        else
        {
            break;
        }
    }

    return head;  
}

我知道答案 目前已有3人回答
回复

使用道具 举报

该用户从未签到

61

主题

965

帖子

0

金牌会员

Rank: 6Rank: 6

积分
2394
最后登录
1970-1-1
发表于 2015-9-23 13:23:33 | 显示全部楼层
谢谢分享
回复

使用道具 举报

  • TA的每日心情

    2018-10-30 22:37
  • 签到天数: 28 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    9

    主题

    435

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1107
    最后登录
    2020-8-28
    发表于 2015-9-23 15:31:39 | 显示全部楼层
    该问题已解决。自行社工我的账号可得解法。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11

    主题

    101

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    303
    最后登录
    2021-11-15
     楼主| 发表于 2015-9-23 16:13:53 | 显示全部楼层
    有事烧纸 发表于 2015-9-23 15:31
    该问题已解决。自行社工我的账号可得解法。

    哪里有解决策略啊,何解自行社工?
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-28 23:21 , Processed in 0.094912 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表