弁言
嵌入式技能 的鼓起 使得传统的基于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%。
原文链接:https://www.eeworld.com.cn/mcu/article_2016091929510.html