下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

Microsemi(原 Actel)SmartFusion A2F200M3F 演示
使用 IAR 和 Keil(包括带有 CGI 脚本的嵌入式 Web 服务器)
[嵌入式以太网示例]


Microsemi SmartFusion A2F200M3 Evaluation Board A2F-EVAL-KIT
SmartFusion A2F-EVAL-KIT 评估套件



本页记录的 FreeRTOS ARM Cortex-M3 演示应用程序面向 Microsemi(原 Actel) SmartFusion 混合信号 FPGA(集成了 ARM Cortex-M3 微控制器子系统)

FreeRTOS 包括用于 IAR、Keil 和 GCC 编译器的 ARM Cortex-M3 移植。 本页 为 IAR Embedded Workbench、Keil MDK 和 SoftConsole (Eclipse) IDE 提供了针对 SmartFusion 的演示应用程序项目。本页提供的说明仅适用于 IAR 和 Keil IDE 的使用。 如需了解如何使用 SoftConsole Eclipse IDE,请参阅另外的页面

IAR 和 Keil 项目已预先配置为 在 A2F-EVAL-KIT SmartFusion 评估板上运行。

注意: 如果此项目未能使用IAR工具生成,则可能是IAR Embedded Workbench 版本过低造成的。 如果构建失败, 那么也可能是项目文件(在无提示的情况下)已经损坏,因此需要 还原到原始状态,然后使用新版本的 IAR 构建项目。

本页还举例说明如何实现嵌入式 Web 服务器。 这需要用到改良版 微型 uIP TCP/IP 堆栈。 TCP/IP 堆栈代码名为 FreeTCPIP,对其修改之后,可实现 比使用原始代码更高的吞吐量。 动态网页会显示 RTOS、TCP/IP 和任务运行时间统计信息, 此类网页使用标准 uIP CGI 脚本工具创建和提供。

uIP 最初由 Adam Dunkels 编写。 uIP 为开源代码, 但已与 FreeRTOS 分开获得许可。 用户必须熟悉 uIP 许可,详见各 uIP 源文件的顶部。


重要!使用 FreeRTOS IAR 和 Keil SmartFusion 示例项目注意事项

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

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

源代码组织

SmartFusion A2F 演示的IAR Embedded Workbench 工作区名为 RTOSDemo_IAR.eww,位于 FreeRTOS/Demo/CORTEX_A2F200_IAR_and_Keil 目录中。

SmartFusion A2F 演示的 Keil MDK 项目名为 RTOSDemo_Keil.uvproj,也位于 FreeRTOS/Demo/CORTEX_A2F200_IAR_and_Keil 目录中。

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


SmartFusion A2F 演示应用程序

功能

IAR 和 Keil 项目各自包含三项构建配置:

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

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

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

Blinky 构建配置使用 main-blinky.c 源文件。 另外两个构建配置则使用 main-full.c 源文件。


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

Full 构建配置创建的任务和定时器 与 Blinky 构建配置创建的相同。 除此之外, Full 构建配置还会根据 标准演示 。 标准演示任务并不执行任何特定函数。 其目的首先是测试 FreeRTOS 移植,其次是 举例说明如何使用 FreeRTOS API 函数。

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


Full_with_optimisation Full_with_optimisation 构建配置的函数 与 Full 构建配置的功能相同。 两者之间的唯一区别在于 编译器优化设置。



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

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

    每次检查定时器过期时,其关联的回调函数 都会查询所有正在运行的标准演示任务的状态。 如有任何查询状态 返回为“失败”,则检查定时器的周期 会从其原始设置的 3 秒缩短到 500 毫秒。

    检查定时器回调在每次执行时都会切换为 LED D8。 因此, 如果 LED D8 每三秒切换一次,则表示未发现错误。 如果 LED D8 每 500 毫秒切换一次,则表示至少有一个标准演示任务 报错。 可以使用嵌入式 Web 服务器查看 报错的标准演示任务的名称,该名称显示在 “任务统计”网页底部的任务统计表下方。

  • uIP 任务

    所有与 TCP/IP 相关的处理都包含在 uIP 任务中。 闪存和 RAM 占用空间(TCP/IP 堆栈)非常小 (与其他嵌入式 TCP/IP 实现相比)。

  • OLED 任务

    OLED 任务可在 两行 OLED 之间滚动消息。


Web 服务器配置

演示应用程序包括嵌入式 Web 服务器。 Web 服务器使用固定 IP 地址, 该地址设置为常量 configIP_ADDR0 到 configIP_ADDR3。 有关这些常量的定义,请参阅 FreeRTOSConfig.h 头文件底部附近,该文件 与 IAR 和 Keil 演示项目文件位于同一目录中。 定义 MAC 地址和网络掩码的常量位于同一 头文件中。

SmartFusion 设备上运行的 Web 服务器所使用的 IP 地址 与用于连接 Web 服务器的 Web 浏览器必须 彼此兼容。 为实现兼容性,请确保 两个 IP 地址的前三个八位字节相同。 例如,如果运行 Web 浏览器的计算机的 IP 地址是 10.10.10.1,则可为 SmartFusion 设备提供 10.10.10.2 至 10.10.10.254 范围内的任何 IP 地址, 同一网络中已经存在的 IP 地址除外。

分配给 SmartFusion 设备的 MAC 地址 在设备所连接的网络上必须具有唯一性。


硬件设置

本节将介绍 将应用程序编程到 ARM Cortex-M3 闪存所需的硬件设置。 假设 FPGA 架构和 ACE 已正确配置, 常见于出厂配置未发生更改。 但是,如果 FPGA 架构 或 ACE 配置已更改,并且您发现 演示应用程序无法正确执行,则建议使用 A2F-EVAL-KIT 提供的 .pdb 文件 恢复 FPGA 架构和 ACE 配置。
  1. 确保跳线 JP7 和 JP10 分别设置到 RVI 和 M3 位置。

  2. 如果使用的是 IAR Embedded Workbench,请将 J-Link 调试器接口连接到标有 "RVI-HEADER" 的连接器。

    如果使用的是 Keil MDK,则请将 U-Link 调试器 接口连接到标有 "RVI-HEADER" 的连接器。

  3. 使用以太网电缆将 A2F-EVAL-KIT 硬件连接到 运行标准 Web 浏览器的计算机。 这需要 通过使用交叉(点对点)以太网电缆直接完成, 或者通过集线器/交换机使用标准以太网电缆完成。 在演示开发过程中 只测试了直接连接选项,但两种方法 应该都奏效。

  4. 使用 USB 连接器 J14 为 A2F-EVAL-KIT 供电。


使用 IAR 工具构建和执行演示应用程序

  1. 打开 RTOSDemo_IAR.eww Embedded Workbench 工作区 (从 Embedded Workbench IDE 中打开)。

  2. 如果希望使用嵌入式 Web 服务器,请选择 Full 或 Full_with_optimisation 构建配置。 如果希望从非常简单的示例入手, 请选择 Blinky 构建配置。

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

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


使用 Keil 工具构建和执行演示应用程序

  1. 从 Keil IDE 中打开 RTOSDemo_Keil.uvproj 项目。

  2. 如果希望使用嵌入式 Web 服务器,请选择 Full 或 Full_with_optimisation 构建配置。 如果希望从非常简单的示例入手, 请选择 Blinky 构建配置。 (构建配置 在 MDK 环境中称为“目标” )。

  3. 从 IDE 的 "Project" 菜单中选择 "Build Target", 演示应用程序应能成功构建,没有错误。

  4. 构建完成后,从 IDE 的 "Debug" 菜单中选择 "Start/Stop Debug Session" (或直接按 CTRL+F5),即可对微控制器闪存进行编程, 然后启动调试会话。


演示功能

如果演示应用程序正确执行,其表现如下:

  • 标记为 D1、D2 和 D3 的 LED 处于标准演示 “闪烁”任务的控制之下。 每个 LED 都将以固定频率切换,其中 LED D1 使用 最快频率,LED D3 使用最慢频率。

  • 标记为 D4 和 D5 的 LED 可以使用 Web 浏览器 以交互方式打开和关闭。 由嵌入式 Web 服务器提供服务的 "IO" 页面 提供了执行此操作的功能。

    "IO" 页面还会显示 连接到标有 50K_POT 的电位器(安装在开发板上 OLED 的旁边)的 模拟输入端口原始读数。

  • 标记为 D6 的 LED 处于队列接收任务的控制之下。 每次队列接收任务收到一个值时 队列接收任务收到一个值,它都将按照 此 LED 将切换一次。

  • 按下按钮 SW1 时,标记为 D7 的 LED 将亮起(假设 其尚未亮起)。 上次按下 SW1 5 秒后, LED 软件定时器将再次关闭 LED D7。

  • 标记为 D8 的 LED 处于“检查”软件定时器的控制之下。 如果没有报错,D8 将每 3 秒切换一次, 如果标准演示任务报错,则每 500 毫秒切换一次。

  • "www.FreeRTOS.org" 将在两行 OLED 之间滚动, 下面一行文字超出上面一行文字五个字符。

  • 集成 Web 服务器可为标准 Web 浏览器 提供下述网页。 要连接到目标,请执行下列操作:

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


      在浏览器中输入 IP 地址
      (当然,根据您的系统,使用正确的 IP 地址)


服务的网页

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

显示 RTOS 统计信息的 FreeRTOS SmartFusion Web 服务器

SmartFusion Web 服务器提供的 RTOS 统计信息页面
显示了系统中各任务的状态信息。


显示 RTOS 运行时间的 FreeRTOS SmartFusion Web 服务器

SmartFusion Web 服务器提供的运行时间统计信息页面
显示了各任务的处理器利用率。

提供的 IO 页面

可利用 IO 页面提供的简单界面,通过 Web 浏览器打开和关闭两个 LED。 该页面还显示评估板上 OLED 旁边的 50K 电位器的 当前原始模拟输入读数。 点击 "Update IO" 按钮可将变更发送到目标板。 每次点击 "Update IO" 按钮或刷新所提供的网页时, 都会更新 IO 页面上显示的值。

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



RTOS 配置和使用详情


Cortex-M3 FreeRTOS 移植特定配置

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

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

  • configKERNEL_INTERRUPT_PRIORITY 和 configMAX_SYSCALL_INTERRUPT_PRIORITY

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

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

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

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

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


中断服务程序

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

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

此演示项目提供了 FreeRTOS 中断服务程序示例, 即在 main-full.c 和 main-blinky.c 中定义的 GPIO8_IRQHandler() 以及 以太网 MAC 中断处理程序。

只有以 "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 位于 SmartFusion A2F 演示应用程序项目中,以提供 RTOS 内核所需的内存分配。 请参阅 API 文档的内存管理部分, 以获取完整信息。


其他事项

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




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