LWIP_简记(8.tcpip_init()之lwip_init())

LWIP_简记(8.tcpip_init()之lwip_init())
LWIP⼀句话记住就⾏:
⼀项⼯程,两份配置,三种内存分配,四套操作API,五步初始化,六个"数据流",七个数据结构
-------------------------------------------
从这⼀讲开始我们来剖析⼀下lwip_init()中那些⼦系统的初始化.
先上源码:
/**
* @ingroup lwip_nosys
* Initialize all modules.
* Use this in NO_SYS mode. Use tcpip_init() otherwise.
*/
void
lwip_init(void)
{
#ifndef LWIP_SKIP_CONST_CHECK
int a =0;
LWIP_UNUSED_ARG(a);
LWIP_ASSERT("LWIP_CONST_CAST not implemented correctly. Check your lwIP port.",LWIP_CONST_CAST(void*,&a)==&a);
#endif
#ifndef LWIP_SKIP_PACKING_CHECK
LWIP_ASSERT("Struct packing not implemented correctly. Check your lwIP port.",sizeof(struct packed_struct_test)== PACKED_STRUCT_TEST_EXPEC TED_SIZE);
#endif
/* Modules initialization */
stats_init();
#if !NO_SYS
sys_init();
#endif/* !NO_SYS */
//  mem_init();
lwip_mem_init();
memp_init();
pbuf_init();
netif_init();
#if LWIP_IPV4
ip_init();
#if LWIP_ARP
etharp_init();
#endif/* LWIP_ARP */
#endif/* LWIP_IPV4 */
#if LWIP_RAW
raw_init();
#endif/* LWIP_RAW */
#if LWIP_UDP
udp_init();
#endif/* LWIP_UDP */
#if LWIP_TCP
tcp_init();
#endif/* LWIP_TCP */
#if LWIP_IGMP
igmp_init();
#endif/* LWIP_IGMP */
#if LWIP_DNS
dns_init();
#endif/* LWIP_DNS */
#if PPP_SUPPORT
ppp_init();
#endif
#if LWIP_TIMERS
sys_timeouts_init();
#endif/* LWIP_TIMERS */
}
把⼀些条件编译先摘掉:
void
lwip_init(void)
{
sys_init();/* 初始化系统的锁 */
蚀刻标牌mem_init();/* 初始化内存指针 */
memp_init();/* 初始化内存池 */
sys_timeouts_init();/* 定时任务 */
}
少了很多,清楚明了,但是条件编译有些还是需要分析的,特别是⼀些协议的初始化.那么不多说,我们还是逐⼀来分析吧.
关于LWIP_SKIP_CONST_CHECK没什么解释的,看到check⼀般就顾名思义吧,应该是做⼀些检查.
1.stats_init()
void
stats_init(void)
{
#ifdef LWIP_DEBUG
#if MEM_STATS
ame ="MEM";
#endif/* MEM_STATS */
#endif/* LWIP_DEBUG */
}
好像也没有做什么重要的事情,就是赋值动作.lwip_stats结构体还是很复杂的,进去⼀看发现各种state的结构体,放在这⾥吧,不知道有啥⽤.待进⼀步研究.
struct stats_ lwip_stats;
/** lwIP stats container */
struct stats_ {
#if LINK_STATS
/** Link level */
struct stats_proto link;
#endif
#if ETHARP_STATS
/** ARP */
struct stats_proto etharp;
#endif
#if IPFRAG_STATS
/** Fragmentation */
struct stats_proto ip_frag;
#endif
#if IP_STATS
/** IP */
struct stats_proto ip;
#endif
#if ICMP_STATS
/** ICMP */
struct stats_proto icmp;
#endif
#if IGMP_STATS
/** IGMP */
struct stats_igmp igmp;
#endif
#if UDP_STATS
/** UDP */
struct stats_proto udp;
#endif
#if TCP_STATS
/** TCP */
struct stats_proto tcp;
#endif
#endif
#if MEM_STATS
/
** Heap */
struct stats_mem mem;
#endif
#if MEMP_STATS
/** Internal memory pools */
struct stats_mem *memp[MEMP_MAX];
#endif
#if SYS_STATS
/** System */
struct stats_sys sys;
#endif
#if IP6_STATS酮康唑香波
/** IPv6 */
struct stats_proto ip6;
#endif
#if ICMP6_STATS
/** ICMP6 */
struct stats_proto icmp6;
#endif
#if IP6_FRAG_STATS
/** IPv6 fragmentation */
struct stats_proto ip6_frag;
#endif
#if MLD6_STATS
/** Multicast listener discovery */
struct stats_igmp mld6;
#endif
#if ND6_STATS
/** Neighbor discovery */
struct stats_proto nd6;
#endif
#if MIB2_STATS
/** SNMP MIB2 */
struct stats_mib2 mib2;
#endif
};
回到lwip_init()主线上来.
2.sys_init()
受NO_SYS宏控制,⽬前是个空函数,暂时也不管.3.lwip_mem_init()
* Zero the heap and initialize start, end and lowest-free
*/
void女性快乐器
lwip_mem_init(void)
{
struct mem *mem;
LWIP_ASSERT("Sanity check alignment",
(SIZEOF_STRUCT_MEM &(MEM_ALIGNMENT -1))==0);
/* align the heap */
ram =(u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);
/* initialize the start of the heap */
mem =(struct mem *)(void*)ram;
mem->next = MEM_SIZE_ALIGNED;
mem->prev =0;
mem->used =0;
/* initialize the end of the heap */
规整填料ram_end =ptr_to_mem(MEM_SIZE_ALIGNED);
ram_end->used =1;
ram_end->next = MEM_SIZE_ALIGNED;
ram_end->prev = MEM_SIZE_ALIGNED;
MEM_SANITY();
/* initialize the lowest-free pointer to the start of the heap */
lfree =(struct mem *)(void*)ram;
MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED);
if(sys_mutex_new(&mem_mutex)!= ERR_OK){
LWIP_ASSERT("failed to create mem_mutex",0);
}
}
内存堆的初始化,初始化了ram和ram_end定义,⼀般来说,ram只能在ram到ram_end – 1区申请,因为ram_end总是used,如果ram_end ⼀使⽤,就溢出,他是最后⼀个元素+1,永远不能⽤.
3.1定义⼀个mem结构体
显然是⼀个双向链表.
/**
* The heap is made up as a list of structs of this type.
* This does not have to be aligned since for getting its size,
* we only use the macro SIZEOF_STRUCT_MEM, which automatically aligns.
*/
struct mem {
/** index (-> ram[next]) of the next struct */
mem_size_t next;
/** index (-> ram[prev]) of the previous struct */
mem_size_t prev;
/** 1: this area is used; 0: this area is unused */
u8_t used;
#if MEM_OVERFLOW_CHECK
/** this keeps track of the user allocation size for guard checks */
mem_size_t user_size;
#endif
};
3.2对齐操作
ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);
3.3初始化堆的start和end
* Initializes lwIP built-in pools.
* Related functions: memp_malloc, memp_free
*
* Carves out memp_memory into linked lists for each pool-type.
*/
void
memp_init(void)
{
u16_t i;
/* for every pool: */
for(i =0; i <LWIP_ARRAYSIZE(memp_pools); i++){
memp_init_pool(memp_pools[i]);
#if LWIP_STATS && MEMP_STATS
p[i]= memp_pools[i]->stats;
#endif
}
#if MEMP_OVERFLOW_CHECK >= 2
/* check everything a first time to see if it worked */
memp_overflow_check_all();
#endif/* MEMP_OVERFLOW_CHECK >= 2 */
}
内存池初始化,这个就不展开讲了,回去看看第四讲,提⽰⼀下name,type,size,desc四个主要元素.能想起来吗?
5.pbuf_init()
⽬前也是空函数
6if_init()
重要的东西来了,前⾯也应提到过了,本来计划单独拿出来的.但是放在这⾥还是系统些.虽然本篇篇幅会相对较长.
void
netif_init(void)
{
#if LWIP_HAVE_LOOPIF
#if LWIP_IPV4
#define LOOPIF_ADDRINIT &loop_ipaddr, &loop_netmask, &loop_gw,
ip4_addr_t loop_ipaddr, loop_netmask, loop_gw;
IP4_ADDR(&loop_gw,127,0,0,1);
IP4_ADDR(&loop_ipaddr,127,0,0,1);
IP4_ADDR(&loop_netmask,255,0,0,0);
#else/* LWIP_IPV4 */
#define LOOPIF_ADDRINIT
内胎硫化机
#endif/* LWIP_IPV4 */
#if NO_SYS
netif_add(&loop_netif, LOOPIF_ADDRINIT NULL, netif_loopif_init, ip_input);
#else/* NO_SYS */
netif_add(&loop_netif, LOOPIF_ADDRINIT NULL, netif_loopif_init, tcpip_input);
#endif/* NO_SYS */
#if LWIP_IPV6
IP_ADDR6_HOST(loop_netif.ip6_addr,0,0,0,0x00000001UL);
loop_netif.ip6_addr_state[0]= IP6_ADDR_VALID;
#endif/* LWIP_IPV6 */
netif_set_link_up(&loop_netif);
netif_set_up(&loop_netif);
痔疮仪#endif/* LWIP_HAVE_LOOPIF */
}

本文发布于:2024-09-22 14:30:44,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/197425.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:结构   内存   放在
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议