历史上的今天
返回首页

历史上的今天

今天是:2025年03月17日(星期一)

正在发生

2021年03月17日 | 嵌入式LWIP网络客户端设计

2021-03-17 来源:eefocus

引言


嵌入式技术的兴起使得传统的基于PC机的互联网技术优势不再,嵌入式网络客户端与服务端技术成为热点,而该技术需要移植性高、占用资源小的协议栈,轻量级TCP/IP协议栈LWIP (light weight Internet protocol)比较适合嵌入式设备中存储容量有限的情况,而且能实现TCP/IP协议栈的基木功能,不影响设备的网络互联与传输服务[1]。轻量级网络协议LWIP依附的硬件操作系统有RT_Thread[2-3]和uC/OS-II[4-5],鉴于uC/OS-II是一款应用较为广泛、技术较成熟的操作系统,本文采用uC/OS-II操作系统设计网络客户端。实验结果表明:ping 32字节的数据,其收发正确,错误率为0%。


1 系统硬件


如图1所示:硬件采用STM32处理器作为主控芯片,通过以太网控制器EN28J60和RJ45接口连接互联网,而且为了进行功能扩展和试验验证,主控芯片也可以由串口与计算机进行数据互传。

STM32F107是主控芯片,它不仅具有USB OTG 和CAN2.0B接口,而且片上集成了以太网10/100 MAC模块。该模块支持MII和RMII两种模式,所以,主控制器只需外接一个物理层PHY芯片就可以实现一个完整的以太网收发器;在时钟信号方面,只需用一个25MHz的晶振就可以给整个主控制器提供时钟,而主控制器还能输出一个25MHz或50MHz的时钟,交外部物理层PHY层芯片使用,这样可以为系统节省一个附加晶振[6]。


以太网控制器是ENC28J60,它符合IEEE802. 3协议的全部规范,可以利用健全的包过滤机制对输入的数据包进行限制。集成了DMA模块,支持数据的高速吞吐率,并结合硬件实现IP地址校验和计算。它和主控器的通信依赖于两个中断管脚和SPI总线实现,数据传输速率高达10 MB/s,为了观察数据传输的活动状态,可以在两个专用的引脚接上发光二极管[7]。


2 操作系统移植


操作系统uC/OS-II移植涉及到的主要内容是[4-5][8]:修改并整合与处理器相关的源文件,包含os_cpu_c.c,os_cpu_a.s,os_cpu.h三个文件。其中os_cpu.h文件负责定义与编译器相关的数据类型、堆栈类型,另外还有几个宏定义和函数声明,在进行移植工作时,由于对一个相同的数据类型,不同的编译器所支持的数据长度却不相同,所以需要修改原来的数据类型。os_cpu_a.s文件主要负责定义与处理器相关的任务切换函数,实现任务上下文的切换以满足任务调度时的需要,另外还定义了时钟中断处理函数和进退临界区宏指令。os_cpu_c.c文件主要负责定义堆栈的初始化函数,以利于操作系统在进行任务切换或中断时对相关操作数据进行堆栈保护,另外还定义了相关的HOOK函数。


首先修改os_cpu_a.asm文件,将原来的RSEG CODE:CODE:NOROOT(2)改成:




AREA |.text|, CODE, READONLY, ALIGN=2;(其中AREA|.text|代表选择段|.text|,CODE指明代码段,READONLY代表默认情况:只读。由于当ALIGN=n,则字节数为2^n,故此处ALIGN=2表示对齐4字节。)


THUMB ;Thumb指令集


REQUIRE8 ;说明当前文件是八字节对齐堆栈需求


PRESERVE8 ;说明当前文件属于八字节对齐堆栈


修改os_cpu.h文件,注释掉下面的这三个函数:Void OS_CPU_SysTickHandler(void);Void OS_CPU_SysTickInit(void);UINT32 OS_CPU_SysTickClkFreq(void);


修改os_cpu_c.c文件,注释掉以下定义和函数:


#define OS_CPU_CM3_NVIC_ST_CTRL (*((volatile INT32U *)0xE000E010))


#define OS_CPU_CM3_NVIC_ST_RELOAD (*((volatile INT32U *)0xE000E014))


#define OS_CPU_CM3_NVIC_ST_CURRENT (*((volatile INT32U *)0xE000E018))


#define OS_CPU_CM3_NVIC_ST_CAL (*((volatile INT32U *)0xE000E01C))


#define OS_CPU_CM3_NVIC_PRIO_ST (*((volatile INT8U *)0xE000ED23))


#define OS_CPU_CM3_NVIC_ST_CTRL_COUNT 0x00010000


#define OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC 0x00000004


#define OS_CPU_CM3_NVIC_ST_CTRL_INTEN 0x00000002


#define OS_CPU_CM3_NVIC_ST_CTRL_ENABLE 0x00000001


#define OS_CPU_CM3_NVIC_PRIO_MIN 0xFF


void OS_CPU_SysTickHandler (void)函数


void OS_CPU_SysTickInit (void) 函数


3 轻量级协议栈LWIP的移植


LWIP是轻量级的TCP/IP协议栈,协议栈中涉及的函数与数据结构和操作系统及硬件不相关,如果需要使用uC/OS-II操作系统的函数,必须通过操作系统模拟层进行调用。所以移植LWIP协议栈,实际上就是移植到uC/OS-II操作系统。操作系统模拟层为定时器、同步处理、消息传送机制等服务提供一组外留的接口函数,为LwIP提供两种进程间通信方式:信号量和邮箱。创建任务函数、临界保护函数以及信号量和邮箱操作函数均由uC/OS-II提供,进行针对LwIP的移植任务时,就是修改相关接口函数(包括信号量操作函数、邮箱操作函数、临界保护函数、sys_thread_new( )函数、sys_arch_timeouts( )函数),从而实现LwIP操作系统模拟层的函数利用[4~5]。


LWIP的数据包包头是14个字节,基于LWIP的以太网接收的数据包格式以一个数据结构来描述:PACK_STRUCT_BEGIN


struct eth_hdr {


PACK_STRUCT_FIELD(struct eth_addr dest); //目标的媒质接入控制层地址


PACK_STRUCT_FIELD(struct eth_addr src); //源的媒质接入控制层地址


PACK_STRUCT_FIELD(u16_t type); //类型


} PACK_STRUCT_STRUCT;


PACK_STRUCT_END


其中几个PACK_STRUCT_xxx 的宏定义与编译器字对齐相关,上面的目标dest、源src和类型type三个字段分别对应目标的媒质接入控制层地址、源的媒质接入控制层地址、数据类型。


4 结论


测试前需要把计算机与嵌入式网口模块的IP地址配置在同一网段,IP地址分别为192.168.1.100,192.168.1.102。如果想查看IP地址配置情况,运行CMD命令行,执行ipconfig/all命令。配置完以后,接着ping嵌入式网口的IP地址,结果如图2所示。


从图2可以看出:主机ping 32字节的数据,4个包所用的时间最长为5ms,最短为3ms;而4个包的TTL值均为255, 这是由于最优路径选择算法定下来以后,经过一段时间稳定后,网络拓扑结构也稳定了,数据包的路由路径也会相应稳定在一个最优路径上。整个过程的数据收发正确,错误率为0%。


参考文献:


[1]张齐,劳炽元. 轻量级协议栈LWIP的分析与改进[J]. 计算机工程与设计,2010,31(10): 2169-2256


[2]方琼琼,李正平. 基于Rt-thread的嵌入式串口服务器的设计与实现[J]. 电脑知识与技术,2012,8(10):2425-2428


[3]陈希超,王健. 基于RT-Thread的嵌入式网络通信[J]. 电声技术,2012,36 (12):49-56


[4]杨俊,吕建平,徐峰柳. 基于uC/OS-II和LwIP的嵌入式Web服务器实现[J]. 电气自动化,2011,33(3):62-64


[5]赵国锋,马文武. 基于LWIP的嵌入式网络系统设计与实现[J]. 微计算机信息, 2008,24(8-2):59-61


[6]songhexin8, STM32F107中国版用户手册[EB/OL][2012-12-06]. http://wenku.baidu.com/link?url=EFDU6p5iPaoci3mzJ2tuIZeBX2av1kMKc41_nYDXF4Ow4F0tOlf6QtxaweJ94hHYa5fEVL0wo67NMMs7bySVm_coWhCitXFfKRlCjfH-NZa


[7]高吉星,赵强,佟为明.基于ENC28J60的TMS320F2812以太网通信接口设计[J]. 计算机测量与控制,2013,21 (3):709-711


[8]啊左不是蜗牛, UC/OS-II学习笔记--STM32移植[EB/OL][2012-12-29].


推荐阅读

史海拾趣

贝特莱公司的发展小趣事

深圳贝特莱电子科技股份有限公司成立于2011年7月,从一开始,公司就明确了以技术研发为核心的发展战略。依托专业团队多年的行业资源积累,贝特莱致力于开发具有自主知识产权的核心技术。在指纹识别、触控、生命感知及MCU等芯片领域,贝特莱不断取得突破,为后续的市场拓展奠定了坚实的基础。

CBM_America_Corporation公司的发展小趣事

随着环保意识的提高,CBM_America_Corporation开始关注自身的社会责任和可持续发展。公司积极采用环保材料和生产工艺,减少了对环境的污染。同时,CBM还参与了多项公益事业,为社会做出了积极贡献。这些举措不仅提升了公司的社会形象,还吸引了更多消费者的关注和支持。在可持续发展的道路上,CBM不断前行,为电子行业的绿色发展树立了榜样。

这些故事虽然是虚构的,但它们反映了电子行业中公司可能经历的一些典型情况和挑战。您可以根据这些故事框架进行进一步的创作和修改,以适应您特定的需求和背景。

Cincon公司的发展小趣事

1991年,Cincon公司在台湾成立,标志着其在电子行业的起步。公司创立之初,便在台北设立了销售办事处,同时在彰化建立了工厂,专注于电源产品的设计与生产。创立的第二年,Cincon便开始设计和制造DC/DC转换器和电池充电器,这为其在电源行业奠定了坚实的基础。随着市场需求的不断增长,公司于1997年开始涉足交流/直流开关电源的设计与制造,进一步扩大了产品线。

DURACELL公司的发展小趣事

DURACELL公司自成立以来,一直致力于提供高品质的电池产品。公司不断投入研发资源,推动电池技术的创新。金霸王碱性电池以其“卓越品质,持久电力”的出众品质行销全球近百个国家和地区。此外,DURACELL公司还积极拓展产品线,生产和销售锂电池等高性能电池产品,以满足不同领域的需求。

Forge Europa Ltd公司的发展小趣事

随着技术实力的不断增强,Forge Europa Ltd公司开始将目光投向国际市场。公司积极参与国际展会,与全球客户建立联系,并通过优化供应链管理,确保产品能够迅速响应国际市场需求。在欧洲市场,Forge Europa凭借其高品质的产品和专业的服务,迅速赢得了众多知名客户的青睐。同时,公司还不断拓展北美、亚洲等新兴市场,逐步建立起覆盖全球的销售网络。

芯邦(Chipsbank)公司的发展小趣事

在全球半导体市场竞争日益激烈的背景下,芯邦科技面临着来自国际巨头的挑战。然而,公司凭借在半导体设计领域的深厚积累和不断创新的精神,逐步形成了自己的核心竞争力。同时,芯邦也积极寻求与国际合作伙伴的合作机会,共同推动半导体产业的发展。

以上五个故事简要概述了芯邦科技在电子行业中的发展起来的关键节点和里程碑事件。这些故事不仅展现了芯邦科技在技术创新、产品线拓展、资本运作、市场表现和国际竞争等方面的努力和成就,也预示着公司未来发展的广阔前景和无限可能。

问答坊 | AI 解惑

8051单片机中DPTR的扩展设计

摘要 首先对比分析在执行大规模数据转移时,传统805l单片机和进行DPTR扩展后的805l单片机在数据转移执行效率上的差别。通过详细分析DPTR操作所涉及的因素,具体实现对DPTR的扩展,并进行实际仿真测试。 关键词 805l单片机DPTR 数据转移执行效率 ...…

查看全部问答>

No printer Installed Altium Designer winter09 输出PDF出错

Altium Designer 有个软件自带的功能 就是能输出原理图为PDF格式文件 具体操作是 文件--智能PDF 可是我的为什么总是在输出的时候出错呢 如下图: 提示 No printer Installed 而且生成的PDF是空白,什么都没有 请问有知道怎么解决 ...…

查看全部问答>

书籍转载--嵌入式硬件设计

书籍转载--嵌入式硬件设计 …

查看全部问答>

新产品快递High-Side Current Monitors Simplify Measurement at High Voltage

Diodes’ High-Side Current Monitors Simplify Measurement at High Voltage Diodes Incorporated has introduced a family of 6 high reliability current monitors for 40V and 60V operation.  The ZXCT108X devices dete ...…

查看全部问答>

串口转并口

我有一款串口刻录机,但主板只支持并口,怎样转换一下,能把串口刻录机连接到并口主板上, …

查看全部问答>

evc 4.0 下 调用软件盘

在evc4.0下 如何调用软键盘       头文件里已经包含了  #include \"Sipapi.h\"    在Edit获得焦点,和失去焦点是这样写的 void student::OnSetfocusEdit1() {         HWND m_h ...…

查看全部问答>

2440 nandflash 启动问题

从nandflash启动,RAM应该有前面4k与nand相同。可是却在ram里从200h有66个字节为FF。后面又一样了。后来烧了个大点的程序到nandflash,每隔200h就会有66个字节为FF。不知何故,求高手帮忙分析分析。…

查看全部问答>

求助!U-boot内核无法读取

开发板是SEED-L138 内核也是用厂商自带的,通过tftp下载到板子,成功, 可是不能bootm ---------------------------------------------------- Hit any key to stop autoboot:  0Us ...…

查看全部问答>

【低功耗】不能不知道的FPGA系统设计的3原则

一.面积与速度的平衡互换原则二.硬件可实现原则三. 同步设计原则…

查看全部问答>

LED 驱动电源

   相了解LED方面知识的人,来学习下这个吧.资料蛮全面的…

查看全部问答>