Freescale MCF51CN128 ColdFire V1
包含 uIP 嵌入式 Web 服务器示例
[嵌入式以太网示例]
本页展示的演示使用:
- CodeWarrior,用于微控制器 V6.2.2 或更高版本。 提供免费的 CodeWarrior “特别”版。
- Freescale Tower 开发系统
- Adam Dunkels 开源 uIP 嵌入式 TCP/IP 堆栈。
uIP 是由 Adam Dunkels 编写的 TCP/IP 实现,小巧而又简单。 MCF51CN128
演示应用程序使用的配置仅占 8.3 K 字节的闪存空间。
uIP 与 FreeRTOS 分开授权。 用户必须熟悉 uIP 许可证。
自此演示创建以来,FreeRTOS 已对 uIP 堆栈做了一些修改。 详情请参阅嵌入式以太网示例列表页面。
Freescale 还为使用 lwIP 的 FreeRTOS
演示提供源代码以及全面的应用说明。
重要提示!关于使用 ColdFire V1 web 服务器演示的注意事项
使用此 RTOS 移植之前,请阅读以下所有要点。
- 源代码组织
- 演示应用程序
- RTOS 配置和使用详情
另请参阅常见问题:我的应用程序未运行,问题可能出在哪里?
源代码组织
MCF51CN128 演示的 CodeWarrior 工作区位于 FreeRTOS/Demo/ColdFire_MCF51CN128_CodeWarrior 目录中。
下载的 FreeRTOS zip 文件包含所有移植文件和演示应用程序项目文件。因此,该文件所含文件
远超此演示所用的文件。请参阅源代码组织部分,获取已下载文件的描述以及关于创建新项目的信息
。
演示应用程序
web 服务器配置
演示所用的 IP 地址由
FreeRTOS/Demo/ColdFire_MCF51CN128_CodeWarrior/Sources/FreeRTOSConfig.h 中的常量 configIP_ADDR0 至 configIP_ADDR3 设置。 MAC 地址和网络掩码配置
在同一头文件中。
运行 web 浏览器的计算机使用的 IP 地址必须和 ColdFire 开发板使用的 IP 地址相兼容。
为此,可以将二者 IP 地址中的前三个八进制数设置成相同的值。
例如,如果运行 Web 浏览器的计算机的 IP 地址是
192.168.100.1,那么开发板的 IP 地址可以使用 192.168.100.2 到 192.168.100.254 范围内的任何地址
范围内的任何地址(网络中已存在的地址除外)。
打开演示应用程序项目
从 CodeWarrior �File� 菜单中选择 �Open�, 然后定位到 FreeRTOS/Demo/ColdFire_MCF51CN128_CodeWarrior 并打开
RTOS Demo.mcp。 请注意,这是项目文件而非工作区文件,因此请勿使用“打开工作区”菜单项。
注意: CodeWarrior 通常认为它比您更了解您需要创建哪些文件,
同时会将项目中包含的 port.c 和 portasm.S
文件从 ColdFire V1 版本改为 x86 版本。 如果在编译任一文件时输出许多错误,
则将这两个文件从项目中移除,
然后重新添加位于
FreeRTOSSourceportableGCCColdFire_V1 目录的 port.c 和 portasm.S 文件。
项目文件夹组织
项目源文件分为以下几组:
- FreeRTOS:包括 FreeRTOS 源文件,此类源文件本身又包含 queue.c、tasks.c、list.c、
port.c 以及 portasm.S。
- 常见演示任务:包含定义一组示例任务的源文件。该组示例任务用于所有
FreeRTOS 演示。 这些任务只用来提供如何使用 FreeRTOS API 以及如何测试
FreeRTOS 移植的示例。
- uIP:包含 uIP TCP/IP 堆栈的源代码。 请注意,uIP 与
FreeRTOS 分开授权,并使用自由的 BSD 许可。
- httpd:基本 HTTP 服务器的实现,包括一个简单的 CGI 脚本接口。
构建和下载演示应用程序
- 在 FreeRTOSConfig.h 内设置 IP 地址和 MAC 地址。
- 从 CodeWarrior 的 �Project� 菜单中选择 �Bring Up To Date�。 源代码生成和链接过程中不要出现错误或警告
。
- 使用 P&E Micro USB BDM 接口或
直接使用 Tower 硬件内含的开源 BDM 接口,将您的主机电脑连接到该 Tower 评估硬件。 确保
CodeWarrior IDE 中显示的接口与实际使用的接口匹配,
如下图中的红色高亮所示。
选择调试接口
- 单击绿色速度调试按钮(在上图中以蓝色高亮显示),
将应用程序编程到微控制器闪存中并启动调试会话。
功能性
此演示可创建 24 个任务,如下所示:
- 闪存任务:控制 LED 2、LED 3 和 LED 4,是非常简单的“闪存”任务。 各 LED
将以各不相同的固定频率闪烁。 这些简单任务旨在提供应用程序执行过程中的
一些视觉反馈。
- uIP 任务:此任务执行 uIP TCP/IP 堆栈并实现简单 web 服务器。
- 注册测试任务:此类任务使用已知值反复填充 MCU 寄存器,
然后检查已知值是否仍存在于预期位置。 此类任务以最低优先级运行,因此将定期被抢占
。 它们用于测试上下文切换是否正常运行。
- 其他所有任务:此类任务都属于 �common 演示任务,并非特定于
MCF51CN128 演示。 它们用于演示 FreeRTOS API 并测试 FreeRTOS 移植,
但不实现其他功能。
每个常见的演示任务包括自检机制,该机制将检测非预期的行为或错误行为。 每
5 秒,tick 钩子函数(该函数在
RTOS tick 中断中调用)将询问每个标准演示任务以确定系统状态。 可以通过
web 浏览器的“任务状态”页面查看系统状态。
uIP 和嵌入式 web 服务器
uIP 旨在最小化 RAM 的使用。 它通常定义单个缓冲区,
然后将其用于接收和传输。 缓冲区大小可以减少到几百个字节,
但这样的操作会严重影响性能。 在此演示中, uIP 不定义自己的缓冲区,而是重复使用
FEC 驱动器分配的 DMA 缓冲区,从而实现零拷贝操作。
当 UIP 使用极小的 RAM 时,会对吞吐量施加一定限制,
因为在任一时刻网络都只能容纳一个传输中的数据包。 当使用 uIP
与实现延迟 ack 策略的 TCP/IP 堆栈通信时,这一影响最为显著。 在其标准配置中,这可能会导致数据包之间产生
200 毫秒的延迟。有几种方法可以大大提高性能。 一种方法是每个数据包发送两次,
进而强制对等体作出即时肯定应答。 这显然会增加网络流量,
但如果(如在本例中)使用 DMA,那么对微控制器所需的处理产生的影响可忽略不计
。 另一种方法是将每个数据包拆分为两个较小的数据包,然后再次强制对等体作出即时肯定应答
。 该操作可以在驱动器级别完成,并且对用户透明;然而,
由于所需的校验和计算量会增加一倍,因此处理开销会增大。 本演示使用第一种方法。
web 服务器的使用
连接到 web 服务器之前,首先需要选用合适的以太网线缆。 如果通过集线器进行连接,
则应使用标准线缆。 当要在没有集线器的情况下进行直接连接时,则应使用交叉(点对点)线缆
。
在 web 浏览器的地址栏中输入 �http://192.168.0.5�,将此示例 IP 地址替换为在
FreeRTOSConfig.h 中实际分配的 IP 地址。
MCF51CN128 提供的页面位于
FreeRTOS/Demo/ColdFire_MCF51CN128_CodeWarrior/Sources/httpd/httpd-fs 目录下。 随后,使用
makefsdata Perl 脚本(其本身位于 httpd 目录中)将 web 内容转化为常量结构体。 常量结构体内置于程序映像中,
因此服务页面中的更改需要重新构建。
服务任务状态页面
任务状态页面显示一个表格,该表格包含每个任务的状态、
页面刷新次数以及整个系统状态(来自检查函数)等信息。 该页面每隔几秒钟自动刷新一次
。
每个任务都会显示以下信息:
- 名称:创建任务时为任务指定的名称。
- 状态:表示任务的状态,如下所示:
- 'B',锁定,
- 'R',就绪,
- 'S',挂起或
- 'D',清除(等待清理)。
- 优先级:任务当前执行的优先级。
- 堆栈:显示任务堆栈的“高水位线”。表示任务生命周期内可用堆栈的最小数量
。 该值越接近 0,
任务就越接近溢出堆栈。
- 编号:分配给每个任务的唯一编号。 当多个任务分配了相同的名称时,该编号可用于识别任务。除此之外,
该编号没有其他用途。
服务的 IO 页面
IO 页面可用于简单演示 uIP CGI 脚本功能。 它允许使用
web 浏览器对 LED1 进行查询和设置。
RTOS 移植专用配置
此演示的特定配置项目位于 FreeRTOS/Demo/ColdFire_MCF51CN128_CodeWarrior/Sources/FreeRTOSConfig.h。 可根据您的应用程序编辑此文件中定义的常量
在本文件中定义的常量,以适配您的应用程序。 特别是-
每个移植 # 定义 'BaseType_t' 等于该处理器的最有效数据类型。 本移植将
BaseType_t 定义为长整型。
请注意,vPortEndScheduler() 尚未实现。
中断服务程序
中断服务例程没有特殊要求,可以按照编译器文档进行编写
。
提供 portEND_SWITCHING_ISR(),以允许中断服务程序请求上下文切换。
在中断导致任务解除阻塞,并且解除阻塞的任务的优先级高于当前执行的任务的情况下,
这将是理想的选择。 在这种情况下,从中断服务程序调用 portEND_SWITCHING_ISR()
将导致中断直接返回解除阻塞的任务。
有关完整示例,请参阅 FreeRTOS/Demo/ColdFire_MCF51CN128_CodeWarrior/Sources/FEC.c 中定义的名为 vFECISRHandler()
的中断处理程序。
在抢占式和协同式 RTOS 内核之间切换
将 FreeRTOS/Demo/ColdFire_MCF51CN128_CodeWarrior/Sources/FreeRTOSConfig.h 中的定义 configUSE_PREEMPTION 设置为 1,即可使用抢占式内核;设置为 0,
则可使用协同式调度。
编译器选项
与所有的端口一样,使用正确的编译器选项至关重要。 若要确保这一点,
最佳方法是基于提供的演示应用程序文件构建您的应用程序。
内存分配
演示应用程序项目中内置 Source/Portable/MemMang/heap_2.c,
以提供 RTOS 内核所需的内存分配。
请参阅 API 文档的内存管理部分,
获取完整信息。
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.