最近我的工作还是调试BOOT以太网END驱动程序,希望BOOT程序能支持网口下载vxWorks镜像功能。但是遇到了一个棘手的问题,我的程序老是在bootLoad()函数里面的ipAttach()程序里出错。即:
。。。。。。
muxAddrResFuncAdd (M2_ifType_ethernet_csmacd, 0x800, ipEtherResolvRtn);
if (ipAttach (params.unitNum, bootDev) != OK)
{
printf ("Failed to attach TCP/IP to device %s", muxDevName);
return (ERROR);
}
。。。。。。
执行后,老是返回“Failed to attach TCP/IP to device”。目前可以确定的是,END驱动已经正确地加载到vxWorks内核中去了(我用“endFindByName (pDevice, unit)”函数能得到一个非NULL的值)。由于没有ipAttach()函数源码,所以通过各种间接方式试图得到一点线索。
采用了如下方式:
在if (ipAttach (params.unitNum, bootDev) != OK){。。。。。}之前加入程序行:
“tmp=ipAttach (params.unitNum, bootDev);
printf("the return value of the ipAttach (params.unitNum, bootDev) is =0x%x\n",tmp);”
这样做的结果,相当于ipAttach()被执行了2遍。
结果:
本来我只是想把ipAttach()的返回值打印出来了解一下。但是,执行后,不但得到了ipAttach()的返回值0xffffffff(即-1),还有意外的信息输出:ARP could not bind to the MUX。
分析及疑问:
1, 查网络资料:0xffffffff(-1)代表无效句柄(伪句柄),即获得的进程句柄无效!这表明ipAttach()内部的某个子程序获取了无效句柄。但是会是在什么地方,出现这个问题呢?
2, 对于意外的信息输出:“ARP could not bind to the MUX”,是怎么产生的呢?
请大侠帮忙。
------解决方案--------------------------------------------------------
前段时间我也遇到了这个问题,找了几天也没有发现到底是哪里的问题。最后发现是子卡的输入时钟太弱了,导致子卡运行出错。和程序没有关系。