上一节中,我们分析了NetLoop函数部分,这一节,分析一下NetLoop函数调用的PingStart()函数。
static void PingStart(void)
{
#if defined(CONFIG_NET_MULTI)//这个我们不用理
printf ("Using %s device\n", eth_get_name());
#endif
NetSetTimeout (10 * CFG_HZ, PingTimeout);
NetSetHandler (PingHandler);
PingSend();
}
第一、CFG_HZ
在fs2410.h中,我们队CFG_HZ的定义如下:
#define CFG_HZ 1562500,看看smdk2410开发板的作者是怎么注释的
//the PWM TImer 4 uses a counter of 15625 for 10 ms, so we need it to wrap 100 times
//(total 1562500) to get 1 sec.
fs2410.h就是仿smdk2410.h改写的,所以这个值没变,
这个时间应该就是cpu查询CS8900的时间间隔,通过定时的查询检查是否收到数据包。
第二、NetSetTimeout 函数
下面让我们来看看NetSetTimeout 这个函数:
void
NetSetTimeout(ulong iv, thand_f * f)
{
if (iv == 0) {
timeHandler = (thand_f *)0;
} else {
timeHandler = f;
timeStart = get_timer(0);
timeDelta = iv;
}
}
在NetSetTimeout函数中,因为CFG_HZ不为0,所以执行else分支。
timeHandler 的定义如下(定义在net.c中):
static thand_f *timeHandler; // Current timeout handler
而thand_f的定义如下(定义在net.h中)
typedef void thand_f(void);//thand_f是一个无参数无返回的函数,typedef的作用是定义一种类型,例如上面的static thand_f *timeHandler就相当于static void (*thand_f)(void)即定义了一个函数型指针,所谓函数型指针就是指向函数入口地址的指针。
NetSetTimeout函数的参数2也是一个指向函数的指针,这个函数将指向PingTimeout函数,timeHandler=f其实是调用了PingTimeout函数。这个函数内容如下:
static void
PingTimeout (void)
{
eth_halt();
NetState = NETLOOP_FAIL;
}
显然PingTimeout 使CS8900停止工作,并将NetState赋值为NETLOOP_FAIL表示没有收到应答
随后将当前时间赋给timeStart,并或的时间的间隔值
这个函数:NetSetHandler (PingHandler);调用了PingHandler函数。PingHandler函数将ping的ip地址和返回的ip数据报的ip地址进行对标,如果相同则执行该语句NetState = NETLOOP_SUCCESS;
三、pingSend函数
这个函数不在分析,函数的功能是组建ARP请求报文并发送
这些文章仅为自己的理解,算是抛砖引玉吧,希望同各位网友多多交流,共同进步