DE2平台应用全解
代码4.17 在用户线程启动之前完成协议栈的初始化。 #include includes.h #include alt_LWIP_dev.h int main () { ... LWIP_stack_init(TCPIP_THREAD_PRIO, init_done_func, 0); ... OSStart(); ... return 0; } lwip_stack_init()函数在这里完成的是LWIP协议栈的初始化,其函数原型为 void lwip_stack_init(int thread_prio, void (* init_done_ func) (void *), void *arg) 此函数并没有返回值,函数中三个参数的作用见表4.9。 2) ?init_done_func()函数 init_done_func()函数的原型为void init_done_func(void* arg)。此函数会在协议栈初始化的时候被调用,因此在程序中必须编写此函数的函数实体。同时,在函数中必须调用lwip_devices_init()来完成网络设备的初始化,如果初始化成功,则启动用户的TCP/IP任务,示例程序如代码4.18;如果网络接口初始化不成功,则表明没有网络硬件或者网络硬件不能初始化。很多原因会导致网络初始化不成功,比如没有与网络连接或者无法获得MAC地址等。另外,必须使用sys_thread_new()函数新建一个任务,并通过socket接口完成用户所需的各种网络操作。 代码4.18 ini_done_func()示例。 #include stdio.h #include LWIP/sys.h #include alt_LWIP_dev.h #include includes.h /* IP协议栈激活之后调用此函数 */ static void tcpip_init_done(void *arg) { int temp; if (LWIP_devices_init(ETHER_PRIO)) { /*如果初始化成功,则启动一个用户任务*/ temp = sys_thread_new(user_thread_func, NULL, USER_THREAD_PRIO); if (!temp) { perror(Cant add the application threads”); OSTaskDel(OS_PRIO_SELF); } } else { perror(Cant initialize any interface. Closing down.\n); OSTaskDel(OS_PRIO_SELF); } return; } 3) ?lwip_devices_init()函数 lwip_devices_init()函数的原型为int lwip_devices_init(int rx_thread_prio),用以完成对网络设备的初始化,初始化成功后会返回非负数值,否则返回?1。在这个函数中,系统会自动调用get_mac_addr()和get_ip_addr()两个函数完成MAC地址和IP地址的设定,这两个函数并非系统函数,用户在程序中必须提供这两个函数的实体。 4) ?get_mac_addr()与get_ip_addr()函数 get_mac_addr()和get_ip_addr()函数在系统完成网络设备初始化时被系统函数调用。这两个函数需要由用户编写函数实体,这使用户设定MAC地址和IP地址的方式非常灵活。比如,有些系统中把MAC地址存储在FLASH之中,而另一些系统则把MAC地址存放在片上存储器之中。这两个函数所引入的参数均为在LWIP协议栈内部所使用的一个数据结构,用户并不需要了解这些数据结构的细节,而只需要了解如何设定MAC地址和IP地址。 get_mac_addr()函数原型为:err_t gat_mac_addr(alt_lwip_dev* lwip_dev)。在get_mac_addr()函数中,通过对alt_lwip_dev数据结构中的如下变量赋值来实现对于MAC地址的设定: (1) ?unsigned char lwip_dev-netif-hwaddr_len,用以设定MAC地址的长度,一般设为6。 (2) unsigned char lwip_dev-netif-hwaddr[0-5],用以设定设备的MAC地址。 代码4.19为get_mac_addr()函数实现的程序示例。 代码4.19 get_mac_addr()函数实现的程序示例。 #inclu
原创力文档

文档评论(0)