lwipÖи÷ÖÖº¯Êý£¬±ê־λµÄ×ܽá ÏÂÔØ±¾ÎÄ

mem_init( ) ÄÚ´æ¶ÑµÄ³õʼ»¯º¯Êý£¬Ö÷ÒªÊǸæÖªÄÚ´æ¶ÑµÄÆðÖ¹µØÖ·£¬ÒÔ¼°³õʼ»¯¿ÕÏÐ±í£¬ÓÉlwip ³õʼ»¯Ê±×Ô¼ºµ÷Ó㬸ýӿÚΪÄÚ²¿Ë½Óнӿڣ¬²»¶ÔÓû§²ã¿ª·Å

mem_malloc( ) ÉêÇë·ÖÅäÄÚ´æ¡£½«×ܹ²ÐèÒªµÄ×Ö½ÚÊý×÷Ϊ²ÎÊý´«µÝ¸ø¸Ãº¯Êý£¬·µ»ØÖµÊÇÖ¸Ïò×îзÖÅäµÄÄÚ´æµÄÖ¸Õ룬¶øÈç¹ûÄÚ´æÃ»ÓзÖÅäºÃ£¬Ôò·µ»ØÖµÊÇNULL

mem_calloc( ) ÊǶÔmem_malloc( )º¯ÊýµÄ¼òµ¥°ü×°£¬ËûÓÐÁ½¸ö²ÎÊý£¬·Ö±ðÎªÔªËØµÄÊýÄ¿ºÍÿ¸öÔªËØµÄ´óС£¬ÕâÁ½¸ö²ÎÊýµÄ³Ë»ý¾ÍÊÇÒª·ÖÅäµÄÄÚ´æ¿Õ¼äµÄ´óС£¬Óëmem_malloc()²»Í¬µÄÊÇËü»á°Ñ¶¯Ì¬·ÖÅäµÄÄÚ´æÇåÁã¡£Óо­ÑéµÄ³ÌÐòÔ±¸üϲ»¶Ê¹ÓÃmem_ calloc ()£¬ memp_num£ºÕâ¸ö¾²Ì¬Êý×éÓÃÓÚ±£´æ¸÷ÖÖÀàÐÍ»º³å³ØµÄ³ÉÔ±ÊýÄ¿ memp_sizes£ºÕâ¸ö¾²Ì¬Êý×éÓÃÓÚ±£´æ¸÷ÖÖÀàÐÍ»º³å³ØµÄ½á¹¹´óС memp_tab£ºÕâ¸öÖ¸ÕëÊý×éÓÃÓÚÖ¸Ïò¸÷ÖÖÀàÐÍ»º³å³Øµ±Ç°¿ÕÏнڵã

memp_init£¨£©£ºÄÚ´æ³ØµÄ³õʼ»¯£¬Ö÷ÒªÊÇΪÿÖÖÄÚ´æ³Ø½¨Á¢Á´±ímemp_tab£¬ÆäÁ´±íÊÇÄæÐòµÄ£¬´ËÍ⣬Èç¹ûÓÐͳ¼Æ¹¦ÄÜʹÄܵϰ£¬Ò²°Ñ¼Ç¼Á˸÷ÖÖÄÚ´æ³ØµÄÊýÄ¿¡£

memp_malloc£¨£©£ºÈç¹ûÏàÓ¦µÄmemp_tabÁ´±í»¹ÓпÕÏеĽڵ㣬Ôò´ÓÖÐÇгöÒ»¸ö½Úµã·µ»Ø£¬ ·ñÔò·µ»Ø¿Õ¡£

memp_free£¨£©°ÑÊͷŵĽڵãÌí¼Óµ½ÏàÓ¦µÄÁ´±ímemp_tabÍ·ÉÏ¡£ ϵͳÊǵ÷ÓÃÄÚ´æ¶Ñ·ÖÅ亯Êýmem_malloc½øÐÐÄÚ´æ·ÖÅäµÄ¡£·ÖÅä

¿Õ¼äµÄ´óС°üÀ¨pbuf½á¹¹Í·´óСSIZEOF_STRUCT_PBUF£¬ÐèÒªµÄÊý¾Ý´æ´¢¿Õ¼ä´óСlength£¬»¹ÓÐÒ»¸öoffsetϵͳÊǵ÷ÓÃÄÚ´æ¶Ñ·ÖÅ亯Êýmem_malloc½øÐÐÄÚ´æ·ÖÅäµÄ¡£¶ÎÇøÓòµÄoffsetµÄ´óС£¬Õâ¶ÎÇøÓòÓÃÀ´´æ´¢Êý¾ÝµÄ°üÍ·£¬ÈçTCP°üÍ·£¬IP°üÍ·µÈ pbuf_free(A)º¯ÊýÀ´É¾³ýpbuf½á¹¹

PBUF_POOL ÀàÐͺÍPBUF_ROMÀàÐÍ¡¢PBUF_REFÀàÐÍÐèҪͨ¹ýmemp_free()º¯Êýɾ³ý£¬PBUF_RAMÀàÐÍÐèҪͨ¹ýmem_free()º¯Êýɾ³ý

memp_memoryÊÇ»º³å³ØµÄÆðʼµØÖ·£¬Ç°ÃæÒÑÓÐËùÌÖÂÛ£» MEMP_MAXÊÇPOOL ÀàÐÍÊý; memp_tab ÓÃÓÚÖ¸ÏòijÀàPOOL ¿ÕÏÐÁ´±íµÄÆðʼ½Úµã£»memp_num±íʾ¸÷ÖÖÀàÐÍPOOLµÄ¸öÊý£»memp_sizes±íʾ¸÷ÖÖÀàÐ͵¥¸öPOOLµÄ´óС£¬¶ÔÓÚMEMP_PBUF_POOLºÍMEMP_PBUFÐ͵ÄPOOL£¬Æä´óСÊÇpbufÍ·ºÍpbuf¿É×°ÔØÊý¾Ý´óСµÄ×ܺ͡£

ÍøÂç½Ó¿Ú

ÔÚLWIPÖУ¬ÊÇͨ¹ýÒ»¸ö½Ð×önetifµÄÍøÂç½á¹¹ÌåÀ´ÃèÊöÒ»¸öÓ²¼þÍøÂç½Ó¿ÚµÄ struct netif {

struct netif *next; // Ö¸ÏòÏÂÒ»¸önetif½á¹¹µÄÖ¸Õë struct ip_addr ip_addr; // IP µØÖ·Ïà¹ØÅäÖà struct ip_addr netmask;

struct ip_addr gw;

err_t (* input)(struct pbuf *p, struct netif *inp); //µ÷ÓÃÕâ¸öº¯Êý¿ÉÒÔ´ÓÍø¿¨ÉÏÈ¡µÃÒ»¸öÊý¾Ý°ü err_t (* output)(struct netif *netif, struct pbuf *p, // IP ²ãµ÷ÓÃÕâ¸öº¯Êý¿ÉÒÔÏòÍø¿¨·¢ËÍ structip_addr*ipaddr); //Ò»¸öÊý¾Ý°ü

err_t (* linkoutput)(struct netif *netif, struct pbuf *p); // ARPÄ£¿éµ÷ÓÃÕâ¸öº¯ÊýÏòÍø¿¨·¢ËÍÒ»¸öÊý¾Ý°ü

void *state; // Óû§¿ÉÒÔ¶ÀÁ¢·¢»Ó¸ÃÖ¸Õ룬ÓÃÓÚÖ¸ÏòÓû§¹ØÐĵÄÍø¿¨ÐÅÏ¢

u8_t hwaddr_len; // Ó²¼þµØÖ·³¤¶È£¬¶ÔÓÚÒÔÌ«Íø¾ÍÊÇMACµØÖ·³¤¶È£¬Îª6¸÷×Ö½Ú

u8_t hwaddr[NETIF_MAX_HWADDR_LEN]; //MAC µØÖ·

u16_t mtu; // Ò»´Î¿ÉÒÔ´«Ë͵Ä×î´ó×Ö½ÚÊý£¬¶ÔÓÚÒÔÌ«ÍøÒ»°ãÉèΪ1500

u8_t flags; // Íø¿¨×´Ì¬ÐÅÏ¢±ê־λ

char name[2]; // ÍøÂç½Ó¿ÚʹÓõÄÉ豸Çý¶¯ÀàÐ͵ÄÖÖÀà u8_t num; // ÓÃÀ´±êʾʹÓÃͬÖÖÇý¶¯ÀàÐ͵Ä

²»Í¬ÍøÂç½Ó¿Ú };

output×Ö¶ÎÏòÒ»¸öº¯Êý¸Ãº¯ÊýµÄÈý¸ö²ÎÊýÊÇpbufÀàÐÍ¡¢netifÀàÐͺÍip_addrÀàÐÍ£¬·µ»Ø²ÎÊýÊÇerr_tÀàÐÍ¡£ÆäÖÐpbuf´ú±íÒª·¢Ë͵ÄÊý¾Ý°ü¡£ipaddr ´ú±íÍø¿¨ÐèÒª½«¸ÃÊý¾Ý°ü·¢Ë͵½µÄµØÖ·£¬¸ÃµØÖ·Ó¦¸ÃÊǽÓÊÕʵ¼ÊµÄÁ´Â·²ãÖ¡µÄÖ÷»úµÄ IpµØÖ·

ethernetif_initµ×²ã½Ó¿Ú³õʼ»¯º¯Êý

tcpip_input º¯ÊýÊÇÏòIP²ãµÝ½»Êý¾Ý°üµÄº¯Êý

netif->next = netif_list; //½«³õʼ»¯ºóµÄ½Úµã²åÈëÁ´±ínetif_list netif_list = netif; // netif_list Ö¸ÏòÁ´±íÍ·

low_level_init(netif); //µ×²ãÓ²¼þ³õʼ»¯º¯Êý static void low_level_init(struct netif *netif) {

netif->hwaddr_len = ETHARP_HWADDR_LEN; //ÉèÖñäÁ¿enc28j60µÄhwaddr_len×Ö¶Î

netif->hwaddr[0] = 'F'; //³õʼ»¯±äÁ¿enc28j60µÄMACµØÖ· netif->hwaddr[1] = 'O'; //ÉèʲôµØÖ·Óû§×ÔÓÉ·¢»Ó°É£¬µ«ÊDz»ÒªÓëÆäËûÍøÂçÉ豸µÄMACµØÖ·Öظ´¡£

netif->hwaddr[2] = 'R'; netif->hwaddr[3] = 'E';