下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

内核
最新资讯
简化任何设备的身份验证云连接。
利用 CoAP 设计节能型云连接 IoT 解决方案。
11.0.0 版 FreeRTOS 内核简介:
FreeRTOS 路线图和代码贡献流程。
使用 FreeRTOS 实现 OPC-UA over TSN。

WIZnet I2C TCP/IP 演示
[嵌入式以太网示例]

WEBHW.jpg

此处提供的嵌入式 Web 服务器实现使用硬件 TCP/IP 协处理器。 本演示是目前可供下载的 4 个嵌入式以太网演示之一。

标准 FreeRTOS 演示应用程序旨在作为参考和新应用程序的入门。 除标准演示之外,此演示中还包含此嵌入式 Web 服务器演示,以提供更针对于应用程序的示例。

此应用程序不包含功能齐全的 Web 服务器,但提供了一个可工作的、抢占式的、多任务的示例,其中包括 中断驱动的 I2C 驱动程序和中断驱动接口 (带 WIZnet W3100A TCP/IP 协处理器)。


实现的详细信息

嵌入式计算机

TCP/IP 和以太网接口板是连接到 LPC-P2106 ARM7 原型板的扩展端口的简单 PCB。


RTOS 移植和 ARM7 开发工具

此嵌入式 Web 服务器演示使用标准FreeRTOS LPC2000 移植 GNUARM GCC 开源开发工具编写。

处理器在可能的情况下以 THUMB 模式运行。


源文件

项目 makefile 包含在 Demo/WizNET_DEMO_GCC_ARM7 目录中。 请参阅源代码组织章节,获取 FreeRTOS 目录结构体和 ARM7 GCC 移植页面的完整说明, 以了解关于使用开发工具的更多信息。

下载内容包括以下文件:

  • main.c - 初始化硬件,创建演示应用程序任务,然后启动 RTOS 调度器。

  • http_serv.c - 处理套接字创和建传入连接的顺序。 这是一个非常简单的文件。

  • tcp.c - 处理服务器任务和 WIZnet 模块之间的所有消息。 请参阅 WIZnet W3100A 数据表。

  • tcpISR.c - 包含中断服务程序,该程序处理源自 WIZNet TCP/IP 事件的外部中断。 它在一个单独的文件中,因为它必须在 ARM 模式下运行。

  • i2c.c - i2c 驱动程序实现。

  • i2cISR.c - i2c 中断服务程序。 它必须在一个单独的文件中,因为它在 ARM 模式下运行。

  • html_pages.h - 包含作为服务页面的静态部分发送的字符串。

此外,还需要标准演示应用程序中的 flash.c 文件。


操作原理

演示应用程序任务。

此演示可创建 18 个任务,包括 15 个标准演示任务、嵌入式 Web 服务器任务、错误检查任务和空闲任务。 HTTP 服务器任务是最高优先级,因此每次出现 i2C 中断或来自 WIZnet W3100A 设备的外部中断时, 它都会优先执行任何其他任务。

网络服务器任务:

  1. 初始化 WIZnet 寄存器。

  2. 创建套接字。

  3. 正在侦听连接的块。

  4. 处理一个连接。

  5. 事务完成后关闭套接字。

  6. 然后回到第 1 步重新开始。

Web 服务器任务花费了大部分时间处于阻塞状态,等待来自 WIZnet TCP/IP 处理器或 I2C 外围设备的中断。

这是一个非常基本的实现,一次允许 一个连接,并且在 HTML 页面传输完成后立即关闭连接。


I2C 接口

HTTP 服务器任务通过 I2C 总线与 WIZnet TCP/IP 处理器通信。

I2C 驱动程序管理“消息”池 (请参阅 i2c.h 中定义的 xI2CMessage 结构体)。 当应用程序任务调用 i2cMessage() 时,I2C 驱动程序将用消息详细信息 填充 xI2CMessage 结构体, 然后将新的 xI2CMessage 结构体放入等待执行的 消息队列中。 这样,应用程序任务就可以继续执行,而不必等待I2C消息被事务处理。

I2C 中断程序处理通过 I2C 总线发送/接收数据的外围设备生成的事件。 当一条消息 完成后,它会检查队列,查看是否还有其他消息等待传输。 如果是,则下一条消息将从 队列移除并立即开始传输。

通过使用 i2cMessage() 函数的 xMessageCompleteSemaphore 参数,应用程序任务可以选择等待(阻塞), 直至 I2C 消息被完全处理。 当它被阻塞时,将执行其他任务。 这尤其 与在 I2C 总线上读取数据相关,因为应用程序任务需要知道何时会接收到数据。


WIZnet 接口

WIZnet 设备在需要注意时断言外部中断 EINT0,但是 I2C 接口使 EINT0 中断处理变得复杂。

WIZnet 设备内的 C0_ISR 寄存器用于确定 中断的原因,但 I2C 接口意味着 C0_ISR 无法从中断服务程序内读取 数据。 此外,中断的断言也无法清除,因为这也需要写入 WIZnet 设备, 同样要通过 I2C 总线。

在中断 (EINT0) 仍然被断言的情况下,离开中断服务程序的唯一方法 是禁用微控制器内的 I2C 中断(否则将立即重新进入 中断服务程序)。 在禁用 I2C 中断后,中断服务程序将取消阻塞 Web 服务器任务, 该任务则必须立即读取 C0_ISR 寄存器,清除中断,然后在微控制器中重新启用 I2C 中断。 因此,重要的是,Web 服务器任务是最高优先级任务,从而确保它始终 能在 EINT0 中断后立即执行。

源代码中的注释提供了更多详细信息。






Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.