LWIP结构
更新时间:2024-04-27 21:52:01 阅读量: 综合文库 文档下载
- LWIP结构推荐度:
- 相关推荐
协议栈文件Lwip.c封装接口: void Init_lwIP(void) {
struct ip_addr ip, mask, gw; static struct netif netif;
sys_sem_t sem;
/*****TCP/IP 初始化******/ sem = sys_sem_new(0);
uint8_t macaddress[6]={0,0,0,0,0,1}; //根据实际MAC地址赋值
tcpip_init(TcpipInitDone, &sem); sys_sem_wait(sem); sys_sem_free(sem);
#if LWIP_DHCP ipaddr.addr = 0; netmask.addr = 0; gw.addr = 0; #else
IP4_ADDR(&ipaddr, 10, 21, 11, 245); IP4_ADDR(&netmask, 255, 255, 255, 0); IP4_ADDR(&gw, 10, 21, 11, 254); #endif
Set_MAC_Address(macaddress);
netif_add(&netif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input); netif_set_default(&netif);
#if LWIP_DHCP dhcp_start(&netif); #endif
netif_set_up(&netif); }
/*****等待Tcpip初始化完成*******/ static void TcpipInitDone(void *arg) {
sys_sem_t *sem; sem = arg;
sys_sem_signal(*sem); }
网络接口文件Ethernetif.c封装接口:
全局变量: uint8_t MACaddr[6];
/*******设置MAC地址,赋值全局变量**********/ void Set_MAC_Address(uint8_t* macadd) { }
/**********初始化网络底层接口*************/ err_t ethernetif_init(struct netif *netif) {
1、 设置网卡相关属性(填充结构体ethernetif);
2、 注册链路层发送函数low_level_output(给出框架,结合MAC芯片实际情况编写); 3、 ethernetif->ethaddr 指针指向 netif 中保存的网卡 MAC 地址; 4、 网卡初始化low_level_init(); }
注释:该接口无需用户改动。
/*****该函数是实际传输数据包,数据包包含pbuf –>payload,pbuf可能是个链表******/ static err_t low_level_output(struct netif *netif, struct pbuf *p) {
struct pbuf *q; int frameLen = 0; u8 *buffer = NULL;
/******声明一个状态保护变量******/ SYS_ARCH_DECL_PROTECT(sr);
/*********Interrupts are disabled through this whole thing to support multi-threading transmit calls. Also this function might be called from an ISR.********/ SYS_ARCH_PROTECT(sr);
buffer = (u8 *)ETH_GetCurrentTxBuffer(); for(q = p; q != NULL; q = q->next) {
memcpy((u8_t*)&buffer[l], q->payload, q->len); /****MAC芯片****/
ETH_MACAddressConfig(ETH_MAC_Address0, macadd); MACaddr[0] = macadd[0]; ……………………………. MACaddr[5] = macadd[5];
}
l = l + q->len;
ETH_TxPkt_ChainMode(l);
/****退出保护模式***/
SYS_ARCH_UNPROTECT(sr);
return ERR_OK; }
/*******返回缓冲区地址*******/ u32 ETH_GetCurrentTxBuffer(void);
/*******从应用程序的缓冲区,发送一个数据包*****/ ETH_TxPkt_ChainMode(l);
/***********/
static void low_level_init(struct netif *netif) {
SYS_ARCH_DECL_PROTECT(sr);
1、 设置MAC、最大传输单元(1500bytes);
2、 设备功能(NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP); SYS_ARCH_PROTECT(sr);
ETH_MACInit(); }
/*******初始化MAC*******/ void ETH_MACInit(void); /**
* This function should be called when a packet is ready to be read from the interface. It uses the function low_level_input() that should handle the actual reception of bytes from the network interface. Then the type of the received packet is determined and the appropriate input function is called. *
* @param netif the lwip network interface structure for this ethernetif */
err_t ethernetif_input(struct netif *netif) {
/* Enable MAC and DMA transmission and reception */ ETH_Start();
SYS_ARCH_UNPROTECT(sr);
SYS_ARCH_DECL_PROTECT(sr); SYS_ARCH_PROTECT(sr);
SYS_ARCH_PROTECT(sr);
/* move received packet into a new pbuf */ p = low_level_input(netif); SYS_ARCH_UNPROTECT(sr);
/* no packet could be read, silently ignore this */ if (p == NULL) return ERR_MEM;
err = netif->input(p, netif); // 将pbuf传递给上层协议栈 if (err != ERR_OK) {
LWIP_DEBUGF(NETIF_DEBUG, (\pbuf_free(p); p = NULL;
} /**
}
return err;
* Should allocate a pbuf and transfer the bytes of the incoming packet from the interface into the pbuf. *
* @param netif the lwip network interface structure for this ethernetif * @return a pbuf filled with the received packet (including MAC header) * NULL on memory error */
static struct pbuf * low_level_input(struct netif *netif) {
FrameTypeDef frame;
struct pbuf *p,*q; int l=0; u8 *buffer;
frame = ETH_RxPkt_ChainMode(); len=frame.length;
buffer = (u8 *)frame.buffer;
/* We allocate a pbuf chain of pbufs from the pool. */ p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL); if(p!=NULL) {
for(q=p;q!=NULL;q=q->next) {
} }
memcpy((u8_t*)q->payload, (u8_t*)&buffer[l], q->len);
l = l + q->len;
……………………….. return p; }
LWIP协议栈系统使用到的api接口说明:
void tcpip_init(void(*) (void *) inifunc, void * arg) 初始化模块:
? ? 参数:
err_t tcpip_input(struct pbuf * p,struct netif* inp) 输入处理过程:
接收到的数据包通过邮箱传递给tcpip线程处理; 参数:
操作系统模拟层:
LWIP为操作系统模拟层提供了详细说明,文件名为sys_arch.txt,在LWIP的doc文件下。 1、 操作系统模拟层移植说明
操作系统模拟层(sys_arch)存在的目的主要是为了方便 LwIP 的移植,它在底层操作系统和LwIP 之间提供了一个接口。这样,我们在移植 LwIP 到一个新的目标系统时,只需修改这个接口即可。不过,不依赖底层操作系统的支持也可以实现这个接口。
建立并返回一个新的信号量。参数 count指定信号量的初始状态。 sys_sem_t sys_sem_new(u8_t count);
发送一个信号
void sys_sem_signal(sys_sem_t sem);
释放信号量。
void sys_sem_free(sys_sem_t sem);
u32_t sys_arch_sem_wait(sys_sem_t sem, u32_t timeout); p
接受的数据包,p->payload 指向以太网包头或IP头的有效负荷; 收到数据包的网络接口;
inp Inifunc Arg
当线程tcpip_thread运行时完成初始时被调用(check tcpip是否完成init); 参数传递给initfunc; 初始化所有子模块;
启动tcpip处理线程(tcpip_thread);
等待指定的信号并阻塞线程。timeout 参数为 0,线程会一直被阻塞至收到指定的信号;非 0,则线程仅被阻塞至指定的 timeout时间(单位为毫秒)。在timeout 参数值非 0 的情况下,返回值为等待指定的信号所消耗的毫秒数。如果在指定的时间内并没有收到信号,返回值SYS_ARCH_TIMEOUT。如果线程不必再等待这个信号(也就是说,已经收到信号) ,返回值也可以为 0。注意,LwIP实现了一个名称与之相似的函数来调用这个函数,sys_sem_wait(),注意区别。
等待指定的信号并阻塞线程。timeout 参数为 0,线程会一直被阻塞至收到指定的信号;非 0,则线程仅被阻塞至指定的 timeout时间(单位为毫秒)。在timeout 参数值非 0 的情况下,返回值为等待指定的信号所消耗的毫秒数。如果在指定的时间内并没有收到信号,返回值SYS_ARCH_TIMEOUT。如果线程不必再等待这个信号(也就是说,已经收到信号) ,返回值也可以为 0。注意,LwIP实现了一个名称与之相似的函数来调用这个函数,sys_sem_wait(),注意区别。
正在阅读:
LWIP结构04-27
2012年湖州市中考数学试题及答案05-12
基本公共卫生服务解读(汇川区推进会)06-04
教师听课心得感悟05-09
比较优势理论05-15
组织部长在部机关干部职工大会上的讲话04-22
终稿-项目确认函-中福特03-19
2019年最新元宵节之夜作文06-13
- 计算机试题
- 【2012天津卷高考满分作文】鱼心人不知
- 教育心理学历年真题及答案--浙江教师资格考试
- 20180327-第六届“中金所杯”全国大学生金融知识大赛参考题库
- 洪林兴达煤矿2018年度水情水害预测预报
- 基本要道讲义
- 机电设备安装试运行异常现象分析与对策
- 《有机化学》复习资料-李月明
- 非常可乐非常MC2--非常可乐广告策划提案 - 图文
- 2011中考数学真题解析4 - 科学记数法(含答案)
- 企业人力资源管理师三级07- 09年真题及答案
- 基于单片机的光控自动窗帘控制系统设计说明书1 - 图文
- 20160802神华九江输煤皮带机安装方案001
- (共53套)新人教版一生物必修2(全册)教案汇总 word打印版
- 2014行政管理学总复习
- 中国银监会关于加强地方政府融资平台贷款风险监管的指导意见
- 民宿酒店核心竞争与研究
- 游园活动谜语大全2012
- 河南省天一大联考2016届高三英语5月阶段性测试试题(六)(A卷)
- 小型超市管理系统毕业论文详细设计4
- 结构
- LWIP
- 超霸气的20页军事理论题库
- C语言职工信息管理系统课程设计
- 让有效的教学情境成为课堂教学的催化剂
- 连锁经营复习资料(选择题)
- 中国蜂巢呢行业发展研究报告 - 图文
- 保温施工组织设计
- c语言程序设计,江宝钏著,实验九
- 教育学多项选择题
- 苏州供电公司工作票管理规定(2011)--文
- 201301批次网上考试工程造价案例 A 卷 96分
- 公司质量管理机构设立的红头文件
- 2017年移动机器人(AGV)研究分析及发展趋势预测(目录)
- 浙江省执法证考试模拟试卷3(含有答案)
- 暗挖隧道初支侵限处理方案改
- 计算机一级考试试题
- 北京财险市场调研分析报告
- 食堂员工预防食物中毒培训 总结
- 公务员案例分析答案
- ABS原理
- 普通城镇中学生物理课堂自主学习自查表