下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

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 移植之前,请阅读以下所有要点。

  1. 源代码组织
  2. 演示应用程序
  3. 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 脚本接口。


构建和下载演示应用程序

  1. 在 FreeRTOSConfig.h 内设置 IP 地址和 MAC 地址。

  2. 从 CodeWarrior 的 �Project� 菜单中选择 �Bring Up To Date�。 源代码生成和链接过程中不要出现错误或警告 。

  3. 使用 P&E Micro USB BDM 接口或 直接使用 Tower 硬件内含的开源 BDM 接口,将您的主机电脑连接到该 Tower 评估硬件。 确保 CodeWarrior IDE 中显示的接口与实际使用的接口匹配, 如下图中的红色高亮所示。


    选择调试接口

  4. 单击绿色速度调试按钮(在上图中以蓝色高亮显示), 将应用程序编程到微控制器闪存中并启动调试会话。


功能性

此演示可创建 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 配置和使用详情

RTOS 移植专用配置

此演示的特定配置项目位于 FreeRTOS/Demo/ColdFire_MCF51CN128_CodeWarrior/Sources/FreeRTOSConfig.h。 可根据您的应用程序编辑此文件中定义的常量 在本文件中定义的常量,以适配您的应用程序。 特别是-
  • configTICK_RATE_HZ

    可通过该常量设置 RTOS tick 的频率。 提供的数值 1000 Hz 可用于 测试 RTOS 内核功能,但这超过了大部分应用程序的频率要求。 降低此值可提高效率。

  • configKERNEL_INTERRUPT_PRIORITY 和 configMAX_SYSCALL_INTERRUPT_PRIORITY

    请参阅 RTOS 内核配置文档, 获取关于此类配置常量的完整信息。 不建议更改 ColdFire V1 core 上这两个常量的默认值。

每个移植 # 定义 '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.