下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

Kinetis K60 ARM Cortex-M4 演示
使用 IAR 工具链,并包含简单的 Web 服务器
[嵌入式以太网示例]


The TWR-K60N512 controller module and TWR-SER peripheral module in the TWR-K60N512-KIT tower kit
TWR-K60N512-KIT 塔式套件中
的 TWR-K60N512 控制器模块
和 TWR-SER 外设模块

本页记录的 FreeRTOS ARM Cortex-M4 演示应用程序面向 Freescale Kinetis K60 微控制器。 本页提供的 IAR 项目预配置为在 TWR-K60N512 控制器模块上运行。 主要 IAR 工具分发中包含的 FreeRTOS 插件 可用于此演示!

注意:如果项目构建失败,可能是使用的 IAR 嵌入式工作台版本过低。 如果构建失败, 那么也可能是项目文件(在无提示的情况下)已经损坏,因此需要 需要还原到原始状态,才能使用新版本的 IAR 构建项目。

演示应用程序中包括一个示例 Web 服务器,该服务器使用修改后的 微型 uIP TCP/IP 堆栈。该堆栈代码名为 FreeTCPIP,对其修改之后,可实现 比使用原始代码更高的吞吐量。CGI 脚本 用于提供包含 RTOS 和 TCP/IP 运行时间信息的页面。 uIP 最初由 Adam Dunkels 编写,为开源代码, 但已与 FreeRTOS 分开授权。用户必须熟悉 uIP 许可, 该许可位于每个 uIP 源文件的顶部。

TWR-K60N512 本身并不包含以太网连接器, 因此还需要一个 TWR-SER 外设模块 才能使用嵌入式 Web 服务器示例。 这两个模块 可以在 TWR-K60N512-KIT 塔式套件中一起购买。

FreeRTOS 交互式网站还包含由社区贡献的 K60 演示,该演示使用开源 lwIP TCP/IP 堆栈


重要!FreeRTOS IAR Kinetis ARM Cortex-M4 示例项目使用注意事项

使用此 RTOS 移植之前,请阅读以下所有要点。

  1. 源代码组织
  2. 演示应用程序
  3. RTOS 配置和使用详情
另请参阅常见问题:我的应用程序未运行,问题可能出在哪里?



源代码组织

Kinetis K60 演示的 IAR Embedded Workbench 工作区名为 RTOSDemo.eww,位于 FreeRTOS/Demo/CORTEX_Kinetis_K60_Tower_IAR 目录中。 IAR 的 EWARM V6.20 或更高版本才能打开工作区。

官方 FreeRTOS zip 文件下载包含所有 FreeRTOS 移植 以及每个演示应用程序项目的源代码。 因此,该下载包所包含的文件远多于构建和运行 Kinetis K60 演示所需的文件。请参阅 源代码组织部分, 查阅已下载文件的描述以及关于创建新项目的信息。



Freescale Kinetis K60 演示应用程序

功能

IAR 项目包含两项构建配置:

构建配置 描述
Blinky 此配置非常简单。 本配置会创建两项任务, 一项为创建软件定时器,另一项为使用按钮中断。

这两项任务 通过队列进行通信。 每次接收到一个值时, 接收任务便会切换为蓝色 LED 。

按下用户按钮 SW2 会产生中断。 中断 服务程序 会重置软件定时器,然后打开绿色 LED。 软件定时器的周期为 5 秒。 如果整个 5 秒钟之内没有再次按下 SW2, 定时器会到期。 定时器到期时 执行的回调函数只是 再次关闭绿色 LED。 因此,按下 SW2 会打开 LED, 而且如果没有再次按下按钮,整个 5 秒钟内, LED 一直保持亮起状态。

Blinky 构建配置使用 main-blinky.c 源文件。 Full 构建配置使用 main-full.c 源文件。


Full 这是一个全面的配置,会创建许多任务、 队列、(各种类型的)信号量和软件定时器。

Full 配置创建的任务和定时器 与 Blinky 构建配置创建的相同(虽然使用的 LED 不尽相同)。 除此之外, Full 配置还会根据 标准演示任务集创建许多 任务,另外还会创建一项简单的 Web 服务器任务。

标准演示任务并不执行任何特定函数。 其目的首先是测试 FreeRTOS 移植,其次是 举例说明如何使用 FreeRTOS API 函数。

Full 构建配置还会创建一些定时器, 这些定时器既不属于 Blinky 配置,也不属于标准演示任务集。 本表下方简要介绍了这些额外任务。

Full 配置总共创建了近 40 项任务! 如需 从简单演示入手,请使用 blinky 构建配置。



Full 构建配置可创建如下软件定时器 (既不属于 Blinky 演示,也不属于标准演示任务):

  • “检查”软件定时器和回调

    检查定时器的周期最初设置为 3 秒。 检查定时器 回调函数不仅会检查所有标准演示任务是否仍在执行, 还会检查这些任务是否正在执行但未报错。 如果检查 定时器发现任务已停止或报错, 则会将周期自行从最初的 3 秒更改为仅 200 毫秒。

    检查 定时器回调函数还会在每次调用时 在橙色/红色 LED 间来回切换。 这可以视觉形式指示系统状态: 如果 LED 每 3 秒切换一次,则表示没有发现任何问题。 如果 LED 每 200 毫秒切换一次,则表示至少有一项任务中 发现了问题。

    上次报告的问题会锁定到 pcStatusMessage 变量中, 并显示在嵌入式 Web 服务器任务提供的“任务统计”网页的底部 。

  • 两个共享回调的极简 LED 闪烁定时器

    简单的 LED 闪烁定时器只会 在执行定时器回调函数时切换 LED。 如果两个定时器共享回调函数, 那么回调函数参数可用于确定实际到期的定时器, 从而确定要切换的 LED。 两个定时器使用不同的 频率,一个切换蓝色 LED,另一个则切换绿色 LED。

  • Web 服务器任务

    此任务可运行 uIP TCP/IP 堆栈。所有与网络相关的 处理都在此任务中执行,因此 TCP/IP 闪存和 RAM 占用空间非常小(与其他嵌入式 TCP/IP 实现相比)。 本文档页面下文会进一步演示所提供的网页



硬件设置

除 Web 服务器外,所有演示功能都将在 TWR-K60N512 塔式处理器模块上以默认配置运行。 如果使用的是 TWR-K60N512,而不是塔式套件的其它部分, 则 J6 必须穿过引脚 2 和 3。

本演示是使用 J-Link(用于调试模块,并为其供电)创建和测试的。 从 J-Link 为模块供电 需要安装跳线 J12。 利用此配置,可将终端 IO (printf()) 发送到 IAR Embedded Workbench IDE 内的终端 IO 窗口。

要使用 Web 服务器,还需要 TWR-SER 模块,并且 TWR-SER 和 TWR-K60N512 模块都需要将跳线从其默认位置移开。 这需要更改跳线,因为演示配置为 使用 RMII 模式与 PHY 通信,这反过来又要求路由到 PHY 的时钟 与路由到 K60 的时钟保持同步。 所需跳线位置 如下表所示。 跳线位置不正确可能会导致 网络功能缓慢且不稳定。

模块 跳线 所需位置
TWR-K60N512 J6 穿过引脚 2 和 3
TWR-SER J2 穿过引脚 3 和 4
TWR-SER J3 穿过引脚 2 和 3
TWR-SER J12 仅穿过引脚 9 和 10 (仅安装一个跳线)。


Web 服务器配置

微控制器板使用的 IP 地址由常量 configIP_ADDR0 到 configIP_ADDR3 设置。这些常量 在位于项目目录中的 FreeRTOSConfig.h 头文件的底部指定。定义 MAC 地址和 NET 掩码的常量 位于同一文件的同一位置。

Web 浏览器和 Kinetis K60 开发板使用的 IP 地址必须 兼容。为此,可以将二者 IP 地址中的前三个八进制数 设置成相同的值。例如,如果运行 Web 浏览器的计算机使用的 IP 地址为 192.168.0.1,则可以为 Kinetis K60 开发板指定 192.168.0.2 到 192.168.0.254 范围内的任何地址 (同一网络上已经存在的地址除外)。

分配给 Kinetis K60 的 MAC 地址 在其所连接的网络上必须具有唯一性。

Web 服务器演示的开发和测试使用的是点对点(交叉) 线缆。 标准以太网线缆也可能适用,但未经测试。


演示应用程序的构建和执行

  1. 从 Embedded Workbench IDE 中打开 RTOSDemo.eww Embedded Workbench 工作区 。

  2. 选择所需的构建配置。

  3. 从 Embedded Workbench 的 "Project" 菜单中选择 "Build All", 演示应用程序的构建不应出错。

  4. 构建完成后,从 Embedded Workbench 的 "Project" 菜单中选择 "Download and Debug" (或直接按 CTRL+D),即可对微控制器闪存进行编程, 然后启动调试会话。 应用程序将开始运行,然后 并在进入 main() 函数时中断。


Web 服务器的使用

每个提供的页面顶部都包含一个菜单,其中含有指向其他各页面的链接。

  1. 在连接的计算机上打开 Web 浏览器。
  2. 先在浏览器地址栏中输入 "HTTP://",再输入目标 IP 地址。


    在 Web 浏览器中输入 IP 地址
    (使用正确的系统 IP 地址)


提供的网页

Kinetis K60 web server task statistics page
提供的任务统计页面


FreeRTOS ARM Cortex-M4 run time stats page
提供的运行时间统计页面,显示
各任务消耗的 CPU 时间


Free rtos kinetis cortex m4 web server io page using cgi
提供的 IO 页面,用于使用 CGI 脚本打开和关闭 LED


可利用 IO 页面提供的简单界面,通过 Web 浏览器打开和关闭黄色 LED。 点击 "Update IO" 按钮或刷新页面,即可将变更发送到目标板。

提供的其他页面包括 TCP/IP 统计信息和大型 JPG 图像。 所有网页都包含在下载的 二进制图像中,这会使得二进制图像看起来相当大(jpg 文件本身超过 36K)。



RTOS 配置和使用详情


Cortex-M FreeRTOS 移植特定配置

此演示特定的配置项位于 FreeRTOS/Demo/CORTEX_Kinetis_K60_Tower_IAR/FreeRTOSConfig.h 中。 您可以编辑此文件中定义的常量,确保适配您的应用程序。 特别是:
  • configTICK_RATE_HZ

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

  • configKERNEL_INTERRUPT_PRIORITY 和 configMAX_SYSCALL_INTERRUPT_PRIORITY

    请 参阅 RTOS 内核配置文档,获取这些配置常量的完整信息。

  • configLIBRARY_LOWEST_INTERRUPT_PRIORITY 和 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY

    这些常量等效于 configKERNEL_INTERRUPT_PRIORITY 和 configMAX_SYSCALL_INTERRUPT_PRIORITY,但以 适合传递到 Freescale set_irq_priority() 库函数的形式呈现。 set_irq_priority() 函数要求 优先级在 0 到 15 的范围内(0 为最高优先级,15 为最低优先级)。

    不得从优先级高于 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 定义的中断调用中断安全 FreeRTOS API 函数 。 此操作会导致应用程序不稳定。 这是 在 ARM Cortex-M 设备上使用 FreeRTOS 时最常见的错误!

请注意: 请参阅说明如何在 ARM Cortex-M 设备上设置中断优先级的页面。 请记住,ARM Cortex-M 核心中, 数字越小表示中断优先级越高。 这一点 可能有悖直觉,容易混淆! 如果要将 中断设置为低优先级,请不要将其优先级指定为 0(或其他低数值), 因为这会导致该中断在系统中具有 最高优先级,并且如果这个优先级 高于 configMAX_SYSCALL_INTERRUPT_PRIORITY,可能会导致系统崩溃。 另外,请勿忘记 分配中断优先级,因为默认情况下,中断优先级为 0, 这可能导致其处于最高优先级。

ARM Cortex-M 核心上的最低优先级实际上是 255,但不同 Cortex-M 供应商会实现不同数量的优先级位, 提供期望以不同方式指定优先级的库函数。 例如, Kinetis 微控制器上可以指定的最低优先级实际上为 15,这是由 FreeRTOSConfig.h 中的常量 configLIBRARY_LOWEST_INTERRUPT_PRIORITY 定义的。 可指定的最高优先级 始终为零。

我们还建议确保将所有四个优先级位分配为 抢占式优先级位,不要将任何优先级位分配为子优先级位。

每个移植都将 "BaseType_t" 定义为 数据类型。 此移植将 BaseType_t 定义为长类型。


中断服务程序

此演示将中断安装到 vectors.h 头文件内的 向量表中。

与大多数移植不同,引发上下文切换的中断服务程序 无特殊要求,可根据编译器文档编写。 宏 portEND_SWITCHING_ISR() 可用于在 中断服务程序内请求上下文切换。

请注意,portEND_SWITCHING_ISR() 将启用中断。

此演示项目提供了 FreeRTOS 中断服务程序示例, 即在 main-full.c 和 main-blinky.c 中定义的 vPort_E_ISRHandler() 以及 在 emac.c 中定义的三个以太网中断处理程序,分别为 vEMAC_TxISRHandler()、vEMAC_RxISRHandler 和 vEMAC_ErrorISRHandler() 。

只有以 "FromISR" 结尾的 FreeRTOS API 函数可以从 中断服务例程中调用 - 而且中断的优先级须 小于或等于 configMAX_SYSCALL_INTERRUPT_PRIORITY 配置常量设置的 优先级。


FreeRTOS 使用的资源

FreeRTOS 需要独占 SysTick 和 PendSV 中断。 其也使用 SVC 编号 #0。


在抢占式和协同式 RTOS 内核之间切换

RTOSDemo/FreeRTOSConfig.h 内的定义 configUSE_PREEMPTION 设置为 1,可使用抢占式调度; 设置为 0 以使用协作式调度。 选择协作式 RTOS 调度器时,完整的演示应用程序可能 无法正确执行。


编译器选项

与所有的端口一样,使用正确的编译器选项至关重要。 若要确保这一点, 最佳方法是基于提供的演示应用程序文件构建您的应用程序。


内存分配

Source/Portable/MemMang/heap_2.c 位于 K60 演示应用程序项目中,以提供 RTOS 内核所需的内存分配。 请参阅 API 文档的内存管理部分, 以获取完整信息。


其他事项

请注意,vPortEndScheduler() 尚未实现。



ewarm ide with FreeRTOS task and queue plug in windows visible
可以看见带有 FreeRTOS 插件任务和队列的 EWARM IDE 窗口,
将 printf() 输出路由到的终端 IO 窗口同样可见。





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