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';