下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

RISC-V RV32M1 VEGAboard 演示(RI5CY 内核)
[RTOS 移植]


RISC-V RV32M1-Vega Pulp RI5CY 内核


本页记录了一个预配置的 FreeRTOS Eclipse/GCC 项目,该项目面向 RISC-V 内核, (在 RV32M1 VEGAboard 上)。 RV32M1 集成了 Pulp RI5CY RISC-V 内核、 Pulp Zero RISCY RISC-V 内核、Arm Cortex-M4 内核以及 Arm Cortex-M0+ 内核。 在撰写本文时,本演示仅针对 RI5CY RISC-V 内核。


重要提示!使用 FreeRTOS Pulp RI5CY RISC-V 移植的注意事项

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

  1. 在 RISC-V 核心上使用 FreeRTOS 的说明
  2. 源代码组织
  3. 演示应用程序功能RTOS
  4. 构建并运行 RTOS 演示应用程序
  5. RTOS 配置和使用详情
另请参阅常见问题:我的应用程序未运行,问题可能出在哪里?

在 RISC-V 核心上使用 FreeRTOS 的说明

如果您不满足于仅仅运行本页所描述的演示,或者 如果想要创建自己的 RISC-V FreeRTOS 项目,请阅读相关文档页面。 这些页面会介绍 在 RISC-V 核心上运行 FreeRTOS 内核的基本信息


源代码组织

FreeRTOS zip 文件下载内容中包含所有 FreeRTOS 移植的源代码及 所有演示应用程序。 这意味着其包含的文件远多于 使用 FreeRTOSVEGAboard RI5CY RISC-V 移植所需的文件。 详情请参见 源代码组织页面,了解 了解 zip 文件的目录结构体信息。 Eclipse 项目 位于 /Demo/RISC-V_RV32M1_Vega_GCC_Eclipse 目录中。 如需了解更多信息, 请参阅下文构建说明 部分。

在 RISC-V 架构上,更多 freertos_risc_v_chip_specific_extensions.h 头文件 用于将基础 RISC-V RTOS 移植扩展到目标 RISC-V 可能实现的任意芯片特定扩展。 RV32M1 VEGAboard 上使用的 RI5CY RISC-V 内核 除了基本 RISC-V 架构定义的寄存器外,还包括六个额外的寄存器, 但不包括 CLINT。 因此,该项目使用 freertos_risc_v_chip_specific_extensions.h 头文件, 该文件位于 /FreeRTOS/Source/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM 目录中。



VEGAboard RI5CY RISC-V 演示应用程序


功能

常量 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY(定义于 main.c 顶部)用于在简单 "blinky" 风格的入门项目 和更全面的测试和演示应用程序之间切换。


mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 1 时

mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 1 时,main() 会调用 main_blinky()main_blinky() 会创建使用两项任务和一个队列的基本示例。
  • 队列发送任务:

    队列发送任务由 prvQueueSendTask() 函数实现。 该任务位于一个循环中, 该循环每 1000 毫秒(1 秒)会发送值 100 至队列。

  • 队列接收任务:

    队列接收任务由 prvQueueReceiveTask() 函数实现。该任务位于一个循环中,阻止 该循环会阻塞读取队列的尝试(任务被阻塞时不会消耗 CPU 周期), 每次从队列发送任务接收到值 100 时, 将 "blink" 写入VEGAboard 的 UART 并切换 LED。 由于队列发送任务每 1000 毫秒向队列写入一次, 因此队列接收任务会每 1000 毫秒解除阻塞 写入 UART,并切换一次 LED。


mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 0 时

mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 0 时,main() 会调用 main_full()main_full() 会实现一个全面测试和演示应用程序,此应用程序会演示和/或 测试(以及其他功能): 创建的任务来自标准演示 集。 所有 FreeRTOS 移植演示应用程序都使用标准演示任务。 这些任务没有特定的功能,创建它们仅为演示如何使用 FreeRTOS API 以及测试 RTOS 移植。

创建“检查”任务,用于定期检查标准 演示任务(包含自我监控代码),以确保所有任务 都按预期运行。 检查任务切换 LED,并在每次执行时 向 UART 输出“.”字符或错误消息。 这为系统运行状况提供了 视觉反馈。 如果 LED 每 3 秒切换一次,则 检查任务未发现任何问题。 如果 LED 每 500 毫秒切换一次,则表明检查任务 已在至少一个任务中发现问题。 UART 将输出错误消息,而不是“.”。


构建和调试演示应用程序

重要提示: 如果目录结构体与 在官方 FreeRTOS zip 文件版本中使用的目录结构体不同,则不会构建项目。 确保在将项目导入 Eclipse 工作区时, 勾选 "copy projects into workspace" 复选框。

要打开并构建 RI5CY 项目:

  1. 请按照 open-isa.org 网站上的说明,安装 必要的 GCC、OpenOCD 和 Eclipse 开发工具, 并将主计算机(运行开发工具的计算机)连接到目标硬件(VEGAboard)。 有关使用相关工具配置 Eclipse 环境的更详细说明, 请参见此 open-isa guide

  2. 启动 Eclipse,根据提示选择现有工作区, 或创建新的工作区。

  3. 在 Eclipse 的 "File" 菜单中选择 "Import"。 "Import" 对话框 随即打开。

  4. 在 "Import" 对话框中,选择 "General->Existing Project into Workspace"。 "Import Projects" 对话框随即打开。


    将现有项目导入工作区

  5. 在 "Import Projects" 对话框中, 导航到 FreeRTOS/Demo/RISC-V_RV32M1_Vega_GCC_Eclipse/projects/RTOSDemo_ri5cy 并选中该目录,确保不勾选 "copy projects into workspace" 复选框


    在 "Import Project" 对话框中选择 目录和项目。 点击放大。

  6. 在 "Import Projects" 对话框的 "Projects" 窗口中,选择 RTOSDemo_ri5cy 项目,然后点击 "Finish"。

  7. 在 Eclipse 的 "Project" 菜单中选择 "Rebuild All"。 项目的构建 应不会出现任何错误或警告,并输出名为 RTOSDemo_ri5cy.elf 的文件。

  8. 最后,要启动调试会话,在 Eclipse 项目浏览器中请右键单击 "RTOSDemo_ri5cy.launch" 文件, 然后从弹出菜单中选择 "Debug As->RTOSDemo_ri5cy" 。


    右击“>RTOSDemori5cy.launch”后, 在弹出的窗口中选择 "Debug As-RTOSDemo_ri5cy"。 点击放大。



配置和用法详情

RTOS 移植的特定配置

本节内容与在 RISC-V 核心上运行 FreeRTOS 的文档页面信息相关。
  • 此演示的特定配置项目位于 FreeRTOS/Demo/RISC-V_RV32M1_Vega_GCC_Eclipse/projects/RTOSDemo_ri5cy/FreeRTOSConfig.h 中。 编辑 该文件中定义的常量,确保适配您的应用程序。 尤其是 configCLINT_BASE_ADDRESSconfigMTIMECMP_BASE_ADDRESS 设置为 0,因为 VEGAboard 上的 RI5CY 内核不包括定时器 (MTIMER)。

  • 除 基础 RISC-V 架构定义的寄存器之外,RI5CY 内核还有六个额外的寄存器。 这些寄存器 由 freertos_risc_v_chip_specific_extensions.h 头文件中包含的宏保存和恢复, 该文件位于 /FreeRTOS/Source/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM 目录下, 因此该目录在汇编器的包含路径中。

  • VEGAboard 软件开发套件 (SDK) 中提供的中断处理程序 称为 SystemIrqHandler(),因此汇编器的命令行选项包括 -DportasmHANDLE_INTERRUPT=SystemIrqHandler

  • VEGAboard 包括矢量中断控制器。 文件 FreeRTOS_startup_RV32M1_ri5cy.Sstartup_RV32M1_ri5cy.S 的编辑版本,该文件将 FreeRTOS 陷阱处理程序 设置为每个矢量的中断处理程序。 FreeRTOS 陷阱处理程序称为 freertos_risc_v_trap_handler()

  • 文件 RV32M1_ri5cy_flash.ld 是随开发板 一起提供的链接器脚本的一个版本,经过编辑,添加了 __freertos_irq_stack_top 链接器变量, 以确保在调度器启动之前由 main 使用的堆栈 在调度器启动后重新用作中断堆栈。

其他注意事项:

  • vPortEndScheduler() 尚未实现。

  • Source/Portable/MemMang/heap_4.c 包含在 RISC-V 项目中,以提供 RTOS 内核所需的内存分配。 请参阅 API 文档的内存管理部分, 获取完整信息。

  • 截至本文撰写之际,此演示尚不支持中断嵌套。



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