在线时间37 小时
UID2087604
注册时间2014-4-22
NXP金币0
该用户从未签到
中级会员
 
- 积分
- 303
- 最后登录
- 2021-11-15
|
本帖最后由 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;
}
|
|