下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

Cortex-A53 Xilinx UltraScale MPSoC
64 位 (AArch64) RTOS 演示
[RTOS 移植]


具有 4 个 64 位 ARM Cortex-A53 核心和 2 个 32 位 ARM Cortex-R5 实时核心的 Xilinx UltraScale MPSoC

Xilinx SDK (软件开发套件)包含创建 FreeRTOS 项目的向导程序, 这些项目是为 Zynq UltraScale MPSoC 上的所有内核创建的,其中包括 ARM Cortex-A53(AArch64,64 位)、ARM Cortex-R5 和 Microblaze 处理器。


简介

本页记录的 FreeRTOS 演示应用程序面向 位于 Xilinx Zynq UltraScale + MPSoC 上的 64 位 ARM Cortex-A53 (AArch64) 内核。 另外还单独介绍了一个针对同一设备上的 ARM Cortex-R5 内核 的类似项目

演示使用独立的 BSP ( 由 SDK 生成的板支持包),并将 FreeRTOS 构建为 应用程序的一部分。 硬件设计项目针对 ZCU102 评估套件。

FreeRTOS 也包含在 Xilinx SDK 包中, SDK 包含为 UltraScale + MPSoC 的 64 位 ARM Cortex-A53、ARM Cortex-R5 和 Microblaze 内核生成 FreeRTOS 的向导程序 。 当 SDK 生成项目时,FreeRTOS 构建为 BSP 的一部分,而不是应用程序的一部分。 还提供了此操作的说明

64 位 ARM Cortex-A53 FreeRTOS 移植可实现完全中断嵌套模型, 并支持浮点单元 (FPU)。



重要提示!使用 FreeRTOS 64 位 ARM Cortex-A53 移植的注意事项

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

  1. 源代码组织
  2. 演示应用程序功能
  3. 构建说明
  4. RTOS 配置和使用详情
另请参阅常见问题:我的应用程序未运行,可能出什么问题? 以及 提供了 ARM Cortex-A 嵌入式处理器 FreeRTOS 使用说明的页面。

源代码组织

FreeRTOS 下载内容包含所有 FreeRTOS 移植的源代码及 演示应用程序。 这意味着它包含的文件比 使用 Zynq UltraScale+ Cortex-A53 MPSoC 移植和演示应用程序所需的文件多得多。 请参阅本网站源代码组织部分, 获取关于已下载文件的说明 和新项目创建的信息。

演示应用程序使用的目录结构如下所示 。 根目录 CORTEX_A53_64-bit_UltraScale_MPSoC 位于 FreeRTOS/Demo

CORTEX_A53_64-bit_UltraScale_MPSoC
  |
  +-RTOSDemo_A53              Contains the SDK project and C files specific to the demo.
  |
  +-RTOSDemo_A53_bsp          Contains the hardware board support package.
  |
  +-ZynqMP_ZCU102_hw_platform The ZCU102 hardware description.

	
与目录结构体有关的注意事项:

  • 包含在 ZynqMP_ZCU102_hw_platform 和 RTOS Demo_A53_bsp 目录中的项目 由 Xilinx SDK 创建。

  • RTOS Demo_A53 目录只包含 Zynq UltraScale + MPSoC 演示的特定源文件。 FreeRTOS 源文件以及 实现所有演示应用程序中常见任务的源文件位于 目录树中的其他位置。 因此,仅当默认目录结构 未改变的情况下可被创建。 另请参阅相关页面,了解 如何在 Eclipse 项目资源管理器中使用虚拟和链接路径



Zynq UltraScale + MPSoC ARM Cortex-A53 演示应用程序

功能

在 main.c 顶部定义的常量 mainSELECTED_APPLICATION, 用于在一个简单的 Blinky 风格的演示和一个更 全面的测试和演示应用程序之间切换。


mainSELECTED_APPLICATION 设置为 0 时的功能

如果 mainSELECTED_APPLICATION 设置为 0,则 main() 将调用 main_blinky(),此函数在 main_blinky.c 中实现。

main_blinky() 创建一个非常简单的演示,包括两个任务和一个队列。 一个任务使用队列将值 100 重复发送到另一个任务。 每次收到消息时, 接收任务会将消息打印到 USB UART 端口 (J83)。 其传输速率为 115200 baud。

消息每 200 毫秒发送到队列,因此消息 每 200 毫秒被打印至 UART。


mainSELECTED_APPLICATION 设置为 1 时的功能

如果 mainSELECTED_APPLICATION 设置为 1,则 main() 会调用 main_full(), 在 main_full.c 中实现。

main_full() 会创建一个综合应用程序,此程序会测试 RTOS 移植, 及演示:

演示创建的大多数任务来自标准演示 任务。 这些任务由所有 FreeRTOS 演示应用程序使用, 除了演示使用中的 FreeRTOS API 和测试 RTOS 端口之外,没有特定的功能或目的。

除了标准演示任务外,还创建了以下任务:

  • 中断嵌套测试任务

    使用两个定时器测试中断嵌套,并测试被嵌套中断使用的 RTOS 队列。

  • 寄存器测试任务

    寄存器测试任务会测试 RTOS 上下文切换机制: 首先使用一个已知和唯一的值来填充每个 ARM Cortex-A53 寄存器(包括浮点寄存器), 然后反复检查最初写入寄存器的值 在任务的有效期内 是否保持在寄存器中。这些任务的性质 决定了它们必须用汇编编写。

  • “检查”任务

    检查任务会定期查询标准演示任务和 注册测试任务,以确保其按预期运行-然后 将状态消息打印到 USB UART (J83)。 其传输速率为 115200 baud。

    在 Zynq UltraScale + MPSoC 上的 64 位 ARM Cortex-A53 内核上执行 RTOS 演示时产生的输出
    完整演示生成的输出


硬件设置

SW6 排上的所有四个开关都需要朝向板的中心设置, 以便能够通过 JTAG 接口下载和执行。



构建说明-使用官方 FreeRTOS 演示

本节介绍如何构建上述演示。 下一节介绍了如何使用 Xilinx SDK 来创建和构建 FreeRTOS 项目。

将演示应用程序项目导入SDK Eclipse工作区

要将 Xilinx 软件开发套件 (SDK) 项目导入现有或新的 Eclipse 工作区:

  1. 从 SDK 的 "File" 菜单中选择 "Import"。 将出现如下所示的 如下对话框。 选择 "General->Existing Project into Workspace",如下所示

    将 XilinxMicroBlazeRTOS 演示项目导入 SDK
    首次点击 "Import" 时显示的对话框


  2. 在下一个对话框中,选择 FreeRTOS/Demo/CORTEX_A53_64-bit_UltraScale_MPSoC 作为根目录。 然后,确保 RTOSDemo_A53RTOSDemo_A53_bspZynqMP_ZCU102_hw_platform 项目在 "Projects" 区内被选中, 并且 勾选,然后单击 "Finish" 按钮(请参阅下图查看正确的复选框状态)。

    将空闲 ARM Cortex-A53 64 位 RTOS 演示源项目导入 Xilinx SDK
    确保勾选所有三个项目,不勾选 "Copy projects into workspace" (将项目复制到工作区)


  3. 导入所有三个项目后, SDK IDE 的项目资源管理器窗口 将显示如下。

    ZynqMP_ZCU102_hw_platform 和 RTOS Demo_A53_bsp 项目是 RTOS Demo_A53 项目的依赖项,因此只需要明确构建 RTOS Demo_A53 项目。

    在 Eclipse 项目浏览器中查看的 ARM Cortex-A53 RTOS 项目。
    导入工作区的所有三个项目


构建演示应用程序

  1. 打开项目的 main.c 文件,并设置 mainSELECTED_APPLICATION, 根据需要生成简单的 blinky 演示,或完整的测试和演示 应用程序。

  2. 在 Eclipse IDE 的 "Project" 菜单中选择 "Rebuild All"。


启动调试会话

  1. 确保 ZCU102 评估板通电, 并使用适当的调试接口将其连接到主计算机。

  2. 确保 SW6 排上的所有四个开关都设置为朝向 板的中心。 由此可启动 JTAG。

  3. 在 IDE 的 "Run" 菜单中选择 "Debug Configurations..."。 屏幕上会 出现调试配置对话框。 双击 "Xilinx C/C++ application (System Debugger)" 创建新的调试 配置。

  4. 如下图所示配置 "Target Setup" 选项卡。

    64 位 ARM Cortex-A53 目标设置选项卡
    Target Setup 选项卡上的所需设置


  5. 如下图所示配置 "Application" 选项卡。

    64 位 ARM Cortex-A53 RTOS 应用程序选项卡
    Application 选项卡上所需的设置


    "Debug Configurations" 对话框中的所有其他选项卡均可保留 默认设置。

  6. 单击 "Debug" 按钮开始调试。 应用程序将 下载到 RAM,调试器会在进入 main() 时中断。 可能 需要在调试窗口中选择正确的 ARM Cortex-A53 内核 以查看正确的源代码,并使用调试 控制件。

    选择 ARM Cortex-A53 内核以调试 RTOS 项目
    在 Debug 窗口中选择 ARM Cortex-A53 # 0 核心



构建说明-使用 SDK 创建基本项目

上一节描述了如何构建 主 FreeRTOS zip 文件下载中的正式 FreeRTOS 项目。 FreeRTOS 还配备了 Xilinx SDK。 本节介绍了如何 使用 SDK 创建 FreeRTOS 项目。

创建新的 FreeRTOS 项目

  1. 选择 "New->Application Project" from the SDK "File" 菜单, 将 出现 "New Project" (新项目)对话框。

    创建新的 RTOS 项目
    选择 "New Application Project" 菜单项


  2. 在“新建项目”对话框中,首先选择 “psu_cortexa53_0” 作为 处理器,然后根据需要选择硬件平台,最后 选择 freertos 作为 OS 平台,然后单击 "Next"。 此时会出现 New Project Templates (新项目模板)对话框。

    创建 Cortex-A53 RTOS 项目所需的新项目设置
    所需的 New Project 对话框设置


  3. 选择 FreeRTOS Hello World 模板,然后单击 "Finish"。 SDK 将创建硬件描述项目、BSP 项目和应用程序 项目。 FreeRTOS 源代码将构建为 BSP 的一部分。

    用于 64 位端口的 RTOS 模板
    选择 FreeRTOS 模板



配置 FreeRTOS BSP

官方 FreeRTOS 演示使用独立的 BSP,并将 FreeRTOS 构建为 应用程序的一部分。 此时,要对 FreeRTOS 进行配置,需手动编辑 FreeRTOSConfig.h 头文件

SDK 创建的项目 (如前所述)会将 FreeRTOS 构建为 BSP 的一部分。 此时, FreeRTOSConfig.h 头文件无需手动编辑,而是要对 FreeRTOS 进行配置, 使用 SDK 环境中的对话框。

  1. 按照上述说明,通过 SDK 创建 FreeRTOS Hello World 应用程序。

  2. 从 SDK 的 “Xilinx Tools” 菜单中选择 "Board Support Package Settings"。 会显示 "Board Support Package Settings" (主板支持包设置)对话框。

  3. 在 "Board Support Package Settings" 对话框的左侧窗格中选择 freertos, 然后使用同一对话框右侧窗格中的表格,根据需要配置 FreeRTOS。

    在 Xilinx SDK 中配置 RTOS
    使用 Board Support Package Settings 对话框配置 FreeRTOS




RTOS配置和使用详情


FreeRTOS ARM Cortex-A 移植特定配置

请注意!请参阅 在 ARM Cortex-A 嵌入式处理器上使用 FreeRTOS 的用户指南页面, 请特别注意 configMAX_API_CALL_INTERRUPT_PRIORITY 设置的值和其含义,以及 关于与 GCC 一起使用浮点单元的特殊说明。

此演示的特定配置项目位于 /FreeRTOS/Demo/CORTEX_A53_64-bit_UltraScale_MPSoC/RTOSDemo_A53/src/FreeRTOSConfig.h您可以编辑此文件中定义的常量,使其适合您的应用程序


中断向量表

默认情况下, SDK 项目会将中断向量表定义为 BSP 的一部分。 这 使得安装 FreeRTOS 处理程序会变得很困难( 如果使用相关页面上提供的关于 在 ARM Cortex-A 嵌入式处理器上运行 FreeRTOS 的方法)。 因此,此演示 在 FreeRTOS_asm_vectors.S 中定义自己的中断向量表。 当调度器启动时, 由 BSP 定义的向量表会被在 FreeRTOS_asm_vectors.S 中定义的向量表自动替换。


[应用程序定义的]中断服务程序

与在 Zynq 7000 上运行 RTOS 时不同,无法重新启用 ARM Cortex-A53 移植中的中断,直到 中断源被清除为止。

此演示使用 Xilinx 提供的驱动器来配置中断控制器, 以及安装应用程序定义的中断。 示例请参见 FreeRTOS/Demo/CORTEX_A53_64-bit_UltraScale_MPSoC/RTOSDemo_A53/src/Full_Demo/IntQueueTimer.c, 其中实现并安装了中断嵌套测试使用的中断服务程序 。

Xilinx 驱动器需要中断 服务程序 (ISR) 来接受 void * 参数,尽管该参数 并不总是使用。 因此,所需的 ISR 原型为:

    void Interrupt_Handler( void *pvUnusedParameter );
如果 ISR 使得一个比当前执行的任务具有相等或更高优先级的任务 离开阻塞状态,则 ISR 必须在退出之前请求 上下文切换。 此时,中断服务程序会中断一个 RTOS 任务, 但会返回到另一个 RTOS 任务。

宏 portYIELD_FROM_ISR()(或 portEND_SWITCHING_ISR())可用于 从 ISR 内请求上下文切换。 请参阅以下源代码片段示例。 ISR 示例 使用直达任务通知以同步任务(未显示),并调用 portYIELD_FROM_ISR(), 以确保中断直接返回到任务。

void Dummy_IRQHandler( void *pvUnusedInThisExample )
{
long lHigherPriorityTaskWoken = pdFALSE;

    /* The parameter is not used in this case. */
    ( void ) pvUnusedInThisExample;

    /* Clear the interrupt if necessary. */
    Dummy_ClearITPendingBit();

    /* This interrupt does nothing more than demonstrate how to synchronise a
    task with an interrupt.  A direct to task notification is used for this
    purpose.  Note lHigherPriorityTaskWoken is initialised to pdFALSE. */
    vTaskNotifyGiveFromISR( xTaskToNotify, &lHigherPriorityTaskWoken );

    /* If the task referenced by xTaskToNotify was blocked waiting for the
    notification, and sending the notification caused the task to unblock, and
    the unblocked task has a priority higher than or equal to the currently
    Running task (the task that this interrupt interrupted), then
    lHigherPriorityTaskWoken will have been set to pdTRUE internally within
    vTaskNotifyGiveFromISR().  Passing pdTRUE into the portYIELD_FROM_ISR() macro
    will result in a context switch being pended to ensure this interrupt returns
    directly to the unblocked, higher priority, task.  Passing pdFALSE into
    portYIELD_FROM_ISR() has no effect. */
    portYIELD_FROM_ISR( lHigherPriorityTaskWoken );
}

只有以 “FromISR” 结尾的 FreeRTOS API 函数可以从 中断服务程序中调用,而且相应中断的优先级必须 小于或等于 configMAX_API_CALL_INTERRUPT_PRIORITY 配置常量设置的 优先级(即数值较高的值)。


FreeRTOS 使用的资源

相关信息请参阅在 ARM Cortex-A 嵌入式处理器上使用 FreeRTOS 页面。 本演示项目被配置为从 TTT 通道生成 tick 中断。


内存分配

此演示使用的 FreeRTOSConfig.h 头文件 均定义了 configSUPPORT_STATIC_ALLOCATION and configSUPPORT_DYNAMIC_ALLOCATION ,此演示对使用的两种方法均做了说明。 Source/Portable/MemMang/heap_4.c 包含在 64 位 ARM Cortex-A53 演示应用程序项目中, 提供使用动态内存分配创建对象时所需的内存分配。 请参阅 API 文档的内存管理部分, 以获取完整信息。


其他事项

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






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