p PACKing macros for IAR Tools 27.//
28.#define PACK_STRUCT_BEGIN 29.#define PACK_STRUCT_STRUCT 30.#define PACK_STRUCT_END
31.#define PACK_STRUCT_FIELD(x) x 32.#define PACK_STRUCT_USE_INCLUDES 33.#else 34.//
35.// Setup PACKing macros for GCC Tools 36.//
37.#define PACK_STRUCT_BEGIN
38.#define PACK_STRUCT_STRUCT __attribute__ ((__packed__)) 39.#define PACK_STRUCT_END
40.#define PACK_STRUCT_FIELD(x) x 41.#endif
42.
43.#ifdef DEBUG
44.externvoid__error__(char*pcFilename, unsignedlongulLine); 45.#define LWIP_PLATFORM_ASSERT(expr) \ 46.{ \
47.if(!(expr)) \ 48.{ \
49.__error__(__FILE__, __LINE__); \ 50.} \ 51.}
52.#else
53.#define LWIP_PLATFORM_ASSERT(expr) 54.#endif 55.
56.#endif /* __CC_H__ */
#ifndef __CC_H__ #define __CC_H__typedef unsigned char u8_t; //基本数据类型设置 typedef signed char s8_t;typedef unsigned short u16_t;
typedef signed short s16_t;typedef unsigned long u32_t; typedef signed long s32_t;typedef u32_t mem_ptr_t; #ifndefBYTE_ORDER#define BYTE_ORDER LITTLE_ENDIAN#endif #if defined(__arm__) &;&; defined(__ARMCC_VERSION) //以下主要设置不同编译器的结构体数据的对齐,lwIP需要 // // Setup PACKing macros for KEIL/RVMDK Tools // #define PACK_STRUCT_BEGIN __packed #define PACK_STRUCT_STRUCT #define PACK_STRUCT_END #define PACK_STRUCT_FIELD(x) x #elif defined (__IAR_SYSTEMS_ICC__) // // Setup PACKing macros for IAR Tools // #define PACK_STRUCT_BEGIN #define PACK_STRUCT_STRUCT #define PACK_STRUCT_END #define PACK_STRUCT_FIELD(x) x #define
PACK_STRUCT_USE_INCLUDES#else // // Setup PACKing macros for GCC Tools // #define PACK_STRUCT_BEGIN #define PACK_STRUCT_STRUCT __attribute__ ((__packed__)) #define PACK_STRUCT_END #define PACK_STRUCT_FIELD(x) x#endif#ifdef DEBUG extern void __error__(char *pcFilename, unsigned long ulLine); #define LWIP_PLATFORM_ASSERT(expr) \ { \ if(!(expr)) \ { \ __error__(__FILE__, __LINE__); \ } \}#else #define LWIP_PLATFORM_ASSERT(expr)#endif#endif /* __CC_H__ */
2.以太网硬件初始化、与硬件密切相关的数据接收、发送函数
虽然Adam为便于lwIP协议栈的移植做了大量的
工作,但因为网卡的多样性和新网卡的不断出现,Adam不可能为每一个网卡都写一个驱动。因此,与网卡硬件相关的代码就留给程序员来编写了。其实Adam在lwIP协议栈中已经写好了一个与硬件密切相关的移植代码框架,它位于lwIP-1.3.2/src/netif/ethernetif.c中。Stellaris串口转以太网移植代码也基本上是参照这个代码框架来编写的。Stellais串口转以太网模块与硬件密切相关的移植代码位于stellarisif.c中。
这里面的代码主要是三部分:lwIP协议栈和以太网硬件初始化函数、lwIP协议栈将数据发送到网络接口上的输出函数以及从Stellaris以太网硬件读取数据并送给lwIP协议栈的输入函数。 2.1 lwIP协议栈和以太网硬件初始化
在移植代码stellarisif.c中,对lwIP协议栈和以太网硬件初始化的函数是: err_tstellarisif_init(structnetif *netif)
这个函数先是设置与协议栈有关的底层操作,指定底层接收回调函数等,接着对实际网络接口芯片进行初始化,设置硬件的工作方式,开放中断等。
源代码如下所示:
view plaincopy to clipboardprint?
1. /**
2. * Should be called at the beginning of the program to set up the 3. * network interface. It calls the function stellarisif_hwinit() to do the
4. * actual setup of the hardware.
5. * 此在
程序开始的时候被调用,用来设置网络接口.他调用stellari